获取手机号

从基础库 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;
}

获取截图

文档传送门:

获取手机号:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

uniapp+.net core 小程序获取手机号的更多相关文章

  1. thinkphp3.2.3 小程序获取手机号 php 解密

    首先是把这个文件夹放到\ThinkPHP\Library\Org里面 //zll 根据加密字符串和session_key和iv获取手机号 /** * [getphone description] * ...

  2. uniapp|微信小程序获取当前城市名称--逆地址解析

    六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,只分享技术干货,项目实战经验 关注博主不迷路~ 问题 uniapp开发的小程序需要获取当前城市名称 解决步骤 看文档 当然是看uniapp文档,我 ...

  3. 微信小程序获取手机号

    wxml 代码: <!-- 授权 --> <button type="primary" open-type="getUserInfo" bin ...

  4. 小程序~获取手机号getPhoneNumber提示该appid没有权限

    处理思路 (1)小程序是不是企业主体 (2)有没有进行认证 (3)如果没有 是不可以获取用户手机号码的 .

  5. nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId

    nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId 前言: 我准备用nodejs+koa+uniapp实现一款餐饮点单小程序,以及nodejs+koa+vue实现后端管理 ...

  6. 微信小程序获取登录手机号

    小程序获取登录用户手机号. 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button> 组件的点击来触发. 首先,放置一个 button 按钮,将 ...

  7. 微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...

  8. uniapp的微信小程序,获取授权,获取中文街道地理位置

    w问题描述:在微信小程序模拟器上运行获取坐标时 获取不到信息,原因是 没有调起默认地理位置: 解决办法:或者在manifest.json的源码视图中配置:配置appid和地理位置 默认弹起获取地理位置 ...

  9. 使用uView UI+UniApp开发微信小程序

    在前面随笔的介绍中,我们已经为各种框架,已经准备了Web API.Winform端.Bootstrap-Vue的公司动态网站前端.Vue&Element的管理前端等内容,基本都是基于Web A ...

随机推荐

  1. 【Redis】Redis Cluster初始化及PING消息的发送

    Cluster消息类型定义 #define CLUSTERMSG_TYPE_PING 0 /* Ping消息类型,节点间进行通信交换信息的消息 */ #define CLUSTERMSG_TYPE_P ...

  2. 一篇文章带你使用Typescript封装一个Vue组件

    一.搭建项目以及初始化配置 vue create ts_vue_btn 这里使用了vue CLI3自定义选择的服务,我选择了ts.stylus等工具.然后创建完项目之后,进入项目.使用快捷命令code ...

  3. 你真的了解git的分支管理跟其他概念吗?

    现在前端要学的只是太多了,你是不是有时会有这个想法,如果我有两个大脑.一个学Vue,一个学React,然后到最后把两个大脑学的知识再合并在一起,这样就能省时间了. 哈哈,这个好像不能实现.现实点吧!年 ...

  4. js 表面使用 表面学习 -输出

    JavaScript 能够以不同方式"显示"数据: 使用 window.alert() 写入警告框 使用 document.write() 写入 HTML 输出 使用 innerH ...

  5. UiPath官网认证中文教程

    RPA之家公众号:RPA之家 RPA之家官网:http://rpazj.com 斗鱼直播:http://www.douyu.com/rpazj UiPath中文社区QQ群:465630324 RPA& ...

  6. 高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏

    1. MySQL主从同步实现方式 MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句. Bin Log共有三种日志格式,可以binlog_format配置参数指定. ...

  7. 【cartographer_ros】五: 发布和订阅陀螺仪Imu信息

    上一节介绍了里程计Odometry传感数据的订阅和发布. 本节会介绍陀螺仪Imu数据的发布和订阅.陀螺仪在cartographer中主要用于前端位置预估和后端优化. 目录 1:sensor_msgs/ ...

  8. java中的内存划分和一个数组的内存图

    内存概述 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存   Java虚拟机要运行程序 ...

  9. 牛客SQL刷题第一趴——非技术入门基础篇

    user_profile表: id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male   ...

  10. ESXI启用本地登录和SSH服务连接功能,使用Xshell连接

    1.选中Troubleshoot Options进行SSH服务配置 2.开启本地登录功能 3.开启远程连接功能 4.本地登录修改SSH服务允许基于密码登录 默认无法用密码登录ssh服务,只支持基于ke ...