小程序getPhoneNumber

这篇博客详细介绍了如何在小程序中使用getPhoneNumber方法获取用户电话,并结合后端接口处理加密数据,实现电话号码的安全获取。当用户拒绝授权时,会显示相应提示。同时,后端通过微信API解密数据,获取并返回用户电话号码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<button open-type="getPhoneNumber" bindgetphonenumber= "getPhoneNumber" >获取电话</button>

getPhoneNumber: function (e) {
var that = this;
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
wx.showModal({
title: '提示',
showCancel: false,
content: '未授权',
success: function (res) { }
})
} else {
wx.login({
success: function (code) {
that.getPhone(code.code, e.detail.iv, e.detail.encryptedData)
}
})
wx.showModal({
title: '提示',
showCancel: false,
content: '同意授权',
success: function (res) { }
})
}
},
getPhone: function (loginCode, iv, encryptedData){
common.getRequestSyn2('/mini-program/getPhoneNumber.json', { code: loginCode, iv: iv, encryptedData: encryptedData }, true,
function (res) {
if (res.data.success) {
console.log(res)
}
})
},

@RequestMapping("/getPhoneNumber.json")
@ResponseBody
public JSONResult getPhoneNumber(@RequestParam String code,
                        @RequestParam String encryptedData,
                        @RequestParam String iv) {
    String appId = "";//miniProgramSettings.getAppId();
    String appSecret = "";//miniProgramSettings.getAppSecret();

    StringBuilder sb = new StringBuilder();
    sb.append("https://api.weixin.qq.com/sns/jscode2session");
    sb.append("?appid=").append(appId);
    sb.append("&secret=").append(appSecret);
    sb.append("&js_code=").append(code);
    sb.append("&grant_type=authorization_code");

    logger.debug("url : " + sb.toString());

    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    RestTemplate restTemplate = new RestTemplate(factory);
    String jsonStr = restTemplate.getForEntity(sb.toString(), String.class).getBody();

    JSONResult result = JSONResult.fail(null);
    try {
        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(jsonStr);
        if (node.isContainerNode() && node.has("openid")) {
            String sessionKey = node.get("session_key").asText();
            String openId = node.get("openid").asText();
            int expiresIn = node.get("expires_in").asInt();

            AES aes = new AES();
            byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));
            if(null != resultByte && resultByte.length > 0){
                String userInfo = new String(resultByte, "UTF-8");
                String phone = "";
                JsonNode nodePhone = mapper.readTree(userInfo);
                if (nodePhone.isContainerNode() && nodePhone.has("purePhoneNumber")) {
                    phone = nodePhone.get("purePhoneNumber").asText();
                }
                result.setSuccess(true);
                result.setContent(phone);
            } else {
                logger.warn("decrypt failed!");
            }
        } else {
            logger.warn(jsonStr);
        }
    } catch (IOException e) {
        e.printStackTrace();
        result.setMessage(e.getMessage());
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
        result.setMessage(e.getMessage());
    }

    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值