小程序 Java 用户授权 手机号解析 流程

各位兄弟们好。

之前一直没怎么研究过小程序。这次有一个项目需要做成小程序。 

老哥我屡了屡流程。给各位兄弟弄点干货。 

既然提到干货嘛就是不废话。 代码也不墨迹。直接上工具。

这里推荐一个Java 微信开发的工具 

binarywang 有需要的老哥可以自己去码云、Git。去弄下来

这里演示的是微信小程序

 

一、先加入maven支持

        <!--微信小程序 -->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>${weixin-java-miniapp.version}</version>
        </dependency>

 

二、编写配置文件。我这里是springBoot项目

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

 

三、编写类。引入binarywang提供的微信小程序工具

 

3.1、配置类

@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMaProperties {


    /**
     * 设置微信小程序的appid
     */
    private String appid;

    /**
     * 设置微信小程序的Secret
     */
    private String secret;

    /**
     * 设置微信小程序消息服务器配置的token
     */
    private String token;

    /**
     * 设置微信小程序消息服务器配置的EncodingAESKey
     */
    private String aesKey;

    /**
     * 消息格式,XML或者JSON
     */
    private String msgDataFormat;


    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getSecret() {
        return secret;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public String getAesKey() {
        return aesKey;
    }

    public void setAesKey(String aesKey) {
        this.aesKey = aesKey;
    }

    public String getMsgDataFormat() {
        return msgDataFormat;
    }

    public void setMsgDataFormat(String msgDataFormat) {
        this.msgDataFormat = msgDataFormat;
    }

}

 

3.2、初始化 小程序工具类、以及、监控服务器推送信息的回调方法

 

WxMaService是关键。像调用 小程序登录 code换取SessionKey、解析用户手机号、用户信息之类的。全在这个工具类中。

WxMaMessageRouter就不用说了。就是服务器推送给你信息。你接受。怎么回复的。


@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {

    private WxMaProperties properties;

    private static WxMaMessageRouter router;
    private static WxMaService maService;

    public WxMaProperties getProperties() {
        return properties;
    }

    public void setProperties(WxMaProperties properties) {
        this.properties = properties;
    }


    @Autowired
    public WxMaConfiguration(WxMaProperties properties) {
        this.properties = properties;
    }

    public static WxMaService getMaService() {

        return maService;
    }

    public static WxMaMessageRouter getRouter() {
        return router;
    }

    //这里是关键。 初始化WxMaService 根据类。 
    //像根据Code获取sessionKey啊。解析手机号、解析用户信息啊。方法都在WxMaService里
    @PostConstruct
    public void init() {

        WxMaInMemoryConfig config = new WxMaInMemoryConfig();
        config.setAppid(properties.getAppid());
        config.setSecret(properties.getSecret());
        config.setToken(properties.getToken());
        config.setAesKey(properties.getAesKey());
        config.setMsgDataFormat(properties.getMsgDataFormat());

        WxMaService service = new WxMaServiceImpl();
        service.setWxMaConfig(config);

        maService = service;
        router = this.newRouter(service);

    }

    private WxMaMessageRouter newRouter(WxMaService service) {
        final WxMaMessageRouter router = new WxMaMessageRouter(service);
        router
            .rule().handler(logHandler).next()
            .rule().async(false).content("模板").handler(templateMsgHandler).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 templateMsgHandler = (wxMessage, context, service, sessionManager) ->
        service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder()
            .templateId("此处更换为自己的模板id")
            .formId("自己替换可用的formid")
            .data(Lists.newArrayList(
                new WxMaTemplateData("keyword1", "339208499", "#173177")))
            .toUser(wxMessage.getFromUser())
            .build());

    private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
        System.out.println("收到消息:" + wxMessage.toString());
        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
            .toUser(wxMessage.getFromUser()).build());
    };

    private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) ->
        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
            .toUser(wxMessage.getFromUser()).build());

    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 (Exception e) {
            e.printStackTrace();
        }
    };

    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 (Exception e) {
            e.printStackTrace();
        }
    };

}

 

3.3、开始走业务逻辑 这里演示一下 。 code换sessionKey、解析手机号、解析用户信息。 其他的你们自己看源码吧。 贼方便

    
    final WxMaService wxService = WxMaConfiguration.getMaService();
    
    //根据Code 换取sessionKey
    WxMaJscode2SessionResult session = null;
    try {
      session = wxService.getUserService().getSessionInfo(code);
    } catch (WxErrorException e) {
      e.printStackTrace();
    }
    String sessionKey = session.getSessionKey();

    
    //phoneEncryptedData,phoneIv 是前端调用小程序提供的API。获取的加密内容
    //sessionKey 是刚才用Code换取的sessionKey 这个会过期哦 还是不定时的
    //解密手机号等用户信息
    WxMaPhoneNumberInfo phoneNoInfo= wxService.getUserService().getPhoneNoInfo(sessionKey, phoneEncryptedData, phoneIv);

     //userEncryptedData, userIv 是前端调用小程序提供的API。获取的加密内容
     //sessionKey 是刚才用Code换取的sessionKey 这个会过期哦 还是不定时的
     // 解密用户信息 unionId 头像、openId之类的
      WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(sessionKey, userEncryptedData, userIv);

 

 

四、这里说一下 小程序登录的逻辑

微信小程序文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

下面咱们需要用到的有2个api  

 

一共分为 4 步

4.1、小程序调用API -> wx.login -> 调用服务端接口换取sessionKey并缓存在本地。

4.2、调用 getPhoneNumber(小程序获取手机号 这里是用户点击按钮才可以获取的) 、 getUserInfo(必须先授权完的)

4.3、在调用接口之前。 前端需要使用 wx.checkSession API来验证一下 sessionKey是否过期。如果过期了。 重新拿Code换一下 sessionKey

4.4、没有过期的话。直接把 sessionKey getPhoneNumber、getUserInfo获取到的加密的信息 传递给后台。 后台调用刚才上面说的工具。 把用户信息、手机号信息。全部解析出来。 进行处理。 

 

 

各位兄弟,有觉得我这文章对你有帮助的。记得帮老铁我点个赞。抱拳了!!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值