開發需求:
我們在開發微信小程序過程中,需要綁定微信用戶的信息到數據庫裏,那麼就需要獲得用戶的唯一標識openid,而微信爲了安全,禁止小程序直接訪問https://api.weixin.qq.com 的接口,因此不能直接拿到用戶的openid。
解決方案:
1、先通過wx.login獲取一個臨時憑證code
wx.login(OBJECT)
調用接口獲取登錄憑證(code)進而換取用戶登錄態信息,包括用戶的唯一標識(openid) 及本次登錄的 會話密鑰(session_key)。用戶數據的加解密通訊需要依賴會話密鑰完成。
2、然後我們拿這個code去自己的服務器換取用戶openid和session_key
code 換取openid和session_key
這是一個 HTTPS 接口,開發者服務器使用登錄憑證 code 獲取 session_key 和 openid。其中 session_key 是對用戶數據進行加密簽名的密鑰。爲了自身應用安全,session_key 不應該在網絡上傳輸。
一、微信小程序前端代碼(app.js)
//app.js
App({
onLaunch: function() {
// 展示本地存儲能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
/*
* 獲取用戶openid
* 示例說明:微信爲了安全,禁止小程序訪問https://api.weixin.qq.com 的接口,因此不能直接拿到用戶的openid
* 解決方案:
* 1、先通過wx.login獲取一個臨時憑證code
* 2、然後我們拿這個code去自己的服務器換取用戶openid
*/
var that=this;
wx.login({
success: function (res) {
var code = res.code;//發送給服務器的code
wx.getUserInfo({
success: function (res) {
var userNick = res.userInfo.nickName; //用戶暱稱
var avataUrl = res.userInfo.avatarUrl;//用戶頭像地址
var gender = res.userInfo.gender; //用戶性別
if (code) {
wx.request({
url: 'https://後端網址/getOpenid.html',
data: {
code: code,
nick: userNick,
avaurl: avataUrl,
sex: gender,
},
header: {
'content-type': 'application/json'
},
success: function (res) {
console.log('獲取到的用戶openid爲:' + res.data.openid);
//可以把openid保存到本地緩存,方便以後調用
wx.setStorageSync('openid', res.data.openid);
}
})
}
else {
console.log("獲取用戶登錄態失敗!");
}
}
})
},
fail: function (error) {
console.log('login failed ' + error);
}
})
},
/**
* 全局屬性
*/
globalData: {
userInfo: null
}
})
二、後端Thinkphp代碼
public function getOpenid(){
if(!isset($_GET['code'])||!isset($_GET['nick'])||!isset($_GET['avaurl'])||!isset($_GET['sex'])){
header("Content-type: text/html; charset=utf-8");
echo '參數錯誤.';
exit;
}
//微信小程序appid
$appid='小程序的APPID';
//微信小程序secret
$secret='小程序的SECRET';
$code = $_GET['code']; //小程序傳來的code值
$nick = $_GET['nick']; //小程序傳來的用戶暱稱
$imgUrl = $_GET['avaurl']; //小程序傳來的用戶頭像地址
$sex = $_GET['sex']; //小程序傳來的用戶性別
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code=' . $code . '&grant_type=authorization_code';
$info = file_get_contents($url);//發送HTTPs請求並獲取返回的數據,推薦使用curl
$json = json_decode($info);//對json數據解碼
$arr = get_object_vars($json);
$openid = $arr['openid'];
$session_key = $arr['session_key'];
echo json_encode($arr);
}
這裏說明一下,小程序的APPID和SECRET需要使用小程序賬號登錄微信公衆號平臺獲取。