yershop商城系統Thinkphp開發(四)——微信篇1:微信公眾號靜默授權註冊及獲取使用者資訊
阿新 • • 發佈:2019-01-15
微信登陸包括兩部分:1.常用的靜默授權;2.獲取使用者身份資訊
開發環境:
Thinkphp3.2.3beta+onethink、yershop
新浪SAE伺服器,點此註冊
認證微信服務號
靜默授權
基礎配置
1.認證微信服務號
2.介面許可權:網頁賬號,填寫自己要使用的域名(www.abc.com這樣的)
3.伺服器後臺新增配置欄位:C(‘DOMAIN’) C(‘APPID’) C(‘AppSecret’),在程式碼中呼叫
C(‘DOMAIN’),在yershop後臺中為自動獲取的域名地址
C(‘APPID’),公眾平臺應用ID
C(‘AppSecret’),公眾平臺金鑰
獲取code核心程式碼
//獲取code程式碼
function createOauthUrlForCode($redirectUrl)
{
//lifan
$param ['appid'] =C('APPID');
$param ['redirect_uri'] = $redirectUrl. '&getOpenId=1';
$param ['response_type'] = 'code';
$param ['scope'] = 'snsapi_base';
$param ['state' ] = 123;
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query ( $param ) . '#wechat_redirect';
return $url;
}
獲取openid核心程式碼
function getOpenid()
{
$urlObj["appid"] = C('APPID');
$urlObj["secret"] = C('AppSecret');
$urlObj["code" ] = I ( 'code' );
$urlObj["grant_type"] = "authorization_code";
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . http_build_query ( $urlObj );
//初始化curl
$ch = curl_init();
//設定超時
curl_setopt($ch, CURLOP_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//執行curl,結果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
return $data['openid'];
}
獲取使用者資訊
獲取並儲存基礎access_token
/**
* 獲取基礎 accesstoken
* 7200秒過時
* sae不可寫,保存於資料庫中
* at表字段:id,accesstoken,lasttime
*/
function getAccesstoken(){
$param['grant_type'] = 'client_credential';
$param['appid'] = C("APPID");
$param['secret'] = C("SECRET");
$lastAT = M('at')->find(1);
$accesstoken = $lastAT['accesstoken'];
if(!$lastAT){
M('at') -> add(array('id'=>1,'accesstoken'=>'null','lasttime'=>0));
$lastAT['lasttime'] = 0;
}
$now = NOW_TIME;
$timecha = $now - $lastAT['lasttime'];
if($timecha > 7200){
$url = 'https://api.weixin.qq.com/cgi-bin/token?' . http_build_query ( $param );
$content = file_get_contents ( $url );
$content = json_decode ( $content, true );
$data['accesstoken'] = $content['access_token'];
$data['lasttime'] = NOW_TIME;
M('at')->where(array('id'=>1))->save($data);
$accesstoken = $content['access_token'];
}
return $accesstoken;
}
獲取使用者資訊
/**
* 獲取使用者基本資訊
* openid:使用者的openid。使用者與公眾號唯一身份標識
* 若使用者未關注公眾號,無法獲取詳細資訊
*/
function getWeixinInfo($openid) {
$isWeixinBrowser = isWeixinBrowser ();
if(!$isWeixinBrowser){
return;
}
$param['access_token'] = getAccesstoken();
$param['openid'] = $openid;
$param['lang'] = 'zh_CN';
$url = 'https://api.weixin.qq.com/cgi-bin/user/info?' . http_build_query ( $param );
$content = file_get_contents ( $url );
$content = json_decode ( $content, true );
return $content;
}
其它函式
// 判斷是否是在微信瀏覽器裡
function isWeixinBrowser() {
$agent = $_SERVER ['HTTP_USER_AGENT'];
if (! strpos ( $agent, "icroMessenger" )) {
return false;
}
return true;
}
/**
* ? or &
* @param 原始地址 $urls
* @param 新增引數 $parm
* @param 引數值 $value
* @return 帶? 或 & 的引數
*/
function addurl($urls,$parm,$value=""){
if(!strstr($urls, '?')){
$adds = "?".$parm."=".$value;
}else{
$adds = "&".$parm."=".$value;
}
return $adds;
}
完整的微信登陸註冊流程實現
功能均實現在一個方法裡,請仔細按照序號檢視流程
public function weilogin($url = '') {
/*(1)非微信瀏覽器,退回到普通登陸頁*/
if(!isWeixinBrowser()){
redirect ( U ( '/wap/user/login' ) );
}
$openid = I('get.openid');
$Member = D ( "Member" );
/*(2)判斷是否已經獲取到了openid,否第(3)步*/
if ($openid) {
/*(6)獲取到了openid,判斷member表是否存入使用者的openid。存:非第一次註冊登陸;沒存:第一次註冊登陸*/
$weiuserinfo = M('member')->where (array('openid' => $openid))->find ();
/*(7)有使用者資訊:非第一次註冊登陸*/
if ($weiuserinfo) {
if ($Member->login ( $weiuserinfo ['uid'] )) { // 登入使用者
//在登陸前的頁面,設定cookie('api_redirect',U('Index.index'))資訊
$urls = cookie ( 'api_redirect' );
//登入成功,跳轉返回
redirect($urls);
}else {
//登入異常,回到普通登陸頁面
$this->error ( '登入超時!', U ( "/wap/user/login" ) );
}
} else {
/*(8)沒有存入使用者openid:第一次註冊登陸*/
/*根據openid獲取微信使用者資訊*/
$weiData = getWeixinInfo($openid);
if (!empty($weiData['nickname'])){
//設定使用者名稱為使用者微信暱稱
$username=$weiData['nickname'];
}else{
/*當用戶未關注無法拉取使用者資訊時,為使用者起名為當前時間戳。也可以提示使用者關注公眾號,否則就普通登陸*/
$username=NOW_TIME;
}
//進行重名檢測,使用者暱稱若重名,之後資料表也無法新增使用者資訊
$ischong = M('ucenter_member')->where(array('username'=>$username))->find();
if($ischong>0){
//發現有重複使用者名稱,命名為暱稱+時間戳,避免重名
$username = $username.NOW_TIME;
}
/* 呼叫註冊介面註冊使用者 */
$User = new UserApi ();
// 返回ucentermember資料表使用者主鍵id;設定預設密碼:123456
$uid = $User->register ( $username, '123456' );
if (0 < $uid) { // UC登入成功
/* 登入使用者;D('Member')->login此操作實現向member表新增記錄*/
if ($Member->login ( $uid, $_GET ['openid'] )) {
/*(9)登陸成功,回到設定的頁面*/
redirect(cookie ( 'api_redirect' ));
}
} else {
//ucenter_member表註冊失敗,跳轉到普通登陸頁
$this->error ( '登入超時!', U ( "/wap/user/login" ) );
}
}
} else {
/*(3)實現微信登陸獲取openid*/
if (! is_login ()) {
$getopenId = I('get.getOpenId');
$state = I('get.state');
//此處組連結一定要細心,否則報redirect_uri錯誤資訊。不要用手寫的url
$urls = C ( 'DOMAIN' ) . U ( "/Wap/User/weilogin" );
/*(4)實現微信登陸第一步獲取code,返回的連結引數含有$getopenId、$state資訊*/
if (!$getopenId){
$url = substr ( $urls, 0, - 5 );//該操作將去掉.html
// var_dump($url); //必要時檢驗
$urlforcode = createOauthUrlForCode($url);
redirect($urlforcode);
}elseif($state){
/*(5)實現微信登陸第二步獲取openid,返回openid;重新訪問本函式,帶上openid*/
$openid = getOpenId();
redirect ( $urls . addurl($callback, "openid",$openid));
}
}
}
}
至此,微信登陸篇完成。
出處:blog.csdn.net/afanxingzhou
Q724122005
專案示例:www.kateqi.cn
承接中小型專案開發