diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java index 739e798..4b5ea4f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisService.java @@ -33,9 +33,28 @@ public class RedisService { redisCache.setCacheObject(key,list); } + public String getWechatToken() { + return redisCache.getCacheObject(RedisKeys.WECHAT_ACCESS_TOKEN); + } + + public void setWechatToken(String token) { + redisCache.setCacheObject(RedisKeys.WECHAT_ACCESS_TOKEN, token, 100, TimeUnit.MINUTES); + } + + public void setQrCode(String code) { + redisCache.setCacheObject(RedisKeys.WECHAT_QR_CODE, code, 30, TimeUnit.DAYS); + } + + public String getQrCode() { + return redisCache.getCacheObject(RedisKeys.WECHAT_QR_CODE); + } + interface RedisKeys { String MATCH_LIST_OF = "MATCH_LIST_OF_"; String ADDRESS_LIST_KEY = "ADDRESS_LIST_KEY_"; + + String WECHAT_ACCESS_TOKEN = "WECHAT_ACCESS_TOKEN_"; + String WECHAT_QR_CODE = "WECHAT_QR_CODE_"; } /** diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/controller/MemberController.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/controller/MemberController.java index 84711b1..b918a29 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/ums/controller/MemberController.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/controller/MemberController.java @@ -7,8 +7,10 @@ import com.cyl.manager.ums.domain.query.MemberQuery; import com.cyl.manager.ums.domain.vo.MemberDataStatisticsVO; import com.cyl.manager.ums.domain.vo.MemberVO; import com.cyl.manager.ums.service.MemberService; +import com.cyl.wechat.WechatAuthService; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import io.swagger.annotations.Api; @@ -36,6 +38,13 @@ public class MemberController extends BaseController { private MemberService service; @Autowired private MemberConvert convert; + @Autowired + private WechatAuthService wechatAuthService; + + @GetMapping("/wechat/code") + public AjaxResult getWechatCode() { + return AjaxResult.successData(wechatAuthService.getQRCode()); + } @ApiOperation("查询会员信息列表") @PreAuthorize("@ss.hasPermi('ums:member:list')") diff --git a/ruoyi-mall/src/main/java/com/cyl/wechat/WechatAuthService.java b/ruoyi-mall/src/main/java/com/cyl/wechat/WechatAuthService.java index 1b9de51..53a7aa1 100644 --- a/ruoyi-mall/src/main/java/com/cyl/wechat/WechatAuthService.java +++ b/ruoyi-mall/src/main/java/com/cyl/wechat/WechatAuthService.java @@ -2,13 +2,21 @@ package com.cyl.wechat; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.cyl.h5.config.SecurityUtil; import com.cyl.wechat.response.WechatUserAuth; +import com.ruoyi.common.core.redis.RedisService; +import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import java.util.Base64; import java.util.HashMap; import java.util.Map; @@ -18,6 +26,12 @@ public class WechatAuthService { @Autowired private RestTemplate restTemplate; + @Autowired + private RedisService redisService; + @Value("${wechat.miniProgramAppId}") + private String appId; + @Value("${wechat.miniProgramSecret}") + private String secret; public WechatUserAuth getUserToken(String code) { Map params = new HashMap<>(); @@ -41,4 +55,65 @@ public class WechatAuthService { } return null; } + + /** + * 获取二维码 + * + * @return 二维码字符串 + */ + public String getQRCode() { + String base64Str = redisService.getQrCode(); + if (StringUtils.isNotEmpty(base64Str)) { + return base64Str; + } + String accessToken = getAccessToken(); + if (StringUtils.isEmpty(accessToken)) { + log.error("accseetoken is null"); + return null; + } + String postUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("scene", "1"); //可以用作传参,必填,内容随意 + jsonObject.put("page", "pages/index/index"); //扫码后跳转页面,选填 + jsonObject.put("check_path", false); //是否检查跳转页面存不存在 + jsonObject.put("env_version", "release"); //版本 + byte[] string = null; + try { + string = restTemplate.exchange(postUrl, HttpMethod.POST, new HttpEntity<>(jsonObject, null), byte[].class).getBody(); + log.info("wechat response code: {}",string); + } catch (Exception e) { + log.error("get wechat code error",e); + } + base64Str = Base64.getEncoder().encodeToString(string); + redisService.setQrCode(base64Str); + log.info("wechat code:{}",base64Str); + return base64Str; + } + + + private String getAccessToken() { + String token = redisService.getWechatToken(); + + log.info("redis token:{}",token); + if (StringUtils.isNotEmpty(token)) { + return token; + } + Map params = new HashMap<>(); + params.put("APPID", appId); //替换成自己的appId + params.put("APPSECRET",secret); //替换成自己的appSecret + ResponseEntity responseEntity = restTemplate.getForEntity( + "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", + String.class, params); + String body = responseEntity.getBody(); + JSONObject object = JSON.parseObject(body); + String accessToken = object.getString("access_token"); + if (accessToken == null) { + log.error("获取accessToken失败"); + return accessToken; + } + redisService.setWechatToken(accessToken); + log.info("get token:{}",accessToken); + return accessToken; + } + }