微信小程序获取用户手机号授权

本文详细介绍了在微信小程序中获取用户手机号的步骤:首先调用wx.login接口,然后通过button触发授权弹窗获取encryptedData和iv。接着,利用这些参数结合sessionKey向后端发起请求,后端解密数据并返回用户手机号。在过程中,还涉及到sessionKey的检查和刷新,以及uni.login接口的使用来获取openid。

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

1、获取微信用户绑定的手机号,需要先在主页面调用wx.login接口
2、使用button按钮触发授权弹窗 <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号码</button>
3、通过参数【encryptedData】,【iv】,【sessionKey】请求后端接口,传入上面获取到的参数,后端进行解密然后返回用户手机号

getPhoneNumber(e){
    console.log(e.detail.errMsg);//
    console.log(e.detail.iv);//加密算法的初始向量
    console.log(e.detail.encryptedData);//包括敏感数据在内的完整用户信息的加密数据

	const _this = this
    if (e.detail.encryptedData && e.detail.iv) {
		wx.checkSession({ //监测登录是否过期
			success() {
				// authorLogin方法为请求的后台接口
				const res = await this.authorLogin({
                  catgory: _this.choosedSubjectData.categoryId,
                  encryptedData: e.detail.encryptedData,
                  iv: e.detail.iv,
                  openId: _this.openid,
                  terminal: 21,
                  promoterInfoId:_this.qudaoInfo,
                  appletLoginFrom,
                  type: 1,
                  unionid: uni.getStorageSync('unionid')
                })
                console.log(res); // 此时的res返回用户手机号
			},
            fail() { // session_key 已经失效,需要重新执行登录流程
                _this.getUserOpenId() //重新登录,getOpenId为后端接口,
            }
		})
	}
}
getUserOpenId() {
	uni.login({
    	success: data => {
    		// data.code作为参数传给给后台
        	console.log(data.code,1111)
        	// 此时传入加密的code码,后端会返回用户unionid、openid等信息
	        this.getOpenId({ code: data.code }).then(res => {
                uni.setStorageSync('unionid', res.data.unionid) //存入缓存待用
                resolve(res.data.openid)
            }).catch(err => {
            	reject(err)
            })
        },
        fail: err => {
             console.log('uni.login 接口调用失败,将无法正常使用开放接口等服务', err)
             reject(err)
        }
   })
}
### 微信小程序2025用户手机号授权登录实现方法 #### 设计概述 为了实现在微信小程序中通过手机号授权完成用户登录功能,在2025年的背景下需考虑官方政策变化和技术更新。当前,获取用户手机号已涉及费用问题[^3]。 #### 前端uni-app配置 在前端部分采用uni-app框架构建界面并处理用户交互逻辑: 1. **引入必要的API接口** 需要调用微信开放平台提供的`wx.login()` 和 `getPhoneNumber` API 来发起请求。 2. **页面布局与事件绑定** 创建按钮触发获取手机号权限操作,并监听回调函数处理返回数据。 ```html <template> <view class="container"> <!-- 获取手机号 --> <button open-type="getPhoneNumber" @getphonenumber="bindGetPhone">点击授权</button> </view> </template> <script setup lang="ts"> import { ref } from 'vue'; const bindGetPhone = (e:any)=>{ console.log(e.detail.errMsg); console.log(e.detail.iv); console.log(e.detail.encryptedData); } </script> ``` #### 后端Spring Boot服务端设置 服务器侧负责解密来自客户端加密后的敏感资料以及验证身份合法性: 1. **依赖项管理** 添加WeChat Mini Program SDK到项目pom.xml文件以便于后续编码工作。 2. **编写控制器类** 定义接收参数的方法并将解析结果反馈给小程序端。 ```java @RestController @RequestMapping("/api/wechat") public class WeChatController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 处理从前端传来的code换取session_key和openid */ @PostMapping("/login") public ResponseEntity<String> login(@RequestParam String code){ // 调用微信接口获得 session_key, openid 等信息... return new ResponseEntity<>("success", HttpStatus.OK); } /** * 解析由前端发送过来的 encryptedData 参数得到明文手机号 */ @PostMapping("/decryptMobile") public ResponseEntity<Map<String,Object>> decryptMobile( @RequestBody Map<String,String> param){ try{ WXBizDataCrypt wc = new WXBizDataCrypt(param.get("appid"),param.get("sessionKey")); String result = wc.decrypt(param.get("iv"),param.get("encryptedData")); JSONObject jsonObject = JSON.parseObject(result); HashMap<String,Object> resultMap=new HashMap<>(); resultMap.put("phoneNumber",jsonObject.getString("purePhoneNumber")); return new ResponseEntity<>(resultMap,HttpStatus.OK); } catch(Exception e){ logger.error("Error occurred while processing request.",e); throw new RuntimeException(); } } } ``` 考虑到未来可能存在的调整,建议开发者密切关注微信公众平台发布的最新文档指南以确保应用持续合规运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值