獲取微信用戶唯一標識openid | 小程序
wx.login(OBJECT)
調用接口獲取登錄憑證(code)進而換取用戶登錄態信息,包括用戶的唯一標識(openid) 及本次登錄的 會話密鑰(session_key)。用戶數據的加解密通訊需要依賴會話密鑰完成。
https://www.w3cschool.cn/weixinapp/weixinapp-api-login.html
OBJECT參數說明:
參數名 | 類型 | 必填 | 說明 |
---|---|---|---|
success | Function | 否 | 接口調用成功的回調函數 |
fail | Function | 否 | 接口調用失敗的回調函數 |
complete | Function | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) |
success返回參數說明:
參數名 | 類型 | 說明 |
---|---|---|
errMsg | String | 調用結果 |
code | String | 用戶允許登錄後,回調內容會帶上 code(有效期五分鐘),開發者需要將 code 發送到開發者服務器後臺,使用code 換取 session_key api,將 code 換成 openid 和 session_key |
示例代碼:
//app.js
App({
onLaunch: function() {
wx.login({
success: function(res) {
if (res.code) {
//發起網絡請求
wx.request({
url: ‘https://test.com/onLogin‘,
data: {
code: res.code
}
})
} else {
console.log(‘獲取用戶登錄態失敗!‘ + res.errMsg)
}
}
});
}
})
code 換取 session_key
?這是一個 HTTPS 接口,開發者服務器使用登錄憑證 code 獲取 session_key 和 openid。其中 session_key 是對用戶數據進行加密簽名的密鑰。為了自身應用安全,session_key 不應該在網絡上傳輸。
接口地址:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
請求參數:
參數 | 必填 | 說明 |
---|---|---|
appid | 是 | 小程序唯一標識 |
secret | 是 | 小程序的 app secret |
js_code | 是 | 登錄時獲取的 code |
grant_type | 是 | 填寫為 authorization_code |
返回參數:
參數 | 說明 |
---|---|
openid | 用戶唯一標識 |
session_key | 會話密鑰 |
unionid | 用戶在開放平臺的唯一標識符。本字段在滿足一定條件的情況下才返回。具體參看UnionID機制說明 |
返回說明:
//正常返回的JSON數據包
{
"openid": "OPENID",
"session_key": "SESSIONKEY"
"unionid": "UNIONID"
}
//錯誤時返回JSON數據包(示例為Code無效)
{
"errcode": 40029,
"errmsg": "invalid code"
}
一、基礎知識
? 接口地址
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
? 請求參數
appid:小程序的唯一標識
secret:小程序的app secret
js_code:用戶的登錄憑證code(使用wx.login({})可獲取到)
grant_type:填寫authorization_code
? 返回參數
expires_in:憑證有效時間,單位:秒
openid:用戶唯一標識
session_key:會話密匙(考慮到應用安全,不應該在網絡上傳輸session_key)
二、客戶端原理
1、使用小程序登錄接口wx.login({})獲取用戶的登錄憑證code
2、使用小程序網絡請求API wx.request({})將獲取用戶登錄憑證(code)發送至服務器
示例
/**************************************
* config:小程序配置文件
* loginUrl:服務器地址
* code:返回參數,用戶登錄憑證
* wx.login({}):登錄接口
* wx.request({}):網絡請求API
*
* 日期:2017-1-1
**************************************/
var CONGIF=require(‘config‘);
var OBJ_APP_DATA={};
OBJ_APP_DATA[‘onLaunch‘]=function(){
wx.login({
success: (res)=>{
wx.request({
url:CONGIF.loginUrl,
data: {
code:res.code
},
method: ‘GET‘,
success: (res)=>{
console.log(res.data)
},
})
}
})
}
App(OBJ_APP_DATA);
三、服務端php原理
1、使用isset()函數檢測客戶端是否有傳遞code參數
示例
if(isset($_GET[‘code‘])){}
2、使用 curl_init()函數初始化一個CURL會話,初始化成功後返回一個句柄供curl_setopt(), curl_exec(),和 curl_close() 函數使用
示例
$curl = curl_init();
3、使用curl_setopt()設置要獲取的URL地址
示例
$url=‘https://api.weixin.qq.com/sns/jscode2session?appid=‘.$appid.‘&secret=‘.$secret.‘&js_code=‘.$code.‘&grant_type=authorization_code‘;
curl_setopt($curl, CURLOPT_URL, $url);
4、設置是否輸出header
示例
curl_setopt($curl, CURLOPT_HEADER, 1);
5、設置是否輸出結果
示例
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
6、設置是否輸出結果
示例
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
7、設置是否檢查服務器端的證書
示例
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
8、使用curl_exec()將CURL返回的結果轉換成正常數據並保存到一個變量
示例
$data = curl_exec($curl);
9、使用 curl_close() 關閉CURL會話
示例
curl_close($curl);
獲取微信用戶唯一標識openid | 小程序