温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用uniapp+.net core实现微信小程序获取手机号功能

发布时间:2022-08-30 09:59:49 来源:亿速云 阅读:175 作者:iii 栏目:开发技术

本文小编为大家详细介绍“怎么用uniapp+.net core实现微信小程序获取手机号功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用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

    //小程序写法
    <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
    //uni-app写法
    <button class="wx-login" 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;
            }

    获取截图

    怎么用uniapp+.net core实现微信小程序获取手机号功能

    怎么用uniapp+.net core实现微信小程序获取手机号功能

    读到这里,这篇“怎么用uniapp+.net core实现微信小程序获取手机号功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI