搜索

查看: 3103|回复: 11

[ASP.NET] uniapp+.net core实现微信小程序获取手机号功能

[复制链接]
发表于 2023-5-4 11:33:24 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:33:24 3103 11 看全部
目录
  • 获取手机号
  • 注意:
  • 使用方法
  • 前端
  • 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
    //小程序写法

    //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[I]();
    }
    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小程序获取手机号内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-29 00:17:59 | 显示全部楼层
    贰十岁装成熟装s 2023-6-29 00:17:59 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-29 17:36:19 | 显示全部楼层
    123456833 2023-6-29 17:36:19 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-29 20:42:14 | 显示全部楼层
    惜颜705 2023-6-29 20:42:14 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-30 01:03:14 | 显示全部楼层
    贺老师 2023-6-30 01:03:14 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-30 10:15:34 | 显示全部楼层
    井底燕雀傥 2023-6-30 10:15:34 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-30 13:49:16 | 显示全部楼层
    风吹吹蛋蛋疼风w 2023-6-30 13:49:16 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-30 21:41:49 | 显示全部楼层
    dxf17 2023-6-30 21:41:49 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 16:32:28 | 显示全部楼层
    ffycxyw2274436 2023-7-3 16:32:28 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-4 13:56:41 | 显示全部楼层
    无人岛屿颈 2023-7-4 13:56:41 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表