微信小程序获取用户手机号码,后台Java版

微信官方说的特别详细(微笑),使用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

猜你喜欢

转载自blog.csdn.net/weixin_46030885/article/details/109313402