600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 微信扫码关注公众号 并实现pc端登录 微信扫码关注公众号登录

微信扫码关注公众号 并实现pc端登录 微信扫码关注公众号登录

时间:2021-11-04 12:12:50

相关推荐

微信扫码关注公众号 并实现pc端登录 微信扫码关注公众号登录

流程如下

服务端获取accessToken服务端请求微信接口生成带参数的二维码,微信会返回{二维码ticket,二维码有效时间,二维码图片地址}等信息。服务端将ticket响应给前端,前端拿ticket开始轮询请求服务器用户扫码关注后,微信服务器会通知微信接口配置的url接口并携带{FromUserName:发送方的openid,Event:事件类型 subscribe(订阅)、unsubscribe(取消订阅),二维码的ticket}等信息服务器拿到openId和ticket 将 ticket作为key,openId作为value 存储至redis。表明此用户已扫码关注。当前端拿ticket 轮询请求服务器时,服务端拿ticket去redis中查询。如果存在即扫码或关注成功,查看openid是否已注册,如已注册登录成功,如未注册则去注册。业务处理完成后服务端删除redis中的数据。

微信配置:

基本配置–》服务器配置。服务器地址(URL)即事件触发时被通知的接口

1. 服务端获取accessToken

accessToken 不建议使用时去获取accessToken 失效性是两个小时,所以我们在redis存储1小时时间

@Overridepublic String getPubAccessToken() {String pubAccessToken;Object obj = redisTemplate.opsForValue().get("pubAccessToken");if (obj != null) {pubAccessToken = (String)obj;return pubAccessToken;} else {log.info("开始获取pubAccessToken");try {String url = "https://api./cgi-bin/token?grant_type=client_credential&appid=" + wxPubPayProperties.getAppId() + "&secret=" + wxPubPayProperties.getAppSecret();ResponseEntity<Map> entity = restTemplate.exchange(url,HttpMethod.GET, null,Map.class);Map<String,Object> map = entity.getBody();pubAccessToken = map.get("access_token") != null ? String.valueOf(map.get("access_token")) : null;if (StringUtils.isNotEmpty(pubAccessToken)) {redisTemplate.opsForValue().set("pubAccessToken", pubAccessToken, 3600, TimeUnit.SECONDS);return pubAccessToken;} else {return null;}} catch (Exception e) {e.printStackTrace();return null;}}}

2. 服务端生成带参数的二维码

@Overridepublic AppResult createQrCode(String sceneStr) {String pubAccessToken = getPubAccessToken();String url ="https://api./cgi-bin/qrcode/create?access_token=" + pubAccessToken;HttpHeaders requestHeaders = new HttpHeaders();requestHeaders.add("Content-type", "application/json; charset=utf-8");HttpEntity<String> requestEntity = new HttpEntity<>("{\"expire_seconds\": 3600, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": " + sceneStr +" }}}", requestHeaders);Map<String,Object> map = restTemplate.postForObject(url,requestEntity,Map.class);// map为响应参数 其中有ticket expire_seconds url return AppResult.successReturnDate(map);}

3. 被微信服务器通知的服务端接口

将token、timestamp、nonce三个参数进行字典序排序将三个参数字符串拼接成一个字符串进行sha1加密开发者获得加密后的字符串可与signature对比,标识该请求来源于微信接收事件推送 查看xmlData里的参数

@PostMapping("weChatNotice")public String weChatNotice(@RequestBody String xmlData,String signature,Long timestamp,String nonce, String echostr) {wxService.weChatNotice(xmlData);return echostr;}

4. 绑定ticket和openid至redis

@Overridepublic void weChatNotice(String xmlData) {// xml转mapMap<String, String> resultMap = WxPayKit.xmlToMap(xmlData);String ticket = resultMap.get("Ticket");if (StringUtils.isNotEmpty(ticket)) {String openId = resultMap.get("FromUserName");// 将ticket 和 openId 存储进redisredisTemplate.opsForValue().set(ticket, openId, 3600, TimeUnit.SECONDS);}}

5. 被前端轮询的接口

@Overridepublic AppResult wxLogin(String ticket) {// 判断 用户是否已扫码关注Map<String,Object> map = new HashMap<>();Object obj = redisTemplate.opsForValue().get(ticket);if (obj == null) {return AppResult.errorReturn(10024, "用户还未扫码关注");} else {String openId = (String) obj; // 用户已扫码登录,删除redisredisTemplate.delete(ticket);// 查询openId是否已绑定手机号注册map.put("openId",openId);Member member = memberMapper.getMemberOpenId(openId);if (member == null) {map.put("state",1);return AppResult.successReturnDate(map, "用户已扫码,但未注册");} else {map.put("state",0);return AppResult.successReturnDate(map, "用户已扫码,已注册");}}}

6. 根据openId获取微信用户信息

public Map<String,Object> getWxUserInfo(String openId) {String pubAccessToken = getPubAccessToken();String url = "https://api./cgi-bin/user/info?access_token=" + pubAccessToken + "&openid=" + openId + "&lang=zh_CN";ResponseEntity<Map> entity = restTemplate.exchange(url,HttpMethod.GET, null,Map.class);Map<String,Object> map = entity.getBody();return map;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。