From 84c7afc62bb1eb6f5d80d2d9928d0d11a1ffbdda Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Tue, 15 Aug 2023 21:14:13 +0800 Subject: [PATCH] 赠送积分更新状态 --- src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 200 insertions(+), 13 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java index b2b3b52..de265bb 100644 --- a/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java +++ b/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java @@ -1,7 +1,11 @@ package cc.mrbird.febs.pay.util; +import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.common.utils.RedisUtils; +import cc.mrbird.febs.mall.entity.MallMember; +import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.io.FileUtil; import cn.hutool.core.text.StrFormatter; @@ -15,9 +19,7 @@ import org.dom4j.io.SAXReader; import javax.servlet.http.HttpServletRequest; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileOutputStream; +import java.io.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; @@ -28,10 +30,11 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.client.RestTemplate; -import java.io.InputStream; import java.util.*; +import java.util.concurrent.TimeUnit; /** * <pre> @@ -46,6 +49,14 @@ @Autowired private AgentProducer agentProducer; + + + @Autowired + RestTemplate restTemplate; + + + @Autowired + MallMemberMapper mallMemberMapper; private static Logger log = LoggerFactory.getLogger(WechatEventUtil.class); @@ -92,27 +103,46 @@ log.info("事件处理:event:{}、msgType:{}、toUserName:{}、fromUserName:{}", eventType, msgType, toUserName, fromUserName); if ("event".equals(msgType)) { if ("subscribe".equals(eventType)) { - result = imgTextMsg(toUserName, fromUserName, "欢迎光临", "欢迎光临【药王谷铺子】,点击左下角【药王谷铺子】-【商城】,进入商城。", "图片地址", "点击后跳转的路径"); + result = imgTextMsg(toUserName, fromUserName, "欢迎光临", "欢迎光临【药王谷铺子】,点击左下角【药王谷铺子】-【商城】,进入商城。", "https://excoin.oss-cn-hangzhou.aliyuncs.com/uploadeFile/1690447963307584cd27ac623427f8c07ed1d3bbe4279.png", "http://ywgouth.meiao.biz/"); log.info("新增关注事件:toUserName{}、fromUserName{}", toUserName, fromUserName); StringBuffer stringBuffer = new StringBuffer(); - if(map.containsKey("EventKey")){ + if(map.containsKey("EventKey") && ObjectUtil.isNotEmpty(map.get("EventKey"))){ /** * 扫带参数二维码 */ String eventKey = map.get("EventKey"); if(StrUtil.isNotEmpty(eventKey)){ - stringBuffer.append(eventKey); - stringBuffer.append("-"); + + String[] eventKeyStr = StrUtil.split(eventKey, "_"); + stringBuffer.append(eventKeyStr[1]); + stringBuffer.append("@"); stringBuffer.append(fromUserName); agentProducer.sendMemberSubScanMsg(stringBuffer.toString()); } + }else{ + /** + * 普通关注事件 + */ + agentProducer.sendMemberSubMsg(fromUserName); } - /** - * 普通关注事件 - */ - agentProducer.sendMemberSubMsg(fromUserName); } else if ("unsubscribe".equals(eventType)) { log.info("取消关注事件:toUserName{}、fromUserName{}", toUserName, fromUserName); + //取消关注则退出商城 + MallMember mallMember = mallMemberMapper.selectMemberByOpenId(fromUserName); + mallMember.setSubStatus(MallMember.SUB_STATUS_DISABLED); + mallMemberMapper.updateById(mallMember); + if(ObjectUtil.isNotEmpty(mallMember)){ + String redisKey = AppContants.XCX_LOGIN_PREFIX + mallMember.getId(); + String existToken = redisUtils.getString(redisKey); + if (StrUtil.isNotBlank(existToken)) { + Object o = redisUtils.get(existToken); + if (ObjectUtil.isNotEmpty(o)) { + redisUtils.del(existToken); + } + } + redisUtils.del(existToken); + redisUtils.del(AppContants.XCX_LOGIN_PREFIX + mallMember.getId()); + } }else if ("SCAN".equals(eventType)) { log.info("扫码关注事件:toUserName{}、fromUserName{}", toUserName, fromUserName); if(map.containsKey("EventKey")){ @@ -122,12 +152,19 @@ */ String eventKey = map.get("EventKey"); if(StrUtil.isNotEmpty(eventKey)){ +// String[] eventKeyStr = StrUtil.split(eventKey, "_"); +// stringBuffer.append(eventKeyStr[1]); stringBuffer.append(eventKey); stringBuffer.append("@"); stringBuffer.append(fromUserName); agentProducer.sendMemberSubScanMsg(stringBuffer.toString()); } } + }else if ("VIEW".equals(eventType)) { + /** + * 普通关注事件 + */ + agentProducer.sendMemberSubMsg(fromUserName); } } return result; @@ -251,7 +288,7 @@ * @return */ public String getTicket(String qrCodeParam) { - RestTemplate restTemplate = new RestTemplate(); +// RestTemplate restTemplate = new RestTemplate(); String ticket = null; // 拼接请求地址 String CREATE_QRCODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN"; @@ -323,7 +360,157 @@ return urlPrefix+"/"+imgName; } +// +// String timestamp = String.format("%010d", System.currentTimeMillis() / 1000); +// + public static String createSignature(String nocestr, String ticket, String timestamp, String url) { + // 这里参数的顺序要按照 key 值 ASCII 码升序排序 + String s = "jsapi_ticket=" + ticket + "&noncestr=" + nocestr + + "×tamp=" + timestamp + "&url=" + url; + return SHA1(s); + } +// + public static String SHA1(String decript) { + try { + MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); + digest.update(decript.getBytes()); + byte messageDigest[] = digest.digest(); + // Create Hex String + StringBuffer hexString = new StringBuffer(); + // 字节数组转换为 十六进制 数 + for (int i = 0; i < messageDigest.length; i++) { + String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); + if (shaHex.length() < 2) { + hexString.append(0); + } + hexString.append(shaHex); + } + return hexString.toString(); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return ""; + } public static void main(String[] args) { } + + //代码示例 + public Map<String, Object> ticket(String url) { + String ticket = null; + //从redis内获取 如果空说明第一次获取或已过期 + if(ObjectUtil.isEmpty(redisUtils.get("ticket"))){ + ticket = getTicket(); + } + //生成10位时间戳 + String timestamp = String.format("%010d", System.currentTimeMillis() / 1000); + String nonceStr = createNonceStr(); + String signature = createSignature(nonceStr, ticket, timestamp, url); + + Map<String, Object> map = new HashMap<>(16); + map.put("timestamp", timestamp); + map.put("nonceStr", nonceStr); + map.put("signature", signature); + return map; + } + + + + private static final String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + + public static String createNonceStr() { + String nonceStr = ""; + for (int i = 0; i < 16; i++) { + int beginIndex = (int) Math.round(Math.random() * 10); + nonceStr += str.substring(beginIndex, beginIndex + 1); + } + return nonceStr; + } + + + /** + * + */ + private String getTicket() { + //从redis 获取access_token + String accessToken = redisUtils.get(WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY).toString(); + if (StrUtil.isBlank(accessToken)) { + //获取access_token 自行实现 + return null; + } + //请求接口 + String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket"; + Map<String, String> param = new HashMap<>(16); + param.put("access_token", accessToken); + param.put("type", "jsapi"); + String getAccessTokenUrl = url + + "?access_token=" + accessToken + + "&type=jsapi"; + JSONObject jsonObject = restTemplate.getForObject(getAccessTokenUrl, JSONObject.class); + + int errcode = jsonObject.getInteger("errcode"); + String errmsg = jsonObject.getString("errmsg"); + if (errcode == 0 && "ok".equals(errmsg)) { + String ticket = jsonObject.getString("ticket"); + Integer expiresIn = jsonObject.getInteger("expires_in"); + redisUtils.set("ticket", ticket, expiresIn); + return ticket; + } + return null; + } + + + + /** + *SHA1签名算法 + */ +// public static String SHA1(String decript) { +// try { +// MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); +// digest.update(decript.getBytes()); +// byte messageDigest[] = digest.digest(); +// // Create Hex String +// StringBuffer hexString = new StringBuffer(); +// // 字节数组转换为 十六进制 数 +// for (int i = 0; i < messageDigest.length; i++) { +// String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); +// if (shaHex.length() < 2) { +// hexString.append(0); +// } +// hexString.append(shaHex); +// } +// return hexString.toString(); +// +// } catch (NoSuchAlgorithmException e) { +// e.printStackTrace(); +// } +// return ""; +// } + + + /** + * 生成签名 + * + * @param data 待签名数据 + * @return 签名 + */ + public static String generateSignature(final Map<String, String> data) throws Exception { + Set<String> keySet = data.keySet(); + String[] keyArray = keySet.toArray(new String[keySet.size()]); + Arrays.sort(keyArray); + StringBuilder sb = new StringBuilder(); + for (String k : keyArray) { + String value = data.get(k).toString(); + if (k.equals("sign")) { + continue; + } + if (value.trim().length() > 0) // 参数值为空,则不参与签名 + { + sb.append(k).append("=").append(value.trim()).append("&"); + } + } + return sb.toString(); + } + } -- Gitblit v1.9.1