最近项目在完成后台+微信小程序。后台方面问题并没有很大,主要是小程序需要对用户手机号进行解密,做的时候确实出现了一些问题,微信官网也给了一下相关文件,但是好像解密并没有JAVA的demo。查找了很多博客和相关资料,最后也算是比较幸运的拿到了解密后的手机号码。
话不多说,直接上代码:
@ResponseBody
@RequestMapping("/loginapp.do")
public DataResponse decodeUser(@RequestParam("encryptedData")String encryptedData,
@RequestParam("iv")String iv,
@RequestParam("code")String code) { // 这三个参数是前端传过来的数据
DataResponse response = new DataResponse();
Map<String, Object> map = new HashMap<>();
//登录凭证不能为空
if (code == null || code.length() == 0) {
/*map.put("status", 0);
map.put("msg", "code 不能为空");
return map;*/
response.setResult_code("failed");
response.setResult_msg("code 不能为空");
return response;
}
//小程序唯一标识 (在微信小程序管理后台获取)
String wxspAppid = "获取你的appid";
//小程序的 app secret (在微信小程序管理后台获取)
String wxspSecret = ""获取你的 secret";
//授权(必填)
String grant_type = "authorization_code";
// 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
//请求参数
String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
//发送请求
String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
//解析相应内容(转换成json对象)
Gson gson = new Gson();
JsonObject json = gson.fromJson(sr, JsonObject.class);
System.out.println(json);
// JSONObject json = JSONObject.fromObject(sr);
if (json.get("session_key") == null) {
/*map.put("status", 0);
map.put("msg", "解密失败");
return map;*/
response.setResult_code("failed");
response.setResult_msg("解密失败:" + json.get("errmsg").toString().replaceAll("\"", ""));
return response;
}
//获取会话密钥(session_key)
String session_key = json.get("session_key").toString();
//用户的唯一标识(openid)
String openid = json.get("openid").toString();
2、对encryptedData加密数据进行AES解密
try {
String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
if (null != result && result.length() > 0) {
JsonObject userInfoJSON = gson.fromJson(result, JsonObject.class);
System.out.println("user: " + userInfoJSON);
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("openId", openid.replaceAll("\"", ""));
userInfo.put("phoneNumber", userInfoJSON.get("phoneNumber").toString().replaceAll("\"", ""));
TUser tUser=new TUser();
String telnum=userInfoJSON.get("phoneNumber").toString().replaceAll("\"", "");
tUser.setTelnum(telnum);
String name="";
for(int i=0;i<6;i++){
int intVal=(int)(Math.random()*26+65);
name=name+(char)intVal;
}
TUser uu=tUserService.selectbytelnum(telnum);//检测该手机号是否已经存在 如果不存在,添加默认信息
if(uu ==null){
tUser.setTest(0);
tUser.setName(name);
tUser.setSex("男");
tUser.setAge(18);;
tUser.setOpenid(openid);
tUser.setSessionkey(session_key);
tUser.setCreatetime(new Date());
tUserService.insert(tUser);
}
map.put("userInfo", userInfo);
System.out.println("map: " + map);
response.setResult_code("success");
response.setResult_msg("解密成功");
response.setData(userInfo);
return response;
}
} catch (Exception e) {
e.printStackTrace();
}
response.setResult_code("failed");
response.setResult_msg("解密失败");
return response;
}
这样就可以直接解析到手机号(phoneNumber)了,代码亲测可用。