uniapp+.net core實現微信小程序獲取手機號功能
目錄
- 獲取手機號
- 注意:
- 使用方法
- 前端
- template
- js
- 后端
- appsetting配置
- Startup.cs
- GlobalContext.cs
- 調用
- 獲取截圖
獲取手機號
從基礎庫 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
//小程序寫法<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>//uni-app寫法<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信用戶一鍵登錄</button>
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<IHttpClientFactory>();}
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; }/// <summary>/// 獲取Token/// </summary>/// <returns>Item1 Token;Item2 是否成功</returns>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<dynamic>( 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<dynamic>( httpResponse.Content.ReadAsStringAsync().Result );if (dynamic.errmsg == "ok") return new Result(dynamic.phone_info.phoneNumber.ToString());else return new Result(errMsg: dynamic.errmsg.ToString()); }}/// <summary>/// 返回消息/// </summary>public class Result{ public Result() { } /// <summary> /// 正確 /// </summary> /// <param name="data"></param> public Result(string data) {this.data = data;this.isSuccess = true; } /// <summary> /// 錯誤 /// </summary> /// <param name="errMsg"></param> /// <param name="isSuccess"></param> 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小程序獲取手機號內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
