功能描述

用户在使用小程序进行各项业务的时候,我们需要获取到用户的手机号,以进行注册。以便在提供服务的过程中,方便和用户进行联系。

获取用户手机号功能授权

将获取用户手机号功能添加到小程序能力列表中

在这里插入图片描述

授权请确认是否可以申请用户信息

如果出现如下图所示的,操作列中的获取用户信息超链接没有显示出来,并且鼠标移动到上面出现了这个提示,那么需要进入到小程序的基本设置中,去check一下,小程序的主营行业类目是否填写了。如果不填写是不允许申请的。
在这里插入图片描述
如果可以的话,可以从下图中进行编辑添加。
在这里插入图片描述

用户信息申请

用户信息申请的时候需要用户使用支付宝小程序制作相关的用户手机号使用授权场景。并且截图需严格按照如下所示,进行申请。不然很可能通不过。
在这里插入图片描述

技术实现

支付宝小程序获取用户手机号相关文档地址

uniapp前端部分

这里需要注意的是下面的这个代码中的**@getAuthorize@error**在uniapp官网和支付宝小程序的关于获取用户手机号部分貌似都是找不到的。存在不同,需要注意修改

页面布局代码

<button class="login-btn" open-type="getAuthorize" @getAuthorize="onGetPhoneAuth" @error="onAuthError"
	scope="phoneNumber">
	授权手机号
</button>

js代码

获取用户的授权后的加密字符串。

my.getPhoneNumber({
	success: (res) => {
			let encryptedData = res.response;
			console.log(encryptedData);
			let wxUserStr = uni.getStorageSync("wechatUser")
			if (wxUserStr == null || wxUserStr == '') {
				this.hiddenUserInfo = true
				uni.showToast({
					icon: 'none',
					title: '用户未授权'
				})
				return
			}
			//	执行登录
			let data = JSON.parse(wxUserStr)
			data.encryptedData = encryptedData
		},
	fail: (res) => {
		console.log(res);
		console.log('getPhoneNumber_fail');
	}
});

后端实现

下面的代码中需要注意的两点是有两个key。分别是“signVeriKey ”和“decryptKey ”。其中“signVeriKey ”对应的是支付宝公钥。“decryptKey ”对应的是支付宝小程序设置里面的接口内容key。
signVeriKey
在这里插入图片描述

signVeriKey
在这里插入图片描述

private void decrypt(String encryptedData) throws Exception {
        //1. 获取验签和解密所需要的参数
//        Map<String, String> openapiResult = JSON.parseObject(encryptedData,
//                new TypeReference<Map<String, String>>() {
//                }, Feature.OrderedField);
        Map<String, String> openapiResult = objectMapper.readValue(encryptedData, Map.class);
        String signType = "RSA2";
        String charset = "UTF-8";
        String encryptType = "AES";
        String sign = openapiResult.get("sign");
        String content = openapiResult.get("response");

        //如果密文的
        boolean isDataEncrypted = !content.startsWith("{");
        boolean signCheckPass = false;

        //2. 验签
        String signContent = content;
        //  你的小程序对应的支付宝公钥(为扩展考虑建议用appId+signType做密钥存储隔离)
        String signVeriKey = appProperties.getMAlipay().getMicroAppPublicKey();
        //  你的小程序对应的加解密密钥(为扩展考虑建议用appId+encryptType做密钥存储隔离)
        String decryptKey = "sfsfsdfsdfsdfsdfsdfsdfsfsdfs";
        //如果是加密的报文则需要在密文的前后添加双引号
        if (isDataEncrypted) {
            signContent = "\"" + signContent + "\"";
        }
        try {
            signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
        } catch (AlipayApiException e) {
            //验签异常, 日志
        }
        if (!signCheckPass) {
            //验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
            throw new Exception("验签失败");
        }

        //3. 解密
        String plainData = null;
        if (isDataEncrypted) {
            try {
                AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
            } catch (AlipayApiException e) {
                //解密异常, 记录日志
                throw new Exception("解密异常");
            }
        } else {
            plainData = content;
        }
    }

在这里插入图片描述

至此,代码部分的编写基本就可以了。

问题摘要

1、解析加密字段时报错“ISV权限不足,建议在开发者中心检查对应功能是否已经添加”

如果遇到这个问题,大概率是用户能力列表中没有添加“获取用户手机号”能力。或者是添加了该项能力,但是未进行用户信息申请。可按照本文档前面部分操作。
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐