记录多项目共用一个公众号逻辑修改

前言

微信扫码登陆,前段时间写完微信扫码登录后,由于有多个项目都需要微信登录,而公众号的数量有限。 所以需要研究一下多个项目使用同一个公众号登录。

思路

原来的思路: 每个后台与微信服务器之间进行通信, 需要多个公众号

那么,使用一个公众号的话,建立一个中间服务器,与微信进行通信就行了。

同时,与微信服务器交互的代码不需要在项目1、2中写, 省下了很多代码编写

image.png


先说一下前提: 本项目是先登录,然后绑定微信用户后, 后续才能使用微信登录。

有了思路之后流程大概如下:

假如在登录的系统是: 项目1, 而服务器收到微信推送事件后需要做这几件事

  1. 判断该事件是否是向 项目1 推送
  2. 校验该微信用户是否与 项目1 绑定
  3. 服务器 向 项目1 发送 登录成功的请求。
  4. 项目1 向登录成功的客户端,执行登录成功逻辑
  5. 服务器向微信公众号, 发送登录成功的信息。

image.png

如何判断事件是否属于项目1

解决:项目1向服务器发送请求的时候带上项目关键字

例如: 项目的名称为 schedule, 则请求的时候带上参数为shcedule

例如第5行, 参数带上项目的关键字

1 final Map<String, String> variables = new HashMap<>();
2 variables.put("client", this.wxMpConfig.getClient());
3 variables.put("username", userDetails.getUsername());
4 variables.put("sessionId", sessionId);

5 String requestUrl = UserServiceImpl.addParam( this.wxMpConfig.getService() + "request/getBindQrCode", variables);

6 RestTemplate restTemplate = new RestTemplate();
7 String bindQrCode = restTemplate.getForObject(requestUrl, String.class, variables);

如何校验该微信用户是否与 项目1 绑定

方法1 :向项目1 发送请求, 让项目1来判断。

方法2: 绑定用户的时候,将微信用户和用户存到数据库中,并记录是哪一个项目

image.png

  • 方法1 需要 项目1 自己记录用户和微信用户的对应关系,
  • 方法2 自己记录了对应关系, 项目1 可选择记录或不记录

服务器 向 项目1 发送 登录成功的请求。

需要我们根据项目关键字 client ,获取 项目1的地址

这时候我们可以写个前台, 记录该地址

image.png

final Map<String, String> variables = new HashMap<>();
variables.put("wsLoginToken", wsLoginToken);
variables.put("username", user.getUsername());

String url = setting.getUrl() + "/api/wechat/login";

CommonServiceImpl.httpPost(url, weChatUser, variables);

post请求用到的包是 org.springframework.web.client.RestTemplate

然后简单封装了一下, 并加入了请求重试

  @Retryable(value = {RestClientException.class, EOFException.class}, maxAttempts = 3,
          backoff = @Backoff(delay = 1000L,multiplier = 1))
  static public <T> void httpPost(String url , T entity, Map<String, String> variables) {

    //创建请求头
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    // 添加url参数格式
    String requestUrl = CommonServiceImpl.addParam(url, variables);

    HttpEntity<T> requestEntity = new HttpEntity<T>(entity, headers);
    RestTemplate restTemplate = new RestTemplate();
    // 发送post请求
    ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, String.class, variables);

    // 判断请求是否发生异常
    if(!response.getStatusCode().is2xxSuccessful()){
      System.out.println("请求失败...");
      // 抛出异常
      throw new RestClientException(response.getBody());
    }
  }

项目1 向登录成功的客户端,执行登录成功逻辑


  @Override
  public void bindWsUuidToWeChatUser(String wsLoginToken, String username) {
    // 登录凭证 前台凭该loginUid作为用户名和密码登录
    String loginUid = UUID.randomUUID().toString();
    this.map.put(loginUid, username);
    simpMessagingTemplate.convertAndSendToUser(wsLoginToken,
            "/stomp/scanLoginQrCode",
            loginUid);
  }

效果图:

image.png

遇到的问题 unsafe url

文章链接

源码地址

https://github.com/weiweiyi18...

622 声望
104 粉丝
0 条评论
推荐阅读
为什么要有Java 内存模型,是什么, 解决了什么
Java内存模型(Java Memory Model,JMM) 定义了 java 运行时如何与硬件内存进行交互,比如规定了一个线程如何看到其他内存修改后共享变量的值。一些高级特性也建立在JMM的基础上,比如volatile 关键字。

weiweiyi3阅读 494

Spring Aop 动态代理
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施...

KerryWu5阅读 8.7k评论 1

SpringBoot集成LibreOffice+jodconverter做文件预览(office转pdf)
LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、...

Zeran2阅读 6.3k

之前很火给女朋友推送微信服务号消息是怎么做的?
经过了几天的奋战,终于把微信服务号的模板消息给写完了。后端其实没花多少时间,因为之前已经有同学提过pull request了,我在这基础之上简单优化下就完事了,主要的时间都是花在前端上,对前端页面和参数的适配...

Java3y3阅读 1.2k

简单使用spring cloud 服务注册做一个请求转发中心
背景上篇文章 记录多项目共用一个公众号逻辑修改, 实现了多个项目共用一个公众号。 但是也存在几点问题,比如:中间服务器拦截了微信的请求,虽然方便了项目不再需要写微信授权的代码,但如果以后需要再拓展新的...

weiweiyi2阅读 779

消息推送平台终于要上线啦!
我的开源项目消息推送平台Austin终于要上线了,迎来在线演示的第一版!🔥项目在线演示地址:[链接]消息推送平台🔥推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。[链接][链...

Java3y3阅读 1.1k

Java项目是不是分布式,真有那么重要吗?
「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了一把SpringCloud,写了一篇很长的文章,还是很顶的,有不少的大号都给我转载了,在知乎又获得了很多的赞。

Java3y2阅读 594评论 1

622 声望
104 粉丝
宣传栏