【坑爹微信】微信开发基础 --- 微信快捷登陆问题解决
目錄 List
導語
微信快捷登陸是基于OAuth2.0 (如果想深入了解,點擊查看博主的另一篇博文)和OPenid 等多種機制融合在一起的一種第三方授權(quán)協(xié)議接口的簡稱。
引用微信自己的話來講快捷登陸的作用就是:如果用戶在微信客戶端中訪問第三方網(wǎng)頁,公眾號可以通過微信網(wǎng)頁授權(quán)機制,來獲取用戶基本信息,進而實現(xiàn)業(yè)務邏輯
簡而言之就是拿著微信客戶的資料入我們自己的系統(tǒng)完成我們自己的業(yè)務邏輯,這樣做的好處是減少了用戶注冊登陸等環(huán)節(jié)的麻煩事,并且基于微信內(nèi)置游覽器能很好的延展我們要展現(xiàn)的業(yè)務功能,使操作流暢度增加。
微信開發(fā)前準備
這點準備其實你完全可以參考微信開發(fā)者文檔
反正最后你得擁有以下這些:
注意: 1和2是最基礎(chǔ)的,你一定要有。后面的可以慢慢申辦。
微信快捷登陸
終于說到正題了
首先我們要了解微信快捷登陸的步驟
1 第一步:用戶同意授權(quán),獲取code
2 第二步:通過code換取網(wǎng)頁授權(quán)access_token
3 第三步:拉取用戶信息(需scope為 snsapi_userinfo)
其實你完全可以參考微信開發(fā)者文檔
我現(xiàn)在直接將實施步驟,直接上代碼
第一步:用戶同意授權(quán),獲取code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“該鏈接無法訪問”,請檢查參數(shù)是否填寫錯誤,是否擁有scope參數(shù)對應的授權(quán)作用域權(quán)限。
warning “: 尤其注意:由于授權(quán)操作安全等級較高,所以在發(fā)起授權(quán)請求時,微信會對授權(quán)鏈接做正則強匹配校驗,如果鏈接的參數(shù)順序不對,授權(quán)頁面將無法正常訪問
//拼接跳轉(zhuǎn)地址 $oauthUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->config['wechat_appid'] . '&redirect_uri=' . urlencode($customeUrl) . '&response_type=code&scope=snsapi_userinfo&state=' . $_SESSION['weixin']['state'] . '#wechat_redirect'; //跳轉(zhuǎn)換code header('Location:'.$oauthUrl);注意這里面的可選參數(shù)state,雖然微信官方標注這個state是可選參數(shù),但是事實告訴我,這個參數(shù)是必須加的,因為蘋果手機的防火墻會自動先進行一次請求,會讓你的code被使用而過期,所以只有驗證你給state是否是你當前給的再使用code才是正確的步驟,那么代碼改成:
//真正意義上的超全局變量$GLOBALS['_SESSION']['weixin']['state'] = md5(uniqid());//先正則匹配掉以前客戶端可能存下的code$customeUrl = preg_replace('#&code=(\\w+)#', '', $this->config['site_url'] . $_SERVER['REQUEST_URI']);//拼接出要跳轉(zhuǎn)的URL來給微信(這里的state狀態(tài)值必須還是填上,因為蘋果手機的防火墻會自動先進行一次請求,會讓你的code被使用而過期)$oauthUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $this->config['wechat_appid'] . '&redirect_uri=' . urlencode($customeUrl) . '&response_type=code&scope=snsapi_userinfo&state=' . $_SESSION['weixin']['state'] . '#wechat_redirect';//進行下一步跳轉(zhuǎn)header('Location:'.$oauthUrl);第二步:通過code換取網(wǎng)頁授權(quán)access_token
首先請注意,這里通過code換取的是一個特殊的網(wǎng)頁授權(quán)access_token,與基礎(chǔ)支持中的access_token(該access_token用于調(diào)用其他接口)不同。公眾號可通過下述接口來獲取網(wǎng)頁授權(quán)access_token。如果網(wǎng)頁授權(quán)的作用域為snsapi_base,則本步驟中獲取到網(wǎng)頁授權(quán)access_token的同時,也獲取到了openid,snsapi_base式的網(wǎng)頁授權(quán)流程即到此為止。
//只有帶state的請求才是正式請求所以要先判斷if (isset($_GET['code']) && isset($_GET['state']) && ($_GET['state'] == $GLOBALS['_SESSION']['weixin']['state'])) {unset($_SESSION['weixin']);//根據(jù)拿的code來拿access_token$return = $this->https_request('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->config['wechat_appid'] . '&secret=' . $this->config['wechat_appsecret'] . '&code=' . $_GET['code'] . '&grant_type=authorization_code');$jsonrt = $return;第三步:拉取用戶信息(需scope為 snsapi_userinfo)
如果網(wǎng)頁授權(quán)作用域為snsapi_userinfo,則此時開發(fā)者可以通過access_token和openid拉取用戶信息了。
$url='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';//通過access_token和openid調(diào)用此接口獲得用戶詳細信息$res=$this->https_request($url);//下方寫上你的業(yè)務邏輯到這里整個流程走完。
獲取整段代碼可以加qq 1577452412
出現(xiàn)問題的解決
我們排查錯誤先從前端表現(xiàn)來說
如果你還沒有出現(xiàn)微信授權(quán)頁面,那就是第一步就錯了
如果你出現(xiàn)了授權(quán)頁面,但是點擊后有錯誤那就是卡在第二步后面
第一步出錯的:
請排查
1.APPID是否對應當前公眾號
2.REDIRECT_URI 是否是正確的url 里面有沒有亂碼或者有沒有屏蔽掉&code這樣的參數(shù)
3.snsapi_userinfo 只有這種模式的登陸才能出現(xiàn)快捷登陸授權(quán)頁面
上面所有方法的調(diào)試都很簡單就是直接打印出當前的請求url 看看到底是啥
第二步出錯的:
請排查
1.SECRET 是否是當前公眾號的
2. CODE 是否過期(code只能使用一次,5分鐘未被使用自動過期。 )
3. 必須保證跳轉(zhuǎn)url完整 檢查state=STATE 這個有沒有漏掉
以上調(diào)試的方法直接打印請求結(jié)果就可以了
第三步出錯的:
1.access_token是否有效
以上方法請參考 驗證access_token
所有問題都可以加qq 1577452412來問我,共同進步
總結(jié)
以上是生活随笔為你收集整理的【坑爹微信】微信开发基础 --- 微信快捷登陆问题解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【坑爹微信】总有一款接口能坑你到吐血 -
- 下一篇: 【坑爹微信】微信JSSDK图片上传问题和