您现在的位置是:网站首页> 编程资料编程资料
uniapp+.net core实现微信小程序获取手机号功能_实用技巧_
2023-05-24
412人已围观
简介 uniapp+.net core实现微信小程序获取手机号功能_实用技巧_
获取手机号
从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级,以下是新版本接口使用指南。( 旧版本接口 目前可以继续使用,但建议开发者使用新版本接口,以增强小程序安全性)
因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。另外,新版本接口 不再 需要提前调用 wx.login 进行登录。
注意:
- 目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限;
- 在使用该接口时,用户可使用微信绑定手机号进行授权,也添加非微信绑定手机号进行授权。若开发者仅通过手机号作为业务关联凭证,在重点场景可适当增加短信验证逻辑。
使用方法
需要将 button 组件 open-type 的值设置为 getPhoneNumber ,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到动态令牌 code ,然后把 code 传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费 code 来换取用户手机号。每个 code 有效期为5分钟,且只能消费一次。
注: getPhoneNumber 返回的 code 与 wx.login 返回的 code 作用是不一样的,不能混用。
前端
template
使用getphonenumber获取回调code
//小程序写法 //uni-app写法
js
调用服务器的url,消费 code 来换取用户手机号
methods: { getPhoneNumber: function(e) { var that = this; var userPhone = uni.getStorageSync('userPhone'); if(userPhone != '') { getApp().globalData.userPhone = userPhone; uni.navigateTo({ url: 'personal' }); return; } if (e.detail.errMsg == "getPhoneNumber:ok") { //端口号是由后端服务器生成 wx.request({ url: '后端服务URL', data: { code: e.detail.code }, method: "get", success: function(res) { uni.setStorageSync('userPhone', res.data); getApp().globalData.userPhone = res.data; uni.navigateTo({ url: 'personal' }); }, fail: function(res) { console.log(res.errMsg) } }) } } }后端
后端使用.net core配置api
appsetting配置
"Wx": { "appid": "", "secret": "", "baseurl": "https://api.weixin.qq.com/", "getToken": "cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", "getuserphonenumber": "wxa/business/getuserphonenumber?access_token={0}" }Startup.cs
注册HttpClient调用微信API
public void ConfigureServices(IServiceCollection services) { services.AddHttpClient("WxClient", config => { config.BaseAddress = new Uri(Configuration["Wx:baseurl"]); config.DefaultRequestHeaders.Add("Accept", "application/json"); }); }public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { GlobalContext.HttpClientFactory = app.ApplicationServices.GetService(); } GlobalContext.cs
获取token方法与获取手机号方法,通过HTTPClient调用获取Token方法,用Token和Code调用 getuserphonenumber获取用户手机号
using System; using System.Reflection; using System.Text; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.Hosting;using Microsoft.AspNetCore.Http; using System.Net.Http; using Newtonsoft.Json; namespace YiSha.Util { public class GlobalContext {public static IHttpClientFactory HttpClientFactory { get; set; } public static IConfiguration Configuration { get; set; }public static string Token { get; set; } public static DateTime TimeOutDate { get; set; } /// /// 获取Token /// /// Item1 Token;Item2 是否成功 public static Result GetToken() { //判断Token是否存在 以及Token是否在有效期内 if (string.IsNullOrEmpty(Token) || TimeOutDate > DateTime.Now) { //构造请求链接 var requestBuild = Configuration["Wx:getToken"]; requestBuild = string.Format(requestBuild, Configuration["Wx:appid"], Configuration["Wx:secret"] ); using (var wxClient = HttpClientFactory.CreateClient("WxClient")) { var httpResponse = wxClient.GetAsync(requestBuild).Result; var dynamic = JsonConvert.DeserializeObject( httpResponse.Content.ReadAsStringAsync().Result ); if (dynamic.errmsg == null)//刷新Token { Token = dynamic.access_token; var expires_in = Convert.ToDouble(dynamic.expires_in); TimeOutDate = DateTime.Now.AddSeconds(expires_in); return new Result(Token); } else { return new Result(errMsg:dynamic.errmsg); } } } else { return new Result(Token); } } public static Result GetUserPhoneNumber(string code) { var token = GetToken(); if(!token.isSuccess) { return token; } //构造请求链接 var requestBuild = Configuration["Wx:getuserphonenumber"]; requestBuild = string.Format(requestBuild, token.data); //建立HttpClient using (var wxClient = HttpClientFactory.CreateClient("WxClient")) { string content = $"{{\"code\":\"[code]\"}}"; byte[] data = Encoding.UTF8.GetBytes(content); var bytearray = new ByteArrayContent(data); var httpResponse = wxClient.PostAsync(requestBuild, bytearray).Result; var dynamic = JsonConvert.DeserializeObject( httpResponse.Content.ReadAsStringAsync().Result ); if (dynamic.errmsg == "ok") return new Result(dynamic.phone_info.phoneNumber.ToString()); else return new Result(errMsg: dynamic.errmsg.ToString()); } } /// /// 返回消息 /// public class Result { public Result() { } /// /// 正确 /// /// public Result(string data) { this.data = data; this.isSuccess = true; } /// /// 错误 /// /// /// public Result(string errMsg,bool isSuccess = false) { this.errMsg = errMsg; this.isSuccess = isSuccess; } public string data { get; set; } public string errMsg { get; set; } public bool isSuccess { get; set; } } } } 调用
[HttpGet] public string GetPhone(string code) { var phone = GlobalContext.GetUserPhoneNumber(code); if(!phone.isSuccess) { //错误处理 } return phone.data; }获取截图


文档传送门:
获取手机号: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
到此这篇关于uniapp+.net core实现微信小程序获取手机号的文章就介绍到这了,更多相关uniapp .net core小程序获取手机号内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
相关内容
- 在Asp.net core项目中使用WebSocket_实用技巧_
- ASP.NET Core实现中间件的几种方式_实用技巧_
- .net程序开发IOC控制反转和DI依赖注入详解_ASP.NET_
- .NET 中配置从xml转向json方法示例详解_ASP.NET_
- 在.NET程序崩溃时自动创建Dump的思路详解_实用技巧_
- 关于EF的Code First的使用以及踩坑记录_实用技巧_
- .NET Core利用BsonDocumentProjectionDefinition和Lookup进行 join 关联查询(推荐)_实用技巧_
- 使用Hangfire+.NET 6实现定时任务管理(推荐)_实用技巧_
- .Net core Blazor+自定义日志提供器实现实时日志查看器的原理解析_实用技巧_
- .Net Core和RabbitMQ限制循环消费的方法_实用技巧_
