本最近在尝试小程序相关的功能,比如用微信信息登陆小程序,小程序支付(这个尝试不了要有营业执照)等,当本人人尝试获取用户手机号作为用户相关信息时,发现官网压根就没有例子。。。。但如php,python,甚至是go都有。。哈哈哈,网上很多例子但是大部分都有问题,他们的问题出在哪。
- 第一个依赖包,依赖包的选择很重要,本人尝试很多base64包。 本人用的java自身的工具包就是java.until.base64,很多人都认为这个包都用不了。当然如org.apache.tomcat.util.codec.binary.Base64也可以,
- 第二个 问题是在这个包,本人根据网上的例子结合官方文档api以及自己差不多十几次的尝试,找问题,终于发现原因,就是他们方法用错了应该用的是Base64.getEncoder().encode(),解出来字节数组长度为32,这个很多老铁郁闷吧,其实微信官方文档是有相关提示的如下,用的方法应该是Base64.getDecoder().decode(xxxx)
- 第三个 就是关于空格问题,session_key, encryptedData, iv,有存在空格的问题,要把空格变成+
- 第四个 还是长度问题---- byte[] keyByte=Base64.getDecoder().decode(session_key1),这里的keyByte长度必须补到16,不足的补0
例子如下
public Object getPhoneNumber(String session_key, String encryptedData, String iv) {
String session_key1=session_key.replace(" ","+");
String encryptedData1=encryptedData.replace(" ","+");
String iv1=iv.replace(" ","+");
byte[] encrypData =Base64.getDecoder().decode(encryptedData1);
byte[] ivData =Base64.getDecoder().decode(iv1);
byte[] keyByte=Base64.getDecoder().decode(session_key1);
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
String resultString = null;
try {
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;
}
System.out.println(keyByte.length);
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
// 设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
resultString = new String(cipher.doFinal(encrypData), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
JSONObject object = JSONObject.parseObject(resultString);
return object.getString("purePhoneNumber");
}