ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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),仅供参考
返回列表