下面是完整攻略:
背景知识
微信小程序提供了获取用户手机号的接口,但是在获取手机号前,需要用户进行授权。用户若同意授权,则小程序可以访问其手机号。在获取到用户的手机号后,需要在后端对该手机号进行解密,才能够得到用户的真实手机号,以供业务使用。下面是获取手机号的完整流程:
- 前端向后端请求微信用户手机号,在请求中需要携带用户授权后获得的加密数据。
- 后端接收到请求后,需要将接收到的加密数据进行解密,并得到用户的手机号。
- 后端将解密后的用户手机号返回给前端,前端可以通过该手机号来进行后续的业务逻辑。
解密流程
1. 获取sessionKey
由于微信加密手机号的算法使用了AES加密算法,因此在解密前需要用到AES算法所需要的参数:sessionKey。在用户登录小程序时,可以通过微信提供的登录接口获取到sessionKey。获取流程如下:
- 用户打开小程序,进入到登录界面。
- 用户点击登录按钮,小程序调用微信的登录接口,获取到用户的临时凭证code。
- 小程序将code发送给后端,后端通过微信提供的接口使用code换取sessionKey和openid。
- 后端将sessionKey和openid返回给小程序。
获取到sessionKey和openid后,就可以在后续的解密流程中使用sessionKey进行解密。
2. 解密手机号
微信加密手机号时使用了AES/CBC/PKCS7Padding算法,并使用sessionKey作为秘钥。解密流程如下:
- 对加密的数据进行Base64解码,得到加密后的数据字节数组。
- 对sessionKey进行Base64解码,得到对应的字节数组。
- 对加密后的数据字节数组和sessionKey字节数组进行解密,得到用户的手机号。
解密过程中需要用到解密算法,以下是解密算法的Java代码实现:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESUtil {
public static String decryptData(String encryptedData, String iv, String sessionKey) throws Exception {
byte[] encrypted = Base64.getDecoder().decode(encryptedData);
byte[] keyByte = Base64.getDecoder().decode(sessionKey);
byte[] ivByte = Base64.getDecoder().decode(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivByte);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decrypted = cipher.doFinal(encrypted);
return new String(decrypted);
}
}
解密过程中需要传入sessionKey、iv以及加密后的手机号作为参数,如下所示:
String sessionKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String iv = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String encryptedData = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String phone = AESUtil.decryptData(encryptedData, iv, sessionKey);
解密完成后得到的就是用户的真实手机号。
示例说明
以下是示例说明:
示例1
前端页面代码:
<button @getPhoneNumber="getPhoneNumber">获取手机号</button>
前端JS代码:
methods: {
getPhoneNumber(event) {
if (event.mp.detail.errMsg === "getPhoneNumber:ok") {
// 授权成功,向后端发送解密请求
var requestUrl = "https://www.example.com/decrypt-phone";
var requestData = {
"encryptedData": event.mp.detail.encryptedData,
"iv": event.mp.detail.iv
};
wx.request({
url: requestUrl,
method: "POST",
data: requestData,
success: function (res) {
console.log(res.data); // 输出用户手机号
}
});
}
}
}
后端Java代码:
@PostMapping("/decrypt-phone")
@ResponseBody
public String decryptPhone(@RequestBody Map<String, String> requestData) throws Exception {
String sessionKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String iv = requestData.get("iv");
String encryptedData = requestData.get("encryptedData");
String phone = AESUtil.decryptData(encryptedData, iv, sessionKey);
return phone;
}
示例2
前端页面代码:
<button @getPhoneNumber="getPhoneNumber">获取手机号</button>
前端JS代码:
methods: {
getPhoneNumber(event) {
if (event.mp.detail.errMsg === "getPhoneNumber:ok") {
// 授权成功,获取用户手机号
console.log(event.mp.detail.purePhoneNumber); // 输出用户手机号
}
}
}
后端Java代码:“
不需要后端Java代码,因为前端直接获取了用户的手机号。但是由于前端无法获得加密的手机号,因此需要在前端中向后端发送解密请求,根据示例1中的方式进行解密处理。
以上就是关于“微信小程序获取手机号,后端JAVA解密流程代码”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序获取手机号,后端JAVA解密流程代码 - Python技术站