大致思路
- 1.【后端】请求微信生成一个携带参数全局唯一的scene(可以用雪花算法)的小程序登录页面的二维码(现在是小程序码)
- 2.【WEB端】拿到小程序码展示给用户,还有后端生成的当前的全局唯一scene。并且携带此参数轮询请求【后端】用户扫码是否成功的接口,如果成功则把小程序码遮挡,变成已失效。具体轮询频次看具体的业务;
- 3.【小程序端】监听到用户扫码成功了之后,获取到小程序码内携带的scene的值(具体方式开微信文档有写;点击直达),请求【后端】保存用户扫码状态的接口,
- 4.【后端】保存用户扫码成功信息(存到Redis中即可,key就用全局唯一的scene加上别的统一后缀) ps:此时第二步WEB应该是已经显示扫码成功了;
- 5.【小程序端】用户开始走登录授权流程,【WEB端】开始轮询查询是否授权成功,【后端】开始走授权接口,如果授权成功则把授权信息(token什么的)存入Redis中,key就用全局唯一的scene加上别的统一后缀;
- 6.【WEB端】获取到用户的授权信息之后,跳转到登录成功页面即可,此时【后端】删除掉刚才的授权信息,防止小程序码多次被扫码导致数据混乱。
ps: scene 前端生成也行,都可以但是同一时间内必须是唯一的。
大致的时序图 (很菜大佬勿喷)
代码
public String getCode(String scene,String accessToken) {
try {
String url="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken;
JSONObject param=new JSONObject();
param.put("scene",scene);
param.put("page", "pages/impower/index");
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
HttpEntity requestEntity = new HttpEntity(param, headers);
ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
byte[] result = entity.getBody();
String s = DatatypeConverter.printBase64Binary(result);
return "data:image/png;base64,"+s;
}catch (Exception e){
}
return null;
}
别的代码就不粘了,Redis相关的太简单了,授权相关的,各个系统又不一样。
|