第一篇 小程序登录获取,小程序的openId和unionId。
最近公司做了一个微信的小程序应用,做了一些技术研究也踩了不少坑,不过最终结果不错小程序顺利上线。
在这里做一个开发笔记,主要记录以下几个方面,分别用四篇文章来记录:
1.小程序登录获取,小程序的openId和unionId。
2.获取并解密小程序的加密信息包括用户和手机信息。
3.用小程序给用户推送服务消息。
4.给绑定小程序而且又关注微信公众号的用户推送公众号消息。
1.首先从最基础开始介绍一下小程序账号的登录
1.1 微信小程序注册前准备
https://developers.weixin.qq.com/miniprogram/introduction/index.html
1.2 开发前准备
https://developers.weixin.qq.com/miniprogram/dev/index.html
1.3 小程序开发工具下载
https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html?t=18101520
1.4 小程序开发API文档
https://developers.weixin.qq.com/miniprogram/dev/api/network/download/wx.downloadFile.html
2.微信公众平台登录https://mp.weixin.qq.com/
3.登录后配置服务器,在开发设置页面查看AppID和AppSecret,配置服务器域名
4.完成以上设置后AppID和AppSecret保存在java服务端,接下来我们看一下小程序和java后台的交互过程
首先是小程序端调用wx.login()发起登录,将code也就是票据传递给我们自己的java后台,
wx.login({
success: function (res) {
console.log(res);
if (res.code) {
wx.request({
url: "https://www.test.com/miniprogramLogin",
data: {
head: {},
body: {
code: res.code
}
},
method: "POST",
header: {
'content-type': 'application/json',
},
success: function (res) {
console.log(res);
},
fail: function (error) {
console.log(error);
}
})
}
},
fail: function (error) {
console.log(error);
}
})
接下来在java后台我们用保存好的AppID,AppSecret和传递过来的code,调用 code2Session 接口获取openId,unionId和session_key
public class MiniprogramLoginInterfaceAction extends BaseInterfaceAction {
private static final Logger logger = LoggerFactory.getLogger(MiniprogramLoginInterfaceAction.class);
@Override
public String execute() throws Exception {
logger.debug("小程序登录后获取用户在小程序里的openid和unionId-----开始");
// 获取前端传递的数据
HttpServletRequest request = this.getRequest();
String code = request.getParameter("code");
//AppID,AppSecret和传递过来的code,调用 code2Session 接口获取openId,unionId和session_key
MiniprogramResult miniprogramResult = MiniprogramUtil.getOpenId(code);
if (miniprogramResult != null) {
// 获取用户的唯一标识openid
String openid = miniprogramResult.getOpenid();
// 获取用户的唯一标识unionid
String unionid = miniprogramResult.getUnionid();
// 获取会话秘钥
String session_key = miniprogramResult.getSession_key();
// 下面就可以写自己的业务代码了
}
logger.debug("小程序登录后获取用户在小程序里的openid和unionId-----结束返回数据:" + miniprogramResult);
return null;
}
}
MiniprogramUtil.getOpenId(code)方法
/**
* 微信登录成功后获取用户的openId和unionId
*
* Date 2018年9月29日 下午5:03:15
*
*
* @author 网行天下
*/
public static MiniprogramResult getOpenId(String code) {
logger.info("获取小程序OpenId和SessionKey数据开始code:" + code);
MiniprogramResult miniprogramResult = null;
String sessionData = "";
String appid = "xxx";
String secret = "xxx";
String authorizationCodeUrl= "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
// 微信的接口
String url = String.format(authorizationCodeUrl, appid,secret, code);
logger.debug(url);
RestTemplate restTemplate = new RestTemplate();
// 进行网络请求,访问url接口
ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
// 根据返回值进行后续操作
if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
sessionData = responseEntity.getBody();
// 此处为返回json数据转换成javabean,可以自己查阅其他材料写
miniprogramResult = FastJsonUtils.getJavaBean(sessionData, MiniprogramResult.class);
if (miniprogramResult != null) {
return miniprogramResult;
}
}
logger.info("获取小程序OpenId和SessionKey数据结束result:" + miniprogramResult);
return miniprogramResult;
}
MiniprogramResult JavaBean
import java.io.Serializable;
public class MiniprogramResult implements Serializable {
private static final long serialVersionUID = 1L;
/** 获取到openid */
public String openid;
/** 获取到unionid */
public String unionid;
/** 获取到session_key */
public String session_key;
/** 获取到的凭证 */
public String access_token;
/** 凭证有效时间,单位:秒 */
public Integer expires_in;
/** 错误码 */
public Integer errcode;
/** 错误信息 */
public String errmsg;
// get set 省略
}
然后openId,unionId取得后需要保存到数据库,session_key取到后保存在服务端缓存中。
需要注意
a.会话密钥 session_key 是对用户数据进行 加密签名 的密钥。session_key的有效期不固定,微信通过用户行为来维护
b.临时登录凭证 code 只能使用一次