前言
微信扫码登陆,前段时间写完微信扫码登录后,因为有多个我的项目都须要微信登录, 而公众号的数量无限。所以须要钻研一下多个我的项目应用同一个公众号登录。
思路
原来的思路:每个后盾与微信服务器之间进行通信, 须要多个公众号
那么,应用一个公众号的话,建设一个两头服务器,与微信进行通信就行了。
先说一下前提:本我的项目是先登录,而后绑定微信用户后,后续能力应用微信登录。
有了思路之后流程大略如下:
如果在登录的零碎是:我的项目 1,而服务器收到微信推送事件后须要做这几件事
- 判断该事件是否是向 我的项目 1 推送
- 校验该微信用户是否与 我的项目 1 绑定
- 服务器 向 我的项目 1 发送 登录胜利的申请。
- 我的项目 1 向登录胜利的客户端,执行登录胜利逻辑
- 服务器向微信公众号,发送登录胜利的信息。
如何判断事件是否属于我的项目 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…