本篇主要是在上一篇獲取第三方憑證基礎上,用戶通過三方網站自定義授權登錄后獲取用戶信息,以實現用戶綁定登錄功能。
構造第三方應用授權鏈接
如果第三方應用需要在打開的網頁里面攜帶用戶的身份信息,
第一步需要構造如下的鏈接來獲取授權code。
請求方式
GET
請求地址
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
參數說明
參數 | 必須 | 說明 |
appid | 是 | 第三方應用id(即ww或wx開頭的suite_id)。注意與企業的網頁授權登錄不同 |
redirect_uri | 是 | 授權后重定向的回調鏈接地址,請使用urlencode對鏈接進行處理 ,注意域名需要設置為第三方應用的可信域名 |
response_type | 是 | 返回類型,此時固定為:code |
scope | 是 | 應用授權作用域。 snsapi_base:靜默授權,可獲取成員的基礎信息(UserId與DeviceId); snsapi_privateinfo:手動授權,可獲取成員的詳細信息,包含頭像、二維碼等敏感信息。 |
state | 否 | 重定向后會帶上state參數,企業可以填寫a-zA-Z0-9的參數值,長度不可超過128個字節 |
#wechat_redirect | 是 | 固定內容 |
企業員工點擊后,頁面將跳轉至 redirect_uri?code=CODE&state=STATE,第三方應用可根據code參數獲得企業員工的corpid與userid。code長度最大為512字節。
權限說明
使用snsapi_privateinfo的scope時,第三方應用必須有“成員敏感信息授權”的權限。
服務層業務代碼
設置一個參數就是應用的SuiteId。這里的回調地址需要前端傳遞過來,因為是測試所以寫一個固定的。返回一個網址需要在手機端企業微信中點擊觸發。
具體代碼如下:
/*** 構建企業微信授權鏈接* @param $backUrl*/
public function getCompanyWxOauth()
{$backUrl = 'https://www.test.net/api/test';$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=三方應用suiteID&redirect_uri={$backUrl}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";echo "<a href='{$url}'>點擊</a>";
}
開通調用許可
在企業微信手機端點擊鏈接后,提示需要開通【接口調用許可】。
解決方式
首先賬號需要是測試企業,并且測試企業加入到測試企業列表中。
【應用管理】->【購買接口許可】企業微信接口許可 【購買】
?需要添加企業客戶ID,也就是之前企業授權安裝獲取的corpid。
這時候發現就變成0元可以購買了,購買后就可以訪問了。
scope的特殊情況
當oauth2中appid=corpid時,scope為snsapi_userinfo或snsapi_privateinfo時,必須填agentid參數,否則系統會視為snsapi_base,不會返回敏感信息。
第三方服務商配置scope為snsapi_privateinfo時,agentid所對應的應用必須有“成員敏感信息授權”的權限。
“成員敏感信息授權”的開啟方法為:登錄服務商管理后臺->標準應用服務->本地應用->進入應用->點擊基本信息欄“編輯”按鈕->勾選"成員敏感信息"。
獲取訪問用戶身份
?
請求方式
GET
請求地址
https://qyapi.weixin.qq.com/cgi-bin/service/auth/getuserinfo3rd?suite_access_token=SUITE_ACCESS_TOKEN&code=CODE
參數說明
參數 | 必須 | 說明 |
suite_access_token | 是 | 第三方應用憑證:suite_access_token |
code | 是 | 通過成員授權獲取到的code,最大為512字節。每次成員授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。 |
業務處理
通過上篇《企業微信獲取第三方憑證》得到三方憑證也就是suite_access_token和授權鏈接得到的code,可用來獲取訪問用戶身份信息。
具體代碼如下:
/*** 獲取企業微信 suite_access_token* @return array|mixed*/
public function companyAccessToken()
{$url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token";$params = json(['suite_id' => '三方應用的suitId','suite_secret' => '三方應用Secret','suite_ticket' => 'redis存儲的回調解析得到的ticket']);$info = $this->linkCurl($url, 'POST', $params);$res = djson($info);if (isset($res['errcode'])) {return toFail('error', $res);}return toSuccess('success', ['access_token' => $suite_access_token]);
}/*** 獲取企業微信用戶信息* @param $code* @return array|mixed*/
public function getWxUserInfo($code)
{if (empty($code)) {return toFail('請輸入code參數!');}$get_access_token = $this->companyAccessToken();if ($get_access_token['status'] != 1) {return $get_access_token;}$access_token = $get_access_token['data']['access_token'];$url = "https://qyapi.weixin.qq.com/cgi-bin/service/auth/getuserinfo3rd?suite_access_token={$access_token}&code={$code}";$info = $this->linkCurl($url, 'GET');print_r($info);die;}
返回內容
返回的是通過請求授權鏈接,經過用戶允許后獲取基本用戶信息。
{"errcode":0,"errmsg":"ok","corpid":"ww0d127fa51eaab","userid":"YuanLaiShiNi","parents":[],"open_userid":"woxL4YTwAAvAGu3mLUy8dkchzW"
}
返回參數說明
參數 | 說明 |
errcode | 返回碼 |
errmsg | 對返回碼的文本描述內容 |
corpid | 用戶所屬企業的corpid |
userid | 用戶在企業內的UserID,如果該企業與第三方應用沒有授權關系時,返回密文UserId,有授權關系時,按照升級后的ID策略返回明文或密文 |
user_ticket | 成員票據,最大為512字節。 |
expires_in | user_ticket的有效時間(秒),隨user_ticket一起返回 |
open_userid | 全局唯一。對于同一個服務商,不同應用獲取到企業內同一個成員的open_userid是相同的,最多64個字節。僅第三方應用可獲取 |
總結
本篇主要是在上一篇獲取第三方憑證基礎上,用戶通過三方網站自定義授權登錄后獲取用戶信息,以實現用戶綁定登錄功能。