微信小程序获取用户电话
需要的参数前端应该都能拿到
public ResponseModel getPhoneNumber(@RequestBody WxEntity wxEntity){
String encrypteddata = wxEntity.getEncrypteddata();
String iv = wxEntity.getIv();
String sessionkey = wxEntity.getSessionKey();
if (StringUtil.isNullOrEmpty(encrypteddata) || StringUtil.isNullOrEmpty(iv) || StringUtil.isNullOrEmpty(sessionkey)){
ResponseModel.failed("参数为空");
}
String result = "";
byte[] dataByte = new byte[0];
byte[] keyByte = new byte[0];
byte[] ivByte = new byte[0];
try {
//这个替换字符特别重要,不写就报错。
String replace = URLEncoder.encode(encrypteddata, "UTF-8").replace("%3D", "=").replace("%2F", "/").replace("%2B","+");
dataByte = Base64.decodeBase64(replace);
String replace2 = URLEncoder.encode(sessionkey, "UTF-8").replace("%3D", "=").replace("%2F", "/").replace("%2B","+");
keyByte = Base64.decodeBase64(replace2);
String replace1 = URLEncoder.encode(iv, "UTF-8").replace("%3D", "=").replace("%2F", "/").replace("%2B","+");
ivByte = Base64.decodeBase64(replace1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
int base = 16;
if (keyByte.length % base != 0) {
int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
keyByte = temp;
}
// 初始化
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
parameters.init(new IvParameterSpec(ivByte));
// 初始化
cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
byte[] resultByte = cipher.doFinal(dataByte);
if (null != resultByte && resultByte.length > 0) {
String s = resultByte.toString();
result = new String(resultByte, "UTF-8");
}
}catch (Exception e){
e.printStackTrace();
log.error("解密用户电话失败 :{}",e.getMessage());
return ResponseModel.failed("解密电话号码失败请稍后重试");
}
com.alibaba.fastjson.JSONObject jsonObject = JSONObject.parseObject(result);
String purePhoneNumber = jsonObject.getString("purePhoneNumber");
wxEntity.setClientPhone(purePhoneNumber);
log.info("解析的电话为:{}",purePhoneNumber);
return ResponseModel.success(wxEntity);
}