PHP實(shí)現(xiàn)網(wǎng)站應(yīng)用微信登錄功能詳解
本文實(shí)例講述了PHP實(shí)現(xiàn)網(wǎng)站應(yīng)用微信登錄功能。分享給大家供大家參考,具體如下:
背景
- 近期進(jìn)行 PC 端的網(wǎng)站開(kāi)發(fā),需要用到微信授權(quán)登錄,考慮到前期手機(jī)端已經(jīng)獲得了大量的微信用戶群,現(xiàn)在想著進(jìn)行資源整合,滿足同一個(gè)微信用戶的數(shù)據(jù)同步
一、開(kāi)發(fā)須知
1.概念區(qū)分
- 因?yàn)榻佑|到微信開(kāi)發(fā)的知識(shí),必然會(huì)接觸
OpenID
與UnionID
的使用,以下為微信官方文檔的的介紹,請(qǐng)注意區(qū)分:
- 在關(guān)注者與公眾號(hào)產(chǎn)生消息交互后,公眾號(hào)可獲得關(guān)注者的
OpenID
(加密后的微信號(hào),每個(gè)用戶對(duì)每個(gè)公眾號(hào)的OpenID
是唯一的。對(duì)于不同公眾號(hào),同一用戶的OpenID
不同)。- 公眾號(hào)可通過(guò)相應(yīng)接口來(lái)根據(jù)
OpenID
獲取用戶基本信息,包括昵稱(chēng)、頭像、性別、所在城市、語(yǔ)言和關(guān)注時(shí)間。- 請(qǐng)注意,如果開(kāi)發(fā)者有在多個(gè)公眾號(hào),或在公眾號(hào)、移動(dòng)應(yīng)用之間統(tǒng)一用戶帳號(hào)的需求,需要前往微信開(kāi)放平臺(tái)(
open.weixin.qq.com
)綁定公眾號(hào)后,才可利用UnionID
機(jī)制來(lái)滿足上述需求。
- 簡(jiǎn)單概括來(lái)講:
OpenID
是普通用戶的標(biāo)識(shí),對(duì)當(dāng)前開(kāi)發(fā)者帳號(hào)唯一。一個(gè)OpenID
對(duì)應(yīng)一個(gè)公眾號(hào)。UnionID
是用戶統(tǒng)一標(biāo)識(shí)。針對(duì)一個(gè) 微信開(kāi)放平臺(tái)帳號(hào) 下的應(yīng)用,同一用戶的UnionID
是唯一的。
2.歸納整理
- 繞了這個(gè)圈,也就是說(shuō),微信公眾號(hào)開(kāi)發(fā)與微信開(kāi)發(fā)平臺(tái)開(kāi)發(fā)是有差別的
- 想讓同一個(gè)微信用戶使用不同平臺(tái)(如PC端、app、微信小程序等)的網(wǎng)站登錄,需要進(jìn)行賬號(hào)綁定,而這個(gè)綁定的賬號(hào)不能以
OpenID
區(qū)分,而需要用UnionID
區(qū)分。
3.典型問(wèn)題
- 附錄一個(gè)常見(jiàn)的設(shè)計(jì)問(wèn)題,主要在于開(kāi)發(fā)前的知識(shí)使用不夠全面,而造成后續(xù)拓展的影響,當(dāng)然,這也是我遇到的問(wèn)題,希望可以給各位敲個(gè)警鐘。
所以:當(dāng)你出現(xiàn)這種情況,可以參考下面的指導(dǎo)進(jìn)行 unionID
數(shù)據(jù)的后期獲取 獲取用戶基本信息(UnionID機(jī)制)
- 個(gè)人參考代碼如下:
/** * 根據(jù)用戶已獲得的 openID 獲取其他信息 (主要為 unionID) */ public function getUnionidByOpenid($openID = ''){ $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" .$this->getaccesstoken() ."&openid=".$openID."&lang=zh_CN"; $jsonRes = $this->http_get($url); if ($jsonRes){ $arrRes = json_decode($jsonRes, true); return $arrRes['unionid']; }else{ return ''; } }
二、微信開(kāi)放平臺(tái)操作
1.簡(jiǎn)要引導(dǎo)
-
根據(jù)在下的需求,選擇了“網(wǎng)站應(yīng)用開(kāi)發(fā)” 的創(chuàng)建,然后按照官方提示進(jìn)行材料的申請(qǐng),一般需要三天以上
-
可以注意到,
網(wǎng)站應(yīng)用開(kāi)發(fā)
的簡(jiǎn)要功能介紹
-
當(dāng)應(yīng)用創(chuàng)建通過(guò)后,必須還要滿足接口權(quán)限的獲取,會(huì)有工作人員主動(dòng)聯(lián)系,一般一天就能完成
2.官方提供的場(chǎng)景參考
3.綁定公眾賬號(hào)/小程序
為了保證同一個(gè)開(kāi)發(fā)賬號(hào)下對(duì)應(yīng)微信用戶的 UnionID 綁定使用,需要在下面的列表中綁定對(duì)應(yīng)的公眾號(hào)/服務(wù)號(hào),文檔中介紹一般要滿足微信支付功能
4.授權(quán)獲取 access_token
時(shí)序圖
三、代碼實(shí)現(xiàn)
- 其實(shí),主要的時(shí)間都花費(fèi)在了前期的申請(qǐng)操作上,而真正的代碼實(shí)現(xiàn)卻是極為簡(jiǎn)單,以下是我的實(shí)現(xiàn)方式,敬請(qǐng)指摘
1、公共文件配置
- 習(xí)慣主要的配置信息同意放在了配置文件中,‘\Application\Common\Conf\config.php'。
'WEIXIN_LOGIN' => array( // 微信開(kāi)放平臺(tái) 使用微信帳號(hào)登錄App或者網(wǎng)站 配置信息 'OPEN_APPID' => 'wxbd961b2a6b7b2963', //應(yīng)用 AppID 'OPEN_APPSECRET' => 'e6xxxxxxxxxxxxxxxxxxxxe90',//應(yīng)用 AppSecret 'OPEN_CALLBACKURL' => 'http://www.52zhenmi.com/Home/Login/wxBack', //微信用戶使用微信掃描二維碼并且確認(rèn)登錄后,PC端跳轉(zhuǎn)路徑 ),
2.核心代碼
- 具體代碼,請(qǐng)參考路徑 “zmPro\Application\Home\Controller\LoginController.class.php”
public function wxIndex(){ //--微信登錄-----生成唯一隨機(jī)串防CSRF攻擊 $state = md5(uniqid(rand(), TRUE)); $_SESSION["wx_state"] = $state; //存到SESSION $callback = urlencode($this->callBackUrl); 'https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect'; $wxurl = "https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=" .$this->appID."&redirect_uri=" .$callback."&response_type=code&scope=snsapi_login&state=" .$state."#wechat_redirect"; header("Location: $wxurl"); } public function wxBack(){ if($_GET['state']!=$_SESSION["wx_state"]){ echo 'sorry,網(wǎng)絡(luò)請(qǐng)求失敗...'; exit("5001"); } $url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->appID.'&secret='.$this->appSecret.'&code='.$_GET['code'].'&grant_type=authorization_code'; $arr = curl_get_contents($url); //得到 access_token 與 openid $url='https://api.weixin.qq.com/sns/userinfo?access_token='.$arr['access_token'].'&openid='.$arr['openid'].'&lang=zh_CN'; $user_info = curl_get_contents($url); $this->dealWithWxLogin($user_info); } /** * 根據(jù)微信授權(quán)用戶的信息 進(jìn)行下一步的梳理 * @param $user_info */ public function dealWithWxLogin($user_info){ //TODO 數(shù)據(jù)處理 var_dump($user_info); die; }
3.前端顯示
- 根據(jù)官方文檔的介紹,既可以直接訪問(wèn)授權(quán)掃碼界面,也可以進(jìn)行自定義設(shè)計(jì)
- 估計(jì)本人腦抽,嵌套登錄掃碼的功能整了半天也沒(méi)實(shí)現(xiàn),在此只好使用默認(rèn)跳轉(zhuǎn)。
-
通過(guò)點(diǎn)擊上圖中的微信圖標(biāo),直接跳轉(zhuǎn)如下鏈接
https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=wxbd961b2a6b7b2963&redirect_uri=http%3A%2F%2Fwww.52zhenmi.com%2FHome%2FLogin%2FwxBack&response_type=code&scope=snsapi_login&state=204b244a5051207d1987a95f4a7e42c1#wechat_redirect -
顯示效果如下:
- 掃描登錄成功后進(jìn)行頁(yè)面跳轉(zhuǎn)
四、總結(jié)
- 小程序官方提供了 UnionID機(jī)制說(shuō)明,可進(jìn)行對(duì)比參考
-
網(wǎng)上看到一篇不錯(cuò)的文章,建議參考:微信公眾號(hào)用戶與網(wǎng)站用戶的綁定方案
-
總結(jié)小點(diǎn):
- 1.根據(jù)上面功能實(shí)現(xiàn)的最后,可以獲取登錄用戶的信息,而其中的
openID
和UnionID
可存儲(chǔ)數(shù)據(jù)庫(kù)進(jìn)行后期業(yè)務(wù)的處理.- 2.在下闡述能力有限,建議多參考官方開(kāi)發(fā)文檔,谷歌前輩的干貨經(jīng)驗(yàn)…
附錄
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP微信開(kāi)發(fā)技巧匯總》、《php curl用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP中json格式數(shù)據(jù)操作技巧匯總》及《PHP針對(duì)XML文件操作技巧總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
老版本PHP轉(zhuǎn)義Json里的特殊字符的函數(shù)
本文給大家分享的是一則在老版本的php里使用的PHP轉(zhuǎn)義Json里的特殊字符的函數(shù),雖然不是很實(shí)用了,但還是記錄一下,有需要的小伙伴可以參考下。2015-06-06PHP實(shí)現(xiàn)創(chuàng)建以太坊錢(qián)包轉(zhuǎn)賬等功能
這篇文章主要介紹了PHP實(shí)現(xiàn)創(chuàng)建以太坊錢(qián)包轉(zhuǎn)賬等功能,對(duì)以太坊感興趣的同學(xué),可以參考下2021-04-04jquery+php+ajax顯示上傳進(jìn)度的多圖片上傳并生成縮略圖代碼
這篇文章主要介紹了jquery+php+ajax顯示上傳進(jìn)度的多圖片上傳并生成縮略圖代碼,可實(shí)現(xiàn)帶有進(jìn)度條效果的多圖上傳功能與生成縮略圖功能,是web開(kāi)發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10php將12小時(shí)制轉(zhuǎn)換成24小時(shí)制的方法
這篇文章主要介紹了php將12小時(shí)制轉(zhuǎn)換成24小時(shí)制的方法,涉及php時(shí)間操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03php 修改、增加xml結(jié)點(diǎn)屬性的實(shí)現(xiàn)代碼
php修改xml結(jié)點(diǎn)屬性,增加xml結(jié)點(diǎn)屬性的代碼,有需要的朋友可以參考下2013-10-10php中實(shí)現(xiàn)可以返回多個(gè)值的函數(shù)實(shí)例
這篇文章主要介紹了php中實(shí)現(xiàn)可以返回多個(gè)值的函數(shù),實(shí)例分析了php使用數(shù)組返回多個(gè)值的技巧,需要的朋友可以參考下2015-03-03一道求$b相對(duì)于$a的相對(duì)路徑的php代碼
這是一段計(jì)算兩個(gè)路徑的相對(duì)路徑的php代碼,需要的朋友可以參考下。2010-08-08PHP函數(shù)按引用傳遞參數(shù)及函數(shù)可選參數(shù)用法示例
這篇文章主要介紹了PHP函數(shù)按引用傳遞參數(shù)及函數(shù)可選參數(shù)用法,結(jié)合實(shí)例形式分析了php函數(shù)的引用傳參與可選參數(shù)具體使用技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06