掘金 后端 ( ) • 2021-11-16 19:57

theme: awesome-green highlight: a11y-dark

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」。

前言

目前很多网站都有扫码登录,通常会设有微信公众号,当我们想要访问网站某些资源的时候就需要扫码关注公众号,然后自动注册,登录。

准备工作

  1. 一个外网可访问的地址(没有也没关系,后面会介绍怎么解决)
  2. appIDappsecret

1. 获取appID和appsecret

学习阶段,我们直接使用微信测试号,后面直接切换未自己认证的就行 测试号登录

image.png

扫码登录后,我们就可以得到测试号的appIDappsecret

2. 接口配置信息

这里比较坑,这里的地址一定要填外网可以访问的地址。这里的逻辑是微信平台会发送一个验证请求到我们配置的地址,我们的服务做出正确的响应,表示之间关联成功,后续一些关注,扫码触发的请求才会发送到我们的服务器。

我们不可能为了学习一下去买一台服务器,并且我们在本地开发,有服务器我们调试也不方便。这里我们可以使用ngrok,通过内网穿透生成一个代理地址,这个地址外网是可以访问的,但是有效期只有两个小时,毕竟白嫖的,麻烦一下2个小时手动修改一下。 ngrok下载 下载解压后,会得到一个ngrok.exe可执行文件,点击运行, 输入需要代理的端口号,一般为我们后台的服务端口

ngrok http 9000

image.png

这样我们就得到了一个可以直接访问到我们服务的外网地址

image.png

填写好配置信息,token自己随便填一个就行

3. 服务端验证接口

正如我上面配置的地址,当我点击保存的时候,微信服务端会发一个校验的请求到代理地址,然后转发到我本地,也就是http://127.0.0.1:9000/wechat,接下来我们只需要接受请求,正确响应就可以了。

这里不赘述了,直接上代码

@ApiOperation(value = "验证微信服务器")
@GetMapping("/wechat")
public String wechatServer(@RequestParam(name = "signature") String signature,
                           @RequestParam(name = "timestamp") String timestamp,
                           @RequestParam(name = "nonce") String nonce,
                           @RequestParam(name = "echostr") String echostr) {

    String token = "填配置里的token";
    String[] arr = new String[]{token, timestamp, nonce};
    Arrays.sort(arr);
    String s = SecureUtil.sha1(arr[0] + arr[1] + arr[2]);
    return signature.equals(s) ? echostr : "";
}

具体认证的逻辑可以翻阅官方文档

总结

到这里我们的微信平台和本地服务已经连接成功了,后序只要我们根据需求,监听事件,扩展接口,完成业务就可以了