微信官方说的特别详细(微笑),使用iv,session_key和encryptedData解密获取到用户手机号,然后官方提供的解密算法是这样的。
经过查找bai大du量zhi的dao资料,终于写出了我们自己的解决办法T_T
上代码:
@ApiOperation("获取本机电话号")
@RequestMapping(value = "/getPhoneNum", method = {
RequestMethod.POST})
public String getPhoneNumber(@RequestParam("iv") String iv,
@RequestParam("encrypteddata")String encrypteddata,
@RequestParam("sessionkey")String sessionkey) {
String result = "";
Res res = new Res();
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();
}
return result;
}
这是我的一个controller,讲道理,里边的替换特殊字符真的很重要,因为他给我报了好久的这个错
javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
导包 应该是就这几个
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
pom坐标 好像是用到着两个了
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-core</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
解密出来是这个样子的,但现在是String类型
你可以用阿里爸爸的JSONObject转译成json格式
得导这个包
<!--字符串转json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.9</version>
</dependency>
终于弄完了,事实证明,没有一个error是冤枉你的,我好菜啊T_T