前言

微信扫码登陆,前段时间写完微信扫码登录后,因为有多个我的项目都须要微信登录,而公众号的数量无限。 所以须要钻研一下多个我的项目应用同一个公众号登录。

思路

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

那么,应用一个公众号的话,建设一个两头服务器,与微信进行通信就行了。


先说一下前提: 本我的项目是先登录,而后绑定微信用户后, 后续能力应用微信登录。

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

如果在登录的零碎是: 我的项目1, 而服务器收到微信推送事件后须要做这几件事

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

如何判断事件是否属于我的项目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: 绑定用户的时候,将微信用户和用户存到数据库中,并记录是哪一个我的项目

  • 办法1 须要 我的项目1 本人记录用户和微信用户的对应关系,
  • 办法2 本人记录了对应关系, 我的项目1 可抉择记录或不记录

服务器 向 我的项目1 发送 登录胜利的申请。

须要咱们依据我的项目关键字 client ,获取 我的项目1的地址

这时候咱们能够写个前台, 记录该地址

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);  }

效果图:

遇到的问题 unsafe url

源码地址

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