美文网首页
【uniapp】微信小程序获取手机号

【uniapp】微信小程序获取手机号

作者: 泪滴在琴上 | 来源:发表于2022-08-19 10:41 被阅读0次

    获取思路: 用户在小程序内主动触发获取手机号按钮,调用方法在小程序端获取code、encryptedData、iv,然后拿着获取到的参数去调用服务端解密用户数据接口api.weixin.qq.com/sns/jscode2… 通过解密出的用户数据获得用户手机号来返回给小程序端。

    image.png
    uniapp代码:
    <u-button type="success" size="mini" style="margin-top: 15rpx;" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" >获取手机号</u-button>
    
    // 获取code
    getCode() {
            uni.login({
                    provider: 'weixin',
                    success: loginRes => {
                            this.decodePhoneParams.code = loginRes.code
                    }
            });
    },
    
    // 获取手机号
    getPhoneNumber(e) {
            this.getCode();
            if(!this.decodePhoneParams.code || !e.detail.encryptedData){
                    return false;
            }
            this.decodePhoneParams.encryptedData = e.detail.encryptedData;
            this.decodePhoneParams.iv = e.detail.iv;
            this.$u.api
                    .postDecodeUserInfo(this.decodePhoneParams)
                    .then(res => {
                            console.log(res, '[地址管理-获取用户手机号]');
                            this.params.mobile = res.data.phoneNumber
                    })
                    .catch(err => {
                            console.log(err);
                    });
    },
    

    服务端代码:

    /**
     * 方法描述: 获取微信用户的手机号码
     */
    public static Object getPhoneNumber(String encryptedData, String session_key, String iv) {
        // 被加密的数据
        byte[] dataByte = Base64.decode(encryptedData);
        // 加密秘钥
        byte[] keyByte = Base64.decode(session_key);
        // 偏移量
        byte[] ivByte = Base64.decode(iv);
        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/PKCS5Padding");
            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 result = new String(resultByte, "UTF-8");
                System.out.println(result);
                return JSONObject.parseObject(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    

    作者:宿雨style
    链接:https://juejin.cn/post/7127244127300747301
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:【uniapp】微信小程序获取手机号

          本文链接:https://www.haomeiwen.com/subject/jvqsgrtx.html