【小程序开发实战】使用WxJava实现手机号获取
之前编写小程序获取手机号相关的代码均为自行封装,最近发现了 WxJava 的存在,方便了开发。
本篇文章将讲解如何使用WxJava进行手机号的获取。
** 旧版本 **
微信接口官方文档
思路
需要将 button 组件 open-type
的值设置为 getPhoneNumber
,当用户点击并同意之后,可以通过 bindgetphonenumber
事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key
以及 app_id
进行解密获取手机号。
总结为以下两个步骤:
- 通过使用 button getPhoneNumber 可获取到 返回的加密数据。
- 然后将加密数据结合 session_key 以及 app_id 进行解密获取手机号。
因此想要获得使用者的手机号,我们需要传入 session_key, app_id 以及 前端调用微信服务器返回的加密数据。
- 如何获取 session_key 和 app_id 呢?
前端获取jsCode后并调用 auth.code2Session 接口即可。
因此我们只需要将 jsCode 以及 加密数据 传给接口即可。
整体思路总结
- 前端给后端传递 jsCode,加密数据参数(iv,encryptedData)。
- 然后使用 jsCode,绑定的 appId 以及 appSecret 调用 auth.code2Session 接口 获取到 session_key,app_id 。
- 使用 session_key,app_id 对加密数据进行解密获取到用户手机号。
代码实现
这里使用了 wxjava。因此代码非常的简洁。我们只需要理解整体的思路就好了。
整体架构
wxMaConfigration
/** * @author <a href="https://github.com/binarywang">Binary Wang</a> */@Slf4j
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration { private final WxMaProperties properties; @Autowired public WxMaConfiguration(WxMaProperties properties) { this.properties = properties; } @Bean public WxMaService wxMaService() { List<WxMaProperties.Config> configs = this.properties.getConfigs(); if (configs == null) { throw new WxRuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!"); } WxMaService maService = new WxMaServiceImpl(); maService.setMultiConfigs( configs.stream() .map(a -> { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
// WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool()); // 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常 config.setAppid(a.getAppid()); config.setSecret(a.getSecret()); config.setToken(a.getToken()); config.setAesKey(a.getAesKey()); config.setMsgDataFormat(a.getMsgDataFormat()); return config; }).collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, a -> a, (o, n) -> o))); return maService; } @Bean public WxMaMessageRouter wxMaMessageRouter(WxMaService wxMaService) { final WxMaMessageRouter router = new WxMaMessageRouter(wxMaService); router .rule().handler(logHandler).next() .rule().async(false).content("订阅消息").handler(subscribeMsgHandler).end() .rule().async(false).content("文本").handler(textHandler).end() .rule().async(false).content("图片").handler(picHandler).end() .rule().async(false).content("二维码").handler(qrcodeHandler).end(); return router; } private final WxMaMessageHandler subscribeMsgHandler = (wxMessage, context, service, sessionManager) -> { service.getMsgService().sendSubscribeMsg(WxMaSubscribeMessage.builder() .templateId("此处更换为自己的模板id") .data(Lists.newArrayList( new WxMaSubscribeMessage.MsgData("keyword1", "339208499"))) .toUser(wxMessage.getFromUser()) .build()); return null; }; private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> { log.info("收到消息:" + wxMessage.toString()); service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson()) .toUser(wxMessage.getFromUser()).build()); return null; }; private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) -> { service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息") .toUser(wxMessage.getFromUser()).build()); return null; }; private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> { try { WxMediaUploadResult uploadResult = service.getMediaService() .uploadMedia("image", "png", ClassLoader.getSystemResourceAsStream("tmp.png")); service.getMsgService().sendKefuMsg( WxMaKefuMessage .newImageBuilder() .mediaId(uploadResult.getMediaId()) .toUser(wxMessage.getFromUser()) .build()); } catch (WxErrorException e) { e.printStackTrace(); } return null; }; private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> { try { final File file = service.getQrcodeService().createQrcode("123", 430); WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file); service.getMsgService().sendKefuMsg( WxMaKefuMessage .newImageBuilder() .mediaId(uploadResult.getMediaId()) .toUser(wxMessage.getFromUser()) .build()); } catch (WxErrorException e) { e.printStackTrace(); } return null; }; }
wxMaProperties
@Data
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMaProperties { private List<Config> configs; @Data public static class Config { /** * 设置微信小程序的appid */ private String appid; /** * 设置微信小程序的Secret */ private String secret; /** * 设置微信小程序消息服务器配置的token */ private String token; /** * 设置微信小程序消息服务器配置的EncodingAESKey */ private String aesKey; /** * 消息格式,XML或者JSON */ private String msgDataFormat; } }
wxcontroller
@RestController
@RequestMapping("/wx")
@AllArgsConstructor
public class WxController { private final WxMaService wxMaService; @PostMapping("/decrypt") public JSONObject decrypt(@RequestBody AuthDto authDto) throws WxErrorException { WxMaJscode2SessionResult wxMaJscode2SessionResult = new WxMaJscode2SessionResult(); try{ wxMaJscode2SessionResult = wxMaService.jsCode2SessionInfo(authDto.getJsCode()); } catch (Exception e){ throw e; } WxMaPhoneNumberInfo phoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(wxMaJscode2SessionResult.getSessionKey(),authDto.getEncryptedData(), authDto.getIv()); JSONObject result = new JSONObject(); HashMap<String,Object> resultMap = new HashMap<>(); resultMap.put("data",phoneNumberInfo); result.put("result",resultMap); return result; } }
application.yml
wx: miniapp: configs: appid: '自己的小程序appid' secret: 'appsecret' token: #微信小程序消息服务器配置的token aesKey: #微信小程序消息服务器配置的EncodingAESKey msgDataFormat: JSON
【小程序开发实战】使用WxJava实现手机号获取相关推荐
- 微信小程序|开发实战篇之一
开发实战篇之一 前言 1.通用方法的封装 2.数据获取方法的封装 2.1 抽离classic.js中的request()方法 2.2 组件数据传递 3.movie组件的创建 3.1 组件代码开发 3. ...
- 微信小程序|开发实战篇之四
开发实战篇之四 前言 1.用户页面my的开发 1.1 my.wxml骨架文件 1.2 my页面的布局和样式分析 1.2.1 从原型页面来分析: 1.2.2 继续分析每个大组件中的小组件布局: 1.3 ...
- 微信小程序|开发实战篇之三
开发实战篇之三 前言 1.使用Promise获取多个异步方法的结果 2.高阶组件-search 2.1 search组件的基本结构 2.1.1 search组件的骨架index.wxml文件 2.1. ...
- 微信小程序|开发实战篇之二
开发实战篇之二 前言 1.零碎知识点和优化点 1.1 ES6模板字符串 1.2 ES6扩展运算符 1.3 独立更新like组件状态 1.4 自定义组件支持hidden 2.音乐music组件开发 2. ...
- 视频教程-微信小程序开发实战之番茄时钟开发-微信开发
微信小程序开发实战之番茄时钟开发 4年web前后端开发经验,熟悉PHP,Python后端技术,熟悉基于Lnmp环境的项目开发和部署,擅长Yii,ThinkPHP,CI,Django,Flask等国内外 ...
- 微信小程序开发实战(9):单行输入和多行输入组件
-----------支持作者请转发本文----------- 1. 单行输入组件(input) input组件用于录入单行文本,尽管input的基本功能是文本录入,但该组件的属性还是比较多的,也比 ...
- JEECG社区微信小程序开发实战-张代浩-专题视频课程
JEECG社区微信小程序开发实战-511人已学习 课程介绍 微信小程序开发培训,包含环境搭建.实例讲解.对接支付功能等课题. 课程收益 微信小程序开发培训,包含环境搭建.实例讲 ...
- 《微信小程序开发实战》课后题
黑马程序员版<微信小程序开发实战> 第一章 填空题 1.微信小程序可以通过________方式打开. 答案:扫描二维码 2.微信开发者工具中的上传是指将代码上传到________. 答案: ...
- 微信小程序python入门教程-2020Python+微信小程序开发实战(视频+课件)
本套课程出自老男孩IT教程的Python+微信小程序开发实战官网售价79元,课程基于微信小程序平台开发的的拍卖系统.课程分为4个章节微信小程序快速入门用微信小程序快速开发认证和发布动态模块,第二章拍卖 ...
- 微信小程序开发实战课程之油耗计算器-耿广龙-专题视频课程
微信小程序开发实战课程之油耗计算器-3406人已学习 课程介绍 微信小程序开发实战课程之油耗计算器,通过练习开发工具类的油耗计算器小程序,可以帮助大家了解微信小程序的API,相关组件的 ...
最新文章
- java 计时器归零_终止Java中的计时器
- Java开发环境的搭建(JDK和Eclipse的安装)
- python3.6.0安装步骤
- 如何保存一个函数_如何表达一个“分段函数”之学习Matlab Function模块
- java jsoup获取cookie_java – 如何使用jsoup维护变量cookie和会话?
- 课程、问题-利用mincemeat编写简单的MapReduce程序-by小雨
- Fedora 11 Beta 跳票了
- Spark中repartition和coalesce的区别与使用场景解析
- R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)
- 微软全球MVP教你如何由程序员到CTO
- 【企业架构】2022年TOGAF认证是否仍然值得
- 矩阵的秩的一些定理证明
- 泡泡龙游戏开发系列教程(六)
- fopen用java代码实现_C语言基础(20)-文件操作(fopen,getc,fclose)
- 网课研究生学术与职业素养讲座mooc答案
- 基本系统调用性能lmbench测试方法和下载
- 表单验证工具类ValidationUtils
- 超级电容怎么才能把内阻做小_如何测试超级电容内阻?
- PARALYSIS AS “SPIRITUAL LIBERATION” IN JOYCE’S DUBLINERS Iven Lucas Heister, B.A.【翻译】
- ue4 android log,UE4+Log日志
热门文章
- Carte服务器配置以及出现错误综述
- 《弃子长安》第十一章 一路向西
- 留学Paper写作中的门道怎么讲解?
- Niushop单商户V4稳定版重构上新啦!
- 计算机组成原理秒表设计实验,计算机组成原理实验2.4计数器赖晓铮剖析.ppt
- 4维俄罗斯方块 java_HTML5边玩边学(九)-俄罗斯方块之数据模型篇
- 你的微信版本过低,无法正常使用此小程序,请更新微信到最新版本。
- Balsamiq-Mockups-Introduction.html
- 有哪些比较不错的AI绘画网站?
- Vue2.0源码解析 - 知其然知其所以然之Vue.use