一、背景
微信小程序手机号授权接口,从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. 9.3 Django框架

    Django 是一个非常流行的 Python Web 开发框架,它是完整且强大的,适用于构建大型 Web 应用.在这一章节中,我们将详细介绍 Django 的基本概念.组件和用法.为了便于理解,我们将 ...

  2. vue3实现H5网页录音并上传(mp3、wav)兼容Android、iOS和PC端

    使用 Recorder插件 可以在HTML5网页中进行录音,录音完成后得到blob文件对象,然后将blob上传到服务器:项目使用的vue3.0版本(这个插件同时支持vue2.0.也支持uniapp,很 ...

  3. NVIDIA Maxine Video Effects SDK 編程指南 - 实践小记

    NVIDIA Maxine Video Effects SDK 編程指南 - 实践小记 本篇博客重点只说Video Effect的部分,此外还有Audio Effect的部分.还有AR部分,不在本篇范 ...

  4. Linux 线程传递参数

    1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <u ...

  5. 效率神器,边看网页边问ChatGPT!神级ChatGPT插件(浏览器扩展)推荐!

    如果在看一个网页时,有些词不认识.句子不知道含义,怎么办? 憨憨版:不认识就算了呗,还能咋滴 进阶版:复制到 Google/Baidu 里问一问: AI达人版:复制到 ChatGPT/Claude 里 ...

  6. 从n个不同元素中有放回的取出r个且不计顺序,有多少种不同的取法?

    从n个不同元素中有放回的取出r个且不计顺序,有多少种不同的取法? 答案是:\(C_{n+r-1}^r\) 解析 因为是有放回地取出,所以同一个元素可能会被取多次,并且取出的元素是不计顺序的,那么如果我 ...

  7. 高可用只读,让RDS for MySQL更稳定

    摘要:业务应用对数据库的数据请求分写请求(增删改)和读请求(查).当存在大量读请求时,为避免读请求阻塞写请求,数据库会提供只读实例方案.通过主实例+N只读实例的方式,实现读写分离,满足大量的数据库读取 ...

  8. JavaScript高级学习

    JavaScript 进阶 学习作用域.变量提升.闭包等语言特征,加深对 JavaScript 的理解,掌握变量赋值.函数声明的简洁语法,降低代码的冗余度. 理解作用域对程序执行的影响 能够分析程序执 ...

  9. 如何使用libswscale库将YUV420P格式的图像序列转换为RGB24格式输出?

    一.视频格式转换初始化 将视频中的图像帧按照一定比例缩放或指定宽高进行放大和缩小是视频编辑中最为常见的操作之一,这里我们将1920x1080的yuv图像序列转换成640x480的rgb图像序列,并输出 ...

  10. 对敏感操作的二次认证 —— 详解 Sa-Token 二级认证

    一.需求分析 在某些敏感操作下,我们需要对已登录的会话进行二次验证. 比如代码托管平台的仓库删除操作,尽管我们已经登录了账号,当我们点击 [删除] 按钮时,还是需要再次输入一遍密码,这么做主要为了两点 ...