微信公眾號網(wǎng)頁授權(quán)

作者:辰風(fēng)沐陽 閱讀:2694 發(fā)布時間:2021-06-26 上次更新:2021-06-27

1. 前言


網(wǎng)頁授權(quán)官方文檔

2. 第一步:用戶同意授權(quán),獲取 code


引導(dǎo)用戶打開授權(quán)頁面

下面是微信官方給出的授權(quán)地址,以下 url 中大寫的參數(shù)值代表的動態(tài)參數(shù),需要開發(fā)者去傳參,小寫的參數(shù)值代表固定值,無需動態(tài)修改

appid:公眾號 appid
redirect_uri: 用戶同意授權(quán)后的回調(diào)地址
scope:授權(quán)作用域,可取值:snsapi_base、snsapi_userinfo

snsapi_base 不彈出授權(quán)頁面,只能獲取到用戶openid
snsapi_userinfo 彈出授權(quán)頁面,可獲取到用戶openid、昵稱、頭像等信息

  1. https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

用戶同意授權(quán)后將跳轉(zhuǎn)到授權(quán)地址中的 redirect_uri 回調(diào)地址,并且攜帶 code 和 state 兩個參數(shù)

  1. redirect_uri/?code=CODE&state=STATE

在 tp6.0 中的使用示例

  1. public function index()
  2. {
  3. // 公眾號appid
  4. $appid = 'wx0a48233ca8de759e';
  5. // 回調(diào)地址
  6. $redirect_uri = url('grant', [], true, true);
  7. // 對回調(diào)地址進(jìn)行url編碼
  8. $redirect_uri = urlencode($redirect_uri);
  9. // 授權(quán)作用域
  10. $scope = 'snsapi_base、snsapi_userinfo'; // snsapi_base、snsapi_userinfo
  11. // 授權(quán)頁面
  12. $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appid}&redirect_uri={$redirect_uri}&response_type=code&scope={$scope}&state=STATE#wechat_redirect";
  13. // 跳轉(zhuǎn)到授權(quán)頁面讓用戶授權(quán)
  14. return redirect($url);
  15. }

3. 第二步:通過code換取網(wǎng)頁授權(quán) access_token (網(wǎng)頁授權(quán)接口調(diào)用憑證)


snsapi_base、snsapi_userinfo 返回的內(nèi)容格式一樣,只是 scope 為各自相應(yīng)的值

  1. {
  2. "access_token":"46_F7gxRgt-dgY7SWa43sX8xxxx",
  3. "expires_in":7200,
  4. "refresh_token":"46_a-XaTkDiL5e47vEYVa3emUjMxxx",
  5. "openid":"ozlgE6DGcfpHE1Qz69U9xKQtsRkw",
  6. "scope":"snsapi_userinfo"
  7. }

特別注意:snsapi_base 式的網(wǎng)頁授權(quán)流程到此為止

4. 第三步:刷新 access_token (網(wǎng)頁授權(quán)接口調(diào)用憑證)


5. 第四步:拉取用戶信息


根據(jù)第二步或第三步獲取到的 access_tokenopenid 獲取用戶信息

  1. $openid = $res['openid'];
  2. $access_token = $res['access_token'];
  3. $api = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$openid}&lang=zh_CN";
  4. $info = $this->http_curl($api);
  5. halt($info);

返回示例

  1. ^ array:9 [▼
  2. "openid" => "ozlgE6DGcfpHE1Qz69U9xKQtsRkw"
  3. "nickname" => "liang"
  4. "sex" => 1
  5. "language" => "zh_CN"
  6. "city" => "開封"
  7. "province" => "河南"
  8. "country" => "中國"
  9. "headimgurl" => "https://thirdwx.qlogo.cn/mmopen/vi_32/L3D1cS26ogySia7UNlTScztBicIWYFhSzzUnXalicpaYCJAia4oewvGgVw0qCZ58t8eqcb2FsBYTN2wiaiasiabDkHfWg/132"
  10. "privilege" => []
  11. ]

6. 網(wǎng)頁授權(quán)常見錯誤


一、提示微信客戶端打開鏈接

因?yàn)榫W(wǎng)頁授權(quán)是要獲取微信用戶的信息,所以必須在微信瀏覽器中打開授權(quán)頁面(微信客戶端:手機(jī)端PC端微信瀏覽器

二、Scope 參數(shù)錯誤或沒有 Scope 權(quán)限

可能的原因如下:

1、 使用的是個人訂閱號,訂閱號沒有權(quán)限使用網(wǎng)頁授權(quán)

2、使用的服務(wù)號,沒有認(rèn)證或認(rèn)證已過期

三、redirect_uri 參數(shù)錯誤

授權(quán)回調(diào)頁面域名配置錯誤,登陸公眾號平臺,在 “設(shè)置與開發(fā)-公眾號設(shè)置-功能設(shè)置-網(wǎng)頁授權(quán)域名” 中檢查域名配置是否正確

標(biāo)簽: 微信公眾號