前言
在开发微信小程序的时候,获取用户openid是再常见不过的事情了,openid是用户在指定小程序X小程序中的固定身份id,每个用户在该X小程序的都不一样,每个用户在不同的小程序的身份id也不一样,那么怎样才能获取用户的openid呢?
获取openid过程:
获取openid首先需要调用小程序的login方法获取小程序的登录凭证code,然后使用code向微信换取登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等,这个方法是获取不到用户头像、昵称等隐私信息的,隐私信息需要用户授权,并且使用的也是其他的方法。
下面讲一个简单的获取用户openid案例。
前端代码如代码清单1所示:
代码清单1
getOpenid: function() {
var that = this;
wx.login({
success(res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'http://localhost:8091/wxapi/decryptCode',
data: {
code: res.code
},
success(data){
wx.showToast({
title: '获取openid成功',
icon: 'success',
duration: 2000
})
console.log("openid:" + data.data)
that.setData({
userOpenid:data.data
})
},fail(data){
wx.showToast({
title: '获取openid失败',
icon: 'fail',
duration: 2000
})
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
}
从代码清单1可以看到,这段代码就是一个获取用户openid的getOpenid方法,当这个方法被调用后,首先调用小程序的开放接口wx.login获取code,然后将code发送到后台,如果后台成功返回openid则提示获取openid成功并打印到控制台并显示在页面上,反之提示获取openid失败。
后端代码如代码清单2所示:
代码清单2
@ResponseBody
@RequestMapping(value = "/wxapi/decryptCode", produces = "application/json;charset=UTF-8",method = RequestMethod.POST)
public String decodeOpenid(HttpServletResponse response, String code){
response.setHeader("Access-Control-Allow-Origin", "*");
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
String wxspAppid = "填写小程序appid";
String wxspSecret = "填写小程序密钥";
try {
Map<String, String> map = new HashMap<>();
// 授权(必填)
String grant_type = "authorization_code";
// 请求参数
String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type="
+ grant_type;
log.info("解析code请求参数:"+params.toString());
// 发送请求
String sr = HttpRequest.sendPost("https://api.weixin.qq.com/sns/jscode2session", params);
// 解析相应内容(转换成json对象)
JSONObject json = JSONObject.parseObject(sr);
log.info("解析code请求结果:"+json.toString());
// 获取会话密钥(session_key)
String session_key = json.getString("session_key");
String openid = json.getString("openid");
log.info("openid:"+openid);
return RespResult.resp400("openId生成失败");
} catch (Exception e) {
e.printStackTrace();
return RespResult.resp500(e);
}
}
从代码清单2可以看到,后台获取code后,会将小程序appid和secret等信息进行拼接,然后向微信发送post请求获取用户openid等登录态信息,之后再返回openid给前端。
运行截图如图1-1所示:
图1-1 代码运行截图
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html(小程序官方文档)