微信登錄包括兩部分:1.經常使用的靜默受權;2.獲取用戶身份信息
開發環境:
Thinkphp3.2.3beta+onethink、yershop
新浪SAE服務器,點此註冊
認證微信服務號php
微信公衆號受權登錄有兩種,經常使用的一種爲靜默受權snsapi_base。下面講它的實現代碼
開發文檔:http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html
目標:獲取用戶openid
假設個人微信登錄地址爲 Wap/User/wxlogin()方法html
1.認證微信服務號
2.接口權限:網頁帳號,填寫本身要使用的域名(www.abc.com這樣的)
3.服務器後臺添加配置字段:C(‘DOMAIN’) C(‘APPID’) C(‘AppSecret’),在代碼中調用
C(‘DOMAIN’),在yershop後臺中爲自動獲取的域名地址
C(‘APPID’),公衆平臺應用ID
C(‘AppSecret’),公衆平臺密鑰數據庫
//獲取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; }
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']; }
/** * 獲取基礎 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; }
功能均實如今一個方法裏,請仔細按照序號查看流程json
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 api