JAVA服务端解密与微信绑定的手机号
背景介绍
在前段时间公司开发小程序的项目中,服务端需要配合前端获取当前用户与微信绑定的手机号;需要以下两步:
1.根据前端所传的code通过服务端调微信接口获取openId,sessionkey;
2.根据前端所传的encrypdata,ivdata,sessionKey服务端进行解密后得到手机号
前提工作
首先在微信公众平台申请小程序公众号,申请成功后就能获取到 appid 和 secret两参数
代码展示
获取微信openId sessionKey
参数:
code:为前端传入
MINI_PROGRAM_REQUEST_URL :https://api.weixin.qq.com/sns/jscode2session
MINI_PROGRAM_APPID:小程序appid
MINI_PROGRAM_SECRET :小程序secret
/**
* <desc>
* 获取微信openId sessionKey
* </desc>
*
* @param code 微信参数
* @return
* @createDate 2018/12/7
*/
@RequestMapping(path = "/getOpenId",method = RequestMethod.POST)
@ResponseBody
public MessageVO getOpenId(String code){
Map<String, Object> map = new HashMap<>();
String status = "1";
String msg = "ok";
String requestUrl = MINI_PROGRAM_REQUEST_URL +"?appid="+MINI_PROGRAM_APPID+"&secret="+MINI_PROGRAM_SECRET+"&js_code="+code+"&grant_type=authorization_code";
try {
if(StringUtils.isBlank(code)){
status = "0";//失败状态
msg = "code为空";
}else {
System.out.println(requestUrl);
// 发起GET请求获取凭证
JSONObject jsonObject = HttpProtocolUtil.httpsRequest(requestUrl, "GET", null);
if (jsonObject != null) {
try {
map.put("openid", jsonObject.getString("openid"));
map.put("session_key", jsonObject.getString("session_key"));
} catch (JSONException e) {
// 获取token失败
status = "0";
msg = "code无效";
}
}else {
status = "0";
msg = "code无效";
}
}
map.put("status", status);
map.put("msg", msg);
} catch (Exception e) {
throw new DataAccessException("【小程序】获取openId失败",e);
}
return new MessageVO(BaseErrorCodeEnum.SUCCESS.getErrorCode(),map);
}
解密与微信绑定的手机号
/**
* <desc>
* 解密与微信绑定的手机号
* </desc>
*
* @param encrypdata 微信参数
* @param ivdata 微信参数
* @param sessionKey 会话密钥
* @return
* @createDate 2018/11/24
*/
@RequestMapping(path = "/getPhoneNum",method = RequestMethod.POST)
@ResponseBody
public MessageVO getPhoneNum(String encrypdata,String ivdata,String sessionKey){
try {
if(StringUtils.isEmpty(encrypdata) || StringUtils.isEmpty(ivdata) || StringUtils.isEmpty(sessionKey)){
return new MessageVO(BaseErrorCodeEnum.NOT_PARAM.getErrorCode());
}
byte[] encrypData = Base64.decode(encrypdata);
byte[] ivData = Base64.decode(ivdata);
byte[] sessionKeyByte = Base64.decode(sessionKey);
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(sessionKeyByte, "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
//解析解密后的字符串
String phoneNum = new String(cipher.doFinal(encrypData),"UTF-8");
return new MessageVO(BaseErrorCodeEnum.SUCCESS.getErrorCode(),phoneNum);
}catch (Exception e){
throw new DataAccessException("【小程序_注册登录版块】解密与微信绑定的手机号失败",e);
}
}