一、背景
微信小程序手机号授权接口,从23年8月开始实行付费验证。
 
新版手机号授权说明如下:
自2023年8月28日起
【手机号实时验证组件】将需要付费使用。标准单价为:每次组件调用成功,收费0.04元。
【手机号快速验证组件】将需要付费使用。标准单价为:每次组件调用成功,收费0.03元。
两者组件区别是:
  1. 【手机号实时验证组件】:平台会对号码进行验证,但不保证是实时验证
  2. 【手机号实时验证组件】:在每次请求时,平台均会对用户选择的手机号进行实时验证
小程序后台付费管理页面,可以购买次数。如下图(每个小程序账号两个组件各有1000次体验额度,开发测试可以用)

用这个组件可以直接用code获取用户手机号,不需要再用SessionKey去解密手机号了。
正好要做一个小程序项目,打算用新的组件做用户授权。
前端使用:HBuilderX 开发 uniapp(可以生成H5 、APP 和 微信小程序等多家小程序)
后端使用:C# + 盛派SDK
 
二、划重点
1、手机号授权 getPhoneNumber 返回的 {code} 与 wx.login 返回的  {code}  作用是不一样的,不能混用且只能消费一次。
2、wx.login 是静默,可以在用户无感知的情况下用 {code} 换取用户的 【OpenId】。
3、手机号验证组件 会弹出授权窗口(如下图),只有用户点击同意才授权成功,可以拿到手机号。并且实时组件会发送验证码。
三、uniapp前端
uniapp 手机号页面代码 ,使用快速还是实时,看自己需求。
手机号快速验证组件:
1 <template>
2 <view class="content">
3 <view class="text-area">
4 <button open-type="getPhoneNumber" @getphonenumber="GetPhoneNumber">手机号快捷登录</button>
5 </view>
6 </view>
7 </template>
手机号实时验证组件(会有验证码):
1 <template>
2 <view class="content">
3 <view class="text-area">
4 <button open-type="getRealtimePhoneNumber"@getrealtimephonenumber="getPhone">获取实时手机号码</button>
5 </view>
6 </view>
7 </template>
JS代码:
1 methods: {
2 //手机号授权
3 GetPhoneNumber: function(Res) {
4 let Container = this;
5 // 动态令牌
6 var Code = Res.detail.code;
7 },
8 }
如果获取到的code为空,可能是用户拒绝了授权,可以弹出【友好提示】请求再次授权。
用户授权成功后,拿到的正确响应如下图:
我们只需要用到code
用户拒绝授权,会得到这样的响应:
四、C#服务端
这里用到盛派的微信小程序SDK,需要引用相关NuGet包:Senparc.Weixin.WxOpen
 
C#代码:
使用盛派SDK:BusinessApi.GetUserPhoneNumber(" 可以放微信accessToken或者微信小程序AppId "," 前端手机号授权得到的code ")
盛派官方推荐使用 微信小程序AppId,系统会自动管理密钥的周期(如果过期会再次更新)
 1 try
2 {
3 #region code换用户手机号
4
5 //code换用户手机号
6 var UserMobilePhoneResult = BusinessApi.GetUserPhoneNumber("微信的动态令牌AccessToken", "前端拿到的code");
7 //手机号
8 String MobilePhone = MemberUserMobilePhoneResult.phone_info.purePhoneNumber;
9
10 #endregion code换用户手机号
11 }
12 catch (ErrorJsonResultException err)
13 {
14 return (XCXAccountUpdateMemberUserMobilePhoneResponse)SetExceptionError(MyResponse, err, -1, "手机号获取失败," + "错误原因:" + err.Message);
15 }
16 catch (Exception err)
17 {
18 return (XCXAccountUpdateMemberUserMobilePhoneResponse)SetExceptionError(MyResponse, err, -1, "手机号获取失败");
19 }
我项目有windows service (服务) 在服务器上24小时循环检查,统一生成微信小程序动态令牌AccessToken,所以我这里用的密钥。接口地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApIdoc/mp-access-token/getStableAccessToken.html
盛派SDK也可以,获取微信的小程序动态令牌AccessToken:
String AccessToken = AccessTokenContainer.GetAccessToken(WXXCXAppID);
如果遇到这样的错误,说明没有注册盛派相关服务。可以看官方解决文档:https://www.cnblogs.com/szw/p/9265828.html
 
注册代码:
在global.asax.cs 文件的 Application_Start() 方法中,加入代码(注意 using 两个命名空间:Senparc.CO2NET 和 Senparc.Weixin):
 1 #region 注册(激活)盛派SDK 微信使用
2 try
3 {
4 //设置全局 Debug 状态
5 var isGLobalDebug = true;
6 var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug);
7 //CO2NET全局注册,必须!
8 var register = RegisterService.Start(senparcSetting).UseSenparcGlobal();
9 //设置微信 Debug 状态
10 var isWeixinDebug = true;
11 var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug);
12 //微信全局注册,必须!
13 register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);
14
15 //根据APPId判断获取
16 if (!AccessTokenContainer.CheckRegistered(WXXCXAppId))//检查是否已经注册
17 {
18 //注册小程序凭证
19 await AccessTokenContainer.RegisterAsync(小程序的AppId, 小程序的密钥AppSecret, "【xxxxxxxx】小程序");
20 }
21 }
22 catch (Exception ex)
23 {
24 Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("系统日志", ex.Message);
25 }
26 #endregion 注册(激活)盛派SDK 微信使用

23年9月最新微信小程序 手机号授权 (uniapp+盛派SDK) 帮你踩坑的更多相关文章

  1. 微信小程序开发 (资料汇总,谁还没被坑过?希望助你绕过一些坑)

    最近帮人家做一个微信小程序,刚好想熟悉一下.由于牵扯到多用户使用系统,以及数据共享,所以自然架构选择了,客户端和服务器的方式. 后台服务器是windows server,后台程序是.Net  WebA ...

  2. 微信小程序集成腾讯云 IM SDK

    微信小程序集成腾讯云 IM SDK 1.背景 因业务功能需求需要接入IM(即时聊天)功能,一开始想到的是使用 WebSocket 来实现这个功能,然天意捉弄(哈哈)服务器版本太低不支持 wx 协议(也 ...

  3. 微信小程序转化为uni-app项目

    前言: 之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的功能,但是由于自己前端抠脚的原因没有写出来,然后自己在网上搜索的时候发现了有个微信小程序里面的页面及其的符合我的需求.那么问题 ...

  4. 微信小程序项目转换为uni-app项目

    一.它是谁? [miniprogram-to-uniapp]转换微信小程序"项目为uni-app项目.原则上混淆过的项目,也可以进转换,因为关键字丢失,不一定会完美. 二.它的原理是什么? ...

  5. 关于微信小程序拒绝授权后,重新授权并获取用户信息

    最近公司做了一些有关微信小程序的项目,涉及到授权获取用户基本信息,但是在拒绝授权之后就不会再出现授权窗口: 看网上也有很多人遇到了同样的问题,所以记录下来我的处理方法,供大家和自己学习和记录: 当调用 ...

  6. 微信小程序button授权页面,用户拒绝后仍可再次授权

    微信小程序授权页面,进入小程序如果没授权跳转到授权页面,授权后跳转到首页,如果用户点拒绝下次进入小程序还是能跳转到授权页面,授权页面如下 app.js  中的 onLaunch或onShow中加如下代 ...

  7. 微信小程序拒绝授权后重新拉起授权窗口

    问题: 在首次进入小程序时,我们常常会收到一些获取权限的申请,比如「获取地理位置权限」.需要微信登录时请求「获得你的公开信息(昵称.头像等)」.对于这些权限申请,开发者当然希望获得所有权限,而用户拒绝 ...

  8. 微信小程序+php 授权登陆,完整代码

    先上图        实现流程: 1.授权登陆按钮和正文信息放到了同一个页面,未授权的时候显示登陆按钮,已授权的时候隐藏登陆按钮,显示正文信息,当然也可以授权和正文分开成两个页面,在授权页面的onlo ...

  9. WebAPI 微信小程序的授权登录以及实现

    这个星期最开始 ,老大扔了2个任务过来,这个是其中之一.下面直接说步骤: 1.  查阅微信开发文档  https://developers.weixin.qq.com/miniprogram/dev/ ...

  10. uni-app微信小程序登录授权

    微信小程序授权是非常简单和常用的功能,但为了方便,还是在此记录一下要点: 首先是需要用到一个授权按钮来触发获取用户信息授权: 关键在于 open-type 为 getUserInfo , 然后有个@g ...

随机推荐

  1. 深入探究for...range语句

    1. 引言 在Go语言中,我们经常需要对数据集合进行遍历操作.对于数组来说,使用for语句可以很方便地完成遍历.然而,当我们面对其他数据类型,如map.string 和 channel 时,使用普通的 ...

  2. CANoe学习笔记(二):创建第一个事件触发帧(基于LIN)

    内容: 创建一个事件触发帧: 包含几个不同无条件帧: 事件触发帧的触发: 事先准备: 创建三个文件夹,用来放不同类型文件: 工程创建 新建一个Lin工程,双击即可,然后命名为LINconf保存. 创建 ...

  3. CF1442D Sum

    题意 有 \(n\) 个不降的非负整数数组,每个数组可以不取或取一个前缀,总共要取 \(k\) 个元素,问取到的和最大多少. 题解 结论题,但是想到结论还不会. 首先,我们只会有一个数组没选完,其它要 ...

  4. 计算机网络那些事之 MTU 篇 pt.2

    哈喽大家好,我是咸鱼 在<计算机网络那些事之 MTU 篇 >中,咸鱼跟大家介绍了 MTU 是指数据链路层能够传输的最大数据帧的大小 如果发送的数据大于 MTU,则就会进行分片操作(Frag ...

  5. 一次oracle行级锁导致的问题

    分析问题:我在plsql/developer是用的system用户连接的数据库,而在crt用  sqlplus / as  sysdba 连接数据库,是sys用户.现在在plsql/developer ...

  6. Excel 进度图表制作

    Excel 改变图标的形状 最终效果 过程有点杂乱,不再重新整理,基本照着下面的设就完事了. 未完成的想用柱型,和已完成的相结合 右击,更改表类型 选择簇状柱形图.次标轴 注意主.次坐标 进度改为折线 ...

  7. 阿里云容蓓:DCDN 助力云原生时代的应用构建及最佳实践

    在数字化转型速度不断提升的今天,大带宽.低时延.高并发的场景不断涌现,内容分发网络(Content Delivery Network,CDN)应用需求还在不断攀升,打造更高质量的CDN服务将成为新时代 ...

  8. 订单逆向履约系统的建模与 PaaS 化落地实践

    导读 本文重点介绍了京东零售电商业务在订单逆向履约上面的最佳技术实践,京东零售快退平台承接了零售几乎所有售前逆向拦截和退款业务,并在长期的业务和技术探索中沉淀了丰富的业务场景设计方案.架构设计经验,既 ...

  9. 介绍一个简易的MAUI安卓打包工具

    介绍一个简易的MAUI安卓打包工具 它可以帮助进行MAUI安卓的打包. 虽然也是用MAUI写的,但是只考虑了Windows版本,mac还不太会. 没什么高级的功能,甚至很简陋,它能做的,只是节省你从M ...

  10. 一分钟学一个 Linux 命令 - rm

    前言 大家好,我是 god23bin,欢迎回到咱们的<一分钟学一个 Linux 命令>系列,今天我要讲的是一个比较危险的命令,rm 命令,没错,你可以没听过 rm 命令,但是删库跑路你不可 ...