首页/新闻资讯/正文详情

WeiXinMPSDK 微信小程序获取用户手机号(Code 方式)完整实现指南

发布时间:2026/9/25 2:43:30 来源:云帆数科 栏目:资讯中心
WeiXinMPSDK 微信小程序获取用户手机号(Code 方式)完整实现指南
后端即时通讯金融科技【免费下载链接】WeiXinMPSDK微信全平台 .NET SDK Senparc.Weixin for C#支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.项目地址https://gitcode.com/gh_mirrors/we/WeiXinMPSDK点击查看免费下载本文围绕微信小程序“获取手机号”接口的现行方案——客户端获取 code、服务器端凭 code 换取手机号基于 Senparc.Weixin SDK 的开源仓库完整讲解客户端按钮与事件绑定、后端 Controller 实现、SDK 底层BusinessApi调用链以及返回实体Phone_Info的数据结构帮助你在 .NET 技术栈的小程序中落地一套可复制、可运行的手机号获取流程。接口升级背景为什么必须用 Code 方式小程序获取手机号的接口经历过一次升级旧方案已淘汰在客户端通过getphonenumber事件直接拿到iv与encryptedData提交到服务器端用 sessionKey 解密解密方式新方案当前推荐客户端按钮授权后只能拿到一个临时凭证code将code提交到服务器端后台由后台调用微信接口/wxa/business/getuserphonenumber直接换取明文手机号。从仓库中可以看到两种方式的并存痕迹示例项目Senparc.Weixin.WxOpen.AppDemo的首页同时保留了两个按钮左侧为旧式“获取手机号”走DecryptPhoneNumber解密接口右侧为“获取手机号Code”走本文讲解的GetUserPhoneNumber接口这一对比本身也印证了接口的演进过程。整体数据流为用户点击按钮 → 微信弹出授权框 → 用户点【允许】 → 客户端 getphonenumber 事件拿到 e.detail.code → wx.request 请求后端 /WxOpen/GetUserPhoneNumber?codexxx → 后端 BusinessApi.GetUserPhoneNumberAsync(AppId, code) → 微信服务器返回 phone_info → 后端以 JSON 返回给客户端展示或入库客户端按钮与授权事件1. WXML 中放置按钮在小程序首页index.wxml中放置如下按钮button open-typegetPhoneNumber bindgetphonenumbergetUserPhoneNumber typeprimary classbtn-DoRequest hover-classother-button-hover获取手机号code/button仓库中的参考文件Senparc.Weixin.WxOpen.AppDemo/pages/index/index.wxml第 85 行示例项目中的副本Samples/WxOpen/Senparc.Weixin.WxOpen.AppDemo/pages/index/index.wxml两个关键属性的作用属性取值作用open-typegetPhoneNumber声明该按钮用于获取手机号点击后微信弹出系统级授权框bindgetphonenumbergetUserPhoneNumber授权完成后触发的事件处理方法定义在对应 .js 文件中用户点击按钮后微信会弹出系统授权提示点击【允许】后getUserPhoneNumber方法才会被调用事件参数e.detail中携带本次授权的临时凭证code。2. JS 中处理授权事件index.js中对应的事件处理函数原文档示例代码getUserPhoneNumber: function(e){ wx.request({ url: wx.getStorageSync(domainName) /WxOpen/GetUserPhoneNumber?code e.detail.code, success: function (res) { // success var json res.data; if(!json.success){ wx.showModal({ title: 解密过程发生异常, content: json.msg, showCancel: false }); return; } //模态对话框 var phoneNumberData json.phoneInfo; var msg 手机号 phoneNumberData.phoneNumber \r\n手机号不带区号 phoneNumberData.purePhoneNumber \r\n区号国别号 phoneNumberData.countryCode \r\n水印信息 JSON.stringify(phoneNumberData.watermark); wx.showModal({ title: 收到服务器端通过 code 获取的手机号信息, content: msg, showCancel: false }); } }) }仓库中该函数的真实实现位于 Senparc.Weixin.WxOpen.AppDemo/pages/index/index.js与文档示例基本一致并额外打印了console.log(e.detail.code)便于调试。几点实现说明domainName来自本地存储wx.getStorageSync(domainName)即登录流程中缓存的服务器域名避免在代码中硬编码地址e.detail.code是本次授权产生的临时凭证通过 URL Query 传给后端/WxOpen/GetUserPhoneNumber地址由后台用code换取用户的手机号然后进行储存或返回给前端上述模态对话框只是演示作用实际项目中一般不需要再次弹窗展示手机号更常见的做法是后端直接将phone_info与 OpenId 关联落库。后端代码GetUserPhoneNumber 接口原文档给出的后端实现C# / ASP.NET MVCpublic async Task GetUserPhoneNumber(string code) { try { var result await BusinessApi.GetUserPhoneNumberAsync(WxOpenAppId, code); return Json(new { success true, phoneInfo result.phone_info }); } catch (Exception ex) { return Json(new { success false, msg ex.Message }); } }仓库中的参考实现见 WxOpenController.csSenparc.Weixin.Sample.WxOpen项目的/Controllers/WxOpenController.cs实际签名为public async TaskActionResult GetUserPhoneNumber(string code)与文档示例逻辑完全一致。该方法的关键点WxOpenAppId取自配置Config.SenparcWeixinSetting.WxOpenAppId必须与小程序后台的 AppId 保持一致区分大小写Controller 顶部通过public static readonly string WxOpenAppId Config.SenparcWeixinSetting.WxOpenAppId;读取BusinessApi.GetUserPhoneNumberAsyncSDK 提供的异步方法第一参数支持传 access_token 或已注册 AppIdSDK 内部会自动管理凭证第二参数为客户端传来的code统一 JSON 契约成功返回{ success true, phoneInfo ... }失败返回{ success false, msg 异常信息 }与客户端if(!json.success)的判断逻辑对应。其他示例工程中也存在同样的实现可作为对照Senparc.Weixin.Sample.Net10 的 WxOpenController.cs、Senparc.Weixin.Sample.Net8 的 WxOpenController.cs。源码深潜SDK 是如何换取手机号的BusinessApi.GetUserPhoneNumberAsync 的实现打开 SDK 源码 BusinessApi.cs文件头注明其对应微信官方wxa/business接口系列异步方法实现如下/// summary /// 【异步方法】code换取用户手机号。 /// /summary /// param nameaccessTokenOrAppId/param /// param namecode每个code只能使用一次code的有效期为5min/param /// param nametimeOut/param /// returns/returns public static async TaskGetUserPhoneNumberJsonResult GetUserPhoneNumberAsync(string accessTokenOrAppId, string code, int timeOut Config.TIME_OUT) { return await WxOpenApiHandlerWapper.TryCommonApiAsync(async accessToken { string urlFormat Config.ApiMpHost /wxa/business/getuserphonenumber?access_token{0}; string url string.Format(urlFormat, accessToken); var data new { code code }; return await CommonJsonSend.SendAsyncGetUserPhoneNumberJsonResult(accessToken, url, data, CommonJsonSendType.POST, timeOut: timeOut); }, accessTokenOrAppId); }从源码可以看出三个关键事实真实请求地址微信服务器接口为Config.ApiMpHost /wxa/business/getuserphonenumberaccess_token 以 Query 参数形式附加请求方式以 POST JSON 提交请求体只有一个字段{ code: xxx }凭证管理外层包裹WxOpenApiHandlerWapper.TryCommonApiAsync意味着你既可以传入 access_token也可以只传 AppIdSDK 会自动获取并缓存凭证这正是 Controller 中直接传WxOpenAppId也能工作的原因。此外 SDK 还提供了同接口的同步版本GetUserPhoneNumber同文件第 62 行。结合 Controller 文件头部的提示“目前 Senparc.Weixin SDK 已经全面转向异步方法驱动……不再推荐同步方法”实际开发应统一使用Async版本。返回实体结构SDK 将接口返回映射为 GetUserPhoneNumberJsonResult.cs 中定义的强类型实体public class GetUserPhoneNumberJsonResult : WxJsonResult { public Phone_Info phone_info { get; set; } } public class Phone_Info { public string phoneNumber { get; set; } // 完整手机号含区号 public string purePhoneNumber { get; set; } // 手机号不带区号 public int countryCode { get; set; } // 区号国别号中国大陆为 86 public Watermark watermark { get; set; } // 水印信息 } public class Watermark { public int timestamp { get; set; } // 生成时间戳 public string appid { get; set; } // 小程序 appid }这正对应了客户端弹窗中展示的四个字段phoneNumber、purePhoneNumber、countryCode和watermark。由于GetUserPhoneNumberJsonResult继承自WxJsonResult还包含errcode、errmsg字段可用于更细粒度的错误判断。使用注意事项结合源码注释与实现落地时需要特别注意以下几点code 一次性、短时效源码参数注释明确写着“每个 code 只能使用一次code 的有效期为 5min”。因此后端拿到 code 后应立即调用接口不要缓存 code 延后使用用户重新授权会生成新的 code水印校验watermark.appid应等于自己的小程序 AppIdtimestamp用于判断数据新鲜度。仓库中同系列数据如用户信息解密普遍采用decodedEntity.CheckWatermark(WxOpenAppId)的做法参见 WxOpenController.cs 的 DecodeEncryptedData手机号场景下建议同样校验result.phone_info.watermark.appid敏感信息不要回传客户端手机号属于敏感个人信息生产环境建议在服务端直接落库或做业务处理而不是像演示代码那样把完整手机号弹窗展示、甚至回传给小程序端错误分支Controller 统一以{ success false, msg ex.Message }返回异常客户端据此弹出提示实际项目中可在 catch 中追加日志示例 Controller 对 MessageHandler 异常会写入App_Data日志文件可参考其风格接口归属该能力属于小程序WxOpen体系配置项为WxOpenAppId注意不要与公众号MpSetting.WeixinAppId混用。参考文件索引内容路径本文对应的官方指南中文docs/zh/guide/wxopen/get-phone-number.mdSDK 接口实现code 换手机号BusinessApi.cs返回实体定义GetUserPhoneNumberJsonResult.cs后端 Controller 示例WxOpenController.cs小程序客户端按钮WXMLindex.wxml小程序客户端事件处理JSindex.js按上述路径完成客户端按钮绑定、Controller 接口与 SDK 调用三层实现后即可在 .NET 小程序项目中跑通“code 换取手机号”的完整链路。赞分享后端即时通讯金融科技【免费下载链接】WeiXinMPSDK微信全平台 .NET SDK Senparc.Weixin for C#支持 .NET Framework 及 .NET Core、.NET 10.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.项目地址https://gitcode.com/gh_mirrors/we/WeiXinMPSDK点击查看免费下载相关推荐微信小程序GDPR合规终极指南WeiXinMPSDK用户数据保护完整解决方案微信小程序GDPR合规终极指南WeiXinMPSDK用户数据保护完整解决方案 随着全球数据隐私法规的日益严格微信小程序开发者面临着如何在提供优质用户体验的同后端即时通讯金融科技如何快速开发微信小程序插件使用WeiXinMPSDK的完整指南如何快速开发微信小程序插件使用WeiXinMPSDK的完整指南 微信小程序插件开发是提升开发效率和实现功能复用的重要方式。WeiXinMPSDK作为一款专业的后端即时通讯金融科技微信小程序开发终极指南WeiXinMPSDK自动化部署完整教程微信小程序开发终极指南WeiXinMPSDK自动化部署完整教程 想要快速上手微信小程序开发盛派网络推出的WeiXinMPSDK开发工具包为您提供一站式后端即时通讯金融科技上一篇快速开始resmlp_12_224.fb_dino 模型部署与推理的 3 分钟指南下一篇超强文本处理工具sdRust构建的sed革命性替代方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

FOP支持显示中文的详细配置
FOP支持显示中文的详细配置

问题描述FOP在显示中文内容时会将字符显示成#################,本文将通过一个案例详细介绍如何配置并显示中文。 package test;import java.io.*; import javax.xml.transform.*; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSourc… · 2026/9/25 2:43:30

从一份硬件报告生成可用 OpenCore EFI:拆解 OpCore Simplify
从一份硬件报告生成可用 OpenCore EFI:拆解 OpCore Simplify

从一份硬件报告生成可用 OpenCore EFI:拆解 OpCore Simplify 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你盯着两千行的 config.plist… · 2026/9/25 2:43:30

2024上半年系统分析师综合知识真题考点解析与复盘方法
2024上半年系统分析师综合知识真题考点解析与复盘方法

简介:2024上半年系统分析师综合知识真题及答案解析,覆盖计算机组成与体系结构、操作系统、数据库、网络与信息安全等软考核心考点,适合系统分析师考生及对架构设计感兴趣的技术人员用于备考自测。内容包含RISC指令特征、总线分类、SATA接口、… · 2026/9/25 2:43:24

深入解析 Kata Containers 的 containerd 示例命令:从 `ctr run` 到 shimv2 虚拟机工作负载
深入解析 Kata Containers 的 containerd 示例命令:从 `ctr run` 到 shimv2 虚拟机工作负载

云原生容器运行时 【免费下载链接】kata-containers Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolat… · 2026/9/25 3:42:39

GaN高功率链路中90°H面弯波导损耗优化与工程复盘
GaN高功率链路中90°H面弯波导损耗优化与工程复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 3:42:20

PaddleSpeech 声音分类实战:基于 PANNs 预训练模型在 ESC-50 上完成 Finetune、推理与部署
PaddleSpeech 声音分类实战:基于 PANNs 预训练模型在 ESC-50 上完成 Finetune、推理与部署

人工智能语音音频NLP媒体生成 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation … · 2026/9/25 3:42:14

多Agent协作系统实战:从单体AI到工程级协同
多Agent协作系统实战:从单体AI到工程级协同

1. 这不是“多个AI一起写代码”,而是工程级协作系统的诞生现场“当多个 Coding Agent 开始组队,谁来管理它们?”——这句话乍看像一句技术调侃,实则是当前AI工程落地最尖锐的临界点问题。我从去年初开始系统性地把Coding Agent嵌入… · 2026/9/25 3:42:14

CoW大模型机器人实战:接入微信钉钉,配置DeepSeek与多端部署
CoW大模型机器人实战:接入微信钉钉,配置DeepSeek与多端部署

简介:这是一份基于大模型的智能对话机器人项目完整源码包,面向需要快速搭建多端人工智能客服、企业知识助手或私有化对话应用的开发者与运维工程师,旨在解决多渠道接入与多模型切换的繁琐问题。项目内置微信公众号、企业微信、飞书、钉钉等接… · 2026/9/25 3:42:14

Kubebuilder 子模块布局(Sub-Module Layouts):为 API 与 Controller 拆分独立 go.mod 的完整实战指南
Kubebuilder 子模块布局(Sub-Module Layouts):为 API 与 Controller 拆分独立 go.mod 的完整实战指南

开发者工具代码生成CLI云原生后端 【免费下载链接】kubebuilder Kubebuilder - SDK for building Kubernetes APIs using CRDs 项目地址: https://gitcode.com/gh_mirrors/ku/kubebuilder 点击查看 免费下载 导读 Kubebuilder 脚手架默认把 API 类型与 Controller… · 2026/9/25 3:42:07

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码