开发需求:
我们在开发微信小程序过程中,需要绑定微信用户的信息到数据库里,那么就需要获得用户的唯一标识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需要使用小程序账号登录微信公众号平台获取。