【小程序开发实战】使用WxJava实现手机号获取

这篇具有很好参考价值的文章主要介绍了【小程序开发实战】使用WxJava实现手机号获取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前编写小程序获取手机号相关的代码均为自行封装,最近发现了 WxJava 的存在,方便了开发。

本篇文章将讲解如何使用WxJava进行手机号的获取。

** 旧版本 **
微信接口官方文档

思路

需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

总结为以下两个步骤:

  1. 通过使用 button getPhoneNumber 可获取到 返回的加密数据。
  2. 然后将加密数据结合 session_key 以及 app_id 进行解密获取手机号。

因此想要获得使用者的手机号,我们需要传入 session_key, app_id 以及 前端调用微信服务器返回的加密数据。

  • 如何获取 session_key 和 app_id 呢?
    前端获取jsCode后并调用 auth.code2Session 接口即可。

因此我们只需要将 jsCode 以及 加密数据 传给接口即可。

整体思路总结

  1. 前端给后端传递 jsCode,加密数据参数(iv,encryptedData)。
  2. 然后使用 jsCode,绑定的 appId 以及 appSecret 调用 auth.code2Session 接口 获取到 session_key,app_id 。
  3. 使用 session_key,app_id 对加密数据进行解密获取到用户手机号。

代码实现

这里使用了 wxjava。因此代码非常的简洁。我们只需要理解整体的思路就好了。

整体架构

【小程序开发实战】使用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文章来源地址https://www.toymoban.com/news/detail-496778.html

wx:  
  miniapp:  
    configs:  
          appid: '自己的小程序appid'  
          secret: 'appsecret'  
          token: #微信小程序消息服务器配置的token  
          aesKey: #微信小程序消息服务器配置的EncodingAESKey  
          msgDataFormat: JSON

到了这里,关于【小程序开发实战】使用WxJava实现手机号获取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用eclipse实现MapReduce实践编程---统计不同手机号的用户使用的总流量

    根据用户手机上网的行为记录,基于 MapReduce编程模型设计程序统计不同手机号的用户使用的总流量。其中,数据记录的字段描述如下。 序号 字段 字段类型 描述 0 reportTime long 记录报告时间戳 1 msisdn String 手机号码 2 apmac String AP mac 3 acmac String AC mac 4 host String 访问的网址 5 si

    2024年04月28日
    浏览(30)
  • 微信小程序实战十七:手机号授权登录及报警推送

    说明:根据项目需求我们需要开发一个报表小程序,用的帆软报表生成页面,通过webview集成url地址,需要用户手机号授权登录及接受项目中的预警信息并通过订阅的方式长期持续多次的对用户进行推送。小程序已申请好企业版进去分类属于政府行业,满足这些条件可以免费调

    2024年01月19日
    浏览(42)
  • 【手机号验证/前端】Vue2+elementUI编写一个手机号验证码登录页面,路由式开发(附完整代码)

    目录 效果图: 一、template部分 二、style样式 三、script部分 1.先对手机号的格式进行一个判断 2.接下来就是表单验证规则rules 3.最后就是methods了 (1)首先我们给获取验证码绑定一个方法 (2)然后封装一个axios接口,方便后面测试联调(这部分每个人封装的都不一样) (3)然

    2024年02月17日
    浏览(36)
  • 微信小程序 - 实现手机号登录--授权并获取手机号保存至本地

    微信官方文档 | 获取手机号 这是服务端的  这是我们前端获取手机号需要给接口传递的两个参数    注意: 参数一: 获取access_token需要用到小程序密钥,这个需要从 服务端获取 ,也就是需要请求后端接口获取access_token,千万不要将小程序密钥写在前端代码中, 必须 要从服

    2024年02月03日
    浏览(47)
  • 使用Spring Boot Security 实现多认证 手机号登录 微信扫码登录 微信扫码注册

    Spring Boot 3.x Spring Security 5.7 Spring Redis MyBatis plus 前端 Vue 公司 最近有个新项目 使用单点登录 sso 百度了一圈 也没怎么找到微信扫码注册的功能于是自己写 需求就是 手机 + 密码登录 微信扫码登录 微信扫码注册 微信二维码 登录 和注册二合一 具体实现 稍后我会说 本教程将指导

    2024年04月10日
    浏览(43)
  • 微信小程序手机号验证开发遇到问题

    公司小程序项目中快速登录需要实现微信用户授权手机登录、注册功能。结果遇到了 invalid code hint: [zHkDmt0sf-MBjga] rid: 64e3259f-1091b953-7e10f1da 目录 服务端文档 文档描述 返回信息 服务端代码 遇到问题 排查问题 1.服务端用错了appid serect 2.小程序端用错了appid serect 3.服务端用错了

    2024年02月11日
    浏览(34)
  • uniapp实现手机号一键登录功能

    1,第一步 2,第二步 创建应用要和项目uni-appid一致。 3,第三步 4,第四步 5,第五步 6,第六步 7,第七步 8,第八步 (实现代码) 一建登录步骤到此结束,欢迎大家讨论和指导,登录弹窗本文设置的是全屏‘fullScreen’,大家可根据需求编辑,弹窗只能在手机端app才能显示。

    2024年02月16日
    浏览(33)
  • uniapp开发小程序之获取用户基本信息与手机号方式

    介绍 首先讲讲小程序的登录注册,一般登录首先需要获取code code的有效期是十五分钟左右,前端通过接口获取到code之后传给后端,然后后端会根据code来判断是否有该用户,并且后台可以携带code发送请求,获取到用户 openid,ession_key等,没有该用户就进行注册 手机号  获取

    2024年02月16日
    浏览(31)
  • 手机号加解密业务,通过aop实现

    序言: 在开发过程中因为功能的特殊性  需要对客户信息的手机号进行加密处理 然后存到数据库中,然而这个需求是项目中期加入,很多功能上已经使用了获取客户信息的方法,没法统一控制手机号加解密操作, 于是考虑使用 aop做环绕增强 对所有出参进行,解密操作(这里只

    2024年02月11日
    浏览(33)
  • 微信小程序: java实现获取手机号方式

    目录 1. 现在比较简单的方式 - 接口名 --- 功能描述 - 调用方式 --- HTTPS 调用 --- 第三方调用 --- 请求参数 --- 返回参数 2. 实现方式 1. 加入fastjson依赖  2. http请求类 3. Json串工具类 4.接口方法 3.另外介绍一点access_token 微信官方文档介绍:  getPhoneNumber --- 功能描述 该接口需配合手机

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包