个人公众号对接微信第三方登录

用微信作为第三方登录(个人公众号)

第一步,去微信公众号注册个人公众号

微信公众号平台地址:官方平台

第二步,注册之后填写服务器配置

在这里插入图片描述
备注:我选的是明文模式,安全模式或兼容模式要加解密,微信文档有说明,因为是个人公众号的原因,笔者没有选用其他二种,另外重要一点区分个人公众号不具有企业公众号或者服务号的扫码授权登录功能

  • 服务器地址URL这个选项需要一台能访问外网的服务器,如阿里云,腾讯云这种,笔者是通过花生壳内网穿透的,因为笔者主要用于测试,将花生壳提供的外网域名与本地电脑端口绑定即可(测试的话,可以选用笔者这种方式)。

第三步 后端写一个token验证接口,填写上一步的URL地址后,确定后,微信会自动去验证是否有效

代码如下:

     //笔者的代码水平有限,仅供参考
    @GetMapping(produces = "text/plain;charset=utf-8")
    public String checkSignature(@RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce, @RequestParam("echostr") String echostr) {
        String[] strs = {token,timestamp,nonce};
        Arrays.sort(strs);
        String data = "";
        for (String str : strs) {
            data += str;
        }
        String result = Sha1Generator.sha1(data);
        System.out.println("result = " + result);
        if (StringUtils.isNotBlank(result) && signature.equalsIgnoreCase(result)){
            return echostr;
        }
        return "非法请求";
    }

简单来说就是微信会按照你的这个接口发送GET请求,会传给你几个参数,你根据这几个参数(timestamp,nonce)和token(第二步骤填的token),进行排序,在通过sha1算法之后,得到的结果和微信调你这个接口传的参数signature进行比较,没问题返回最后一个参数echostr即可,实际上没有必要这样是可以直接返回给他的不用验证,笔者是根据微信官方文档来的。

微信会提供一个带参数的二维码,扫码之后就会进行授权登录,网站界面就会跳转(企业公众号),个人公众号不支持。

在这里插入图片描述
具体可以参考微信公众号官方文档 文档地址
笔者用的是个人公众号,所以是用另外的方法的,首先根据官方文档,你要写一个微信回调的接口,注意这个接口跟你最开始填的那个url地址一样不过验证token的是个GET请求,这个是个POST请求
注意:
微信是xml格式进行回调所以你要写一个接受xml格式的接口

  @PostMapping(
    consumes = {"application/xml","text/xml"})
    public WxRetrunMsgVo checkMsg(@RequestBody WxTxtMsgReqVo msg) throws Exception{
        XmlMapper xmlMapper = new XmlMapper();
        String s = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(msg);
        long msgCreateTime = msg.getCreateTime() * 1000L;
        String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(msgCreateTime));
        System.out.println( createTime + " 微信传入:\n" + s);
        String content = msg.getContent();
        WxRetrunMsgVo retrunMsgVo = new WxRetrunMsgVo();
        retrunMsgVo.setContent("谢谢关注,收到你发的:" + content);
        retrunMsgVo.setToUserName(msg.getFromUserName());
        retrunMsgVo.setFromUserName(msg.getToUserName());
        retrunMsgVo.setMsgType("text");
        String returnTime = DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
        retrunMsgVo.setCreateTime(System.currentTimeMillis() / 1000);
        String result = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(retrunMsgVo);
        System.out.println(returnTime + " 返回微信:\n" + result);
        return retrunMsgVo;
    }

微信就会回调这个接口
所以综上所述,个人公众号要实现帮助网站第三方登录,首先二维码图片是你自己的公众号连接生成的,因为上面说了只有企业公众号或服务号才能申请带参数的二维码,然后才能实现扫码调整,比如你的公众号是彬哥码云,你的链接是 http://weixin.qq.com/r/mp/KxdeWrzEiHT0Kfg5b0Kv,这个链接的二维码图片:
(因为会违规就不显示了),如:code.jpg

然后用户扫码你这个二维码(code.jpg)(这个二维码就是个普通的链接你公众号的二维码,不是带参数的二维码,扫码不能触发回调接口)。
现在就很明了,你就是你的网站显示这个二维码,顺便生成个验证码,然后用户扫码关注你这个公众号之后,在公众号输入验证码,达到企业公众号扫码授权的作用。

微信会回调POST 接口,按如下格式,接口都一样只是请求字段不一样

在这里插入图片描述
然后将用户在公众号上发的验证码,会转发到你的服务器上,你就可以验证,从而实现网站的自动登录,这里面需要如长连接,轮询等方法来实现验证码验证,用户OpenId是唯一的,当然具体的实现还是要再调用微信去获取个人消息的接口的,从而实现用户信息保存,那么怎么确定这个验证码是扫码登录那个用户发的呢,不是其他同样登录发的呢,这就要你生成验证码让用户扫码公众号登录时输入那个时候就要做的事,还需要另外如SseEmitter(前后端未分离)等的其他知识点去实现。

总结

看完下来之后,大概的流程你就知道了,具体还要各位同学之间去代码验证。谢谢

纸上得来终觉浅,绝知此事要躬行

最后笔者的水平较浅,只是验证下费曼学习法,之后会再更新学到的新知识,进行博客撰写,感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值