1、理解微信中用到的概念
code:调用微信接口的临时票据,有效时间应该是5分钟。
openid:公众平台(小程序,公众号等)下的唯一值
unionid:开放平台下用户的唯一值,一个开放平台下可以包含多个公众平台
要想调用微信的接口,需要申请账号获取appid和appsecret。先要注册一个开放平台账号,在该账号下可以添加公众平台小程序、公众号、移动应用等微信服务。申请链接如下:
https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN
2 、小程序
通过code获取用户unionid:
https\://api.weixin.qq.com/sns/jscode2session?appid\=APPID&secret\=SECRET&js_code\=JSCODE&grant_type\=authorization_code
public static String decodeUserInfo(String code) {
Map<String,Object> map = new HashMap<String,Object>();
//登录凭证不能为空
if (code == null || code.length() == 0) {
map.put("status", 0);
map.put("msg", "code 不能为空");
return null;
}
//1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
String url = MINIPROGRAM_AUTH_URL.replace("JSCODE", code);
JSONObject json = HttpsUtils.doGet(url);
if(json.getInteger("errcode")!=null){
map.put("status", 0);
map.put("msg", json.toString());
return null;
}
//从json中根据需要获取值
//String openid = json.getString("openid");
String unionid = json.getString("unionid");
// map.put("unionId", unionid);
// map.put("openid", openid);
return unionid;
}
3、 移动应用微信登录
前端使用uni-app开发,最初使用uni.login()直接获取unionid传到后台校验,但是为了安全前端改成了获取code,传到后台校验,获取code参考如下链接:
https://blog.csdn.net/sqlquan/article/details/111872547
注意:前端获取code时就不要在用uni.login方法了,可能会造成传到后台时提示code been used,在打包Android时没有问题,在打包ios时出现的问题。
通过code获取openid和access_token:
https\://api.weixin.qq.com/sns/oauth2/access_token?appid\=APPID&secret\=SECRET&code\=CODE&grant_type\=authorization_code
然后在获取unionid:
https\://api.weixin.qq.com/sns/userinfo?access_token\=ACCESS_TOKEN&openid\=OPENID
public static String getMobileAppUnionid(String code){
String unionid = null;
//1、向微信服务器 使用登录凭证 code
String url = MOBILEAPP_AUTH_URL.replace("CODE", code);
JSONObject jsonOpenid = HttpsUtils.doGet(url);
//先获取openid和access_token if(StringUtils.isNotBlank(jsonOpenid.getString("access_token"))&&StringUtils.isNotBlank(jsonOpenid.getString("openid"))) {
//获取用户信息unionid
String unionidUrl = MOBILEAPP_UNIONID_URL.replace("ACCESS_TOKEN", jsonOpenid.getString("access_token")).replace("OPENID", jsonOpenid.getString("openid"));
JSONObject json = HttpsUtils.doGet(unionidUrl);
if(StringUtils.isNotBlank(json.getString("unionid"))){
unionid = json.getString("unionid");
}
}
//按开发文档上
return unionid;
}
参考开发文档: