微信小程序官方链接
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
因为设计问题,现在只需要插入微信用户的信息即可。 userId和userLevel 可以后期手动插入,或者先解析用户信息,判断是哪个用户再插入你需要的userId和userLevel。
初步尝试使用业务用户和微信用户使用手动绑定方式。
第一次登录使用只插入微信id (openId),只有userId有的情况才会登录
@RequestMapping(value = "/login", produces = "application/json;charset=UTF-8")
public Result login(HttpServletRequest request, HttpServletResponse response,@RequestBody WxUserInfo wxUserInfo) throws WxErrorException {
Result result = null;
if(StringUtils.isEmpty(wxUserInfo.getCode())) {
result = ResultUtil.success("无效的code");
return result;
}else {
final WxMaService wxService = getWxMaService();
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
//存在有效的 code
System.out.println("这里请求了一次code=" + wxUserInfo.getCode());
//解析code获取用户基础信息
WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(wxUserInfo.getCode());
//获取openId和sessionKey
String openId=session.getOpenid();
String sessionKey = session.getSessionKey();
System.out.println(openId);
System.out.println(sessionKey);
//判断用户是否存在,不存在就插入微信id后对微信用户和业务用户进行绑定
UserWx userWx = userwxService.getWxId(openId);
if(userWx==null) {
WxMaUserInfo userInfo=wxUserInfo.getUserInfo();
String nickName=userInfo.getNickName();
//以下有种其他方式自动绑定1.获取手机私密信息进行绑定用户。2.使用私密用户信息进行绑定用户
//解析电话信息(需授权)
//WxMaPhoneNumberInfo phoneNumberInfo=wxService.getUserService().getPhoneNoInfo(sessionKey, wxUserInfo.getPhoneEncryptedData(),wxUserInfo.getPhoneIv());
//String phoneNumber=phoneNumberInfo.getPurePhoneNumber();
//解析用户信息(需授权)
//WxMaUserInfo userInfo =wxService.getUserService().getUserInfo(sessionKey, wxUserInfo.getEncryptedData(),wxUserInfo.getIv());
//String nickName=userInfo.getNickName();
UserWx userWxEntity = new UserWx();
userWxEntity.setUid(IdGenerator.uuid());
userWxEntity.setWxId(openId);
userWxEntity.setWxNickName(nickName);
userWxEntity.setIsNewRecord(true);
userwxService.save(userWxEntity);
result = ResultUtil.success("请绑定用户");
}else {
if(userWx.getUserId()!=null) {
result = ResultUtil.success(userWx);
System.out.println("登录成功");
}else {
result = ResultUtil.success("请绑定用户");
}
}
//做自定义登录态(redis)
//通过openId sessionKey 生成3rd session 返回给客户端小程序(微信有自己accessToken)此处可以自定义登录,因为设计问题,直接把用户信息传给前端做权限设计。
//String accessToken = UUID.randomUUID().toString();
//redisUtil.set(accessToken, userWx, 7000L);
return result;
}
}
然后想用一下方式注入WxMaService ,发现注入失败(没解决,后期处理)
@Autowired
private WxMaService wxService;
以上方式失败,改为以下方式处理。
final WxMaService wxService = getWxMaService();
在login接口同类里面键以下代码,星号 * 省略的是小程序的appId和 Secret 清自行获取!优先写在配置文件中。此处错误示范。
private WxMaService getWxMaService() {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid("wxb************94");
config.setSecret("62b9*******************5bf");
config.setMsgDataFormat("JSON");
WxMaService wxMaService = new WxMaServiceImpl();
wxMaService.setWxMaConfig(config);
return wxMaService;
}
WxUserInfo实体类, WxMaUserInfo是wx自带的jar包,请在下方自行导入。
private String code;
private String signature;
private String rawData;
private String encryptedData;
private String iv;
private WxMaUserInfo userInfo;
Result 自己封装的输出格式 ,可以换成自己的。
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.6.0</version>
</dependency>
因为是第一次尝试,技术太水,全是坑! 前端的wx.login连点可能会造成session_key错位从而出现解析私密信息错误,json格式错误等。
记录下没搞清楚的问题:
1.SSL peer shut down incorrectly
SSL peer shut down incorrectly
在login接口中使用一下代码时候,就可以使用了。
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
2.解析用户信息的时候出现一下问题。初步判断可能是session_key错位导致,解析出json数据是错的。因为某些原因没有深究。
expected BEGIN_OBJECT but was STRING at line 1 column 1 path $