feat:微信通知改造
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
package com.cool.store.dto.wechat;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author suzhuhong
|
||||
* @Date 2025/10/15 9:56
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Data
|
||||
public class WechatUserInfoDTO {
|
||||
/**
|
||||
* 用户是否订阅该公众号标识
|
||||
* 0代表未关注,1代表关注
|
||||
*/
|
||||
private Integer subscribe;
|
||||
|
||||
/**
|
||||
* 用户的标识,对当前公众号唯一
|
||||
*/
|
||||
private String openid;
|
||||
|
||||
/**
|
||||
* 用户的昵称
|
||||
*/
|
||||
private String nickname;
|
||||
|
||||
/**
|
||||
* 用户的性别
|
||||
* 1为男性,2为女性,0为未知
|
||||
*/
|
||||
private Integer sex;
|
||||
|
||||
/**
|
||||
* 用户所在城市
|
||||
*/
|
||||
private String city;
|
||||
|
||||
/**
|
||||
* 用户所在国家
|
||||
*/
|
||||
private String country;
|
||||
|
||||
/**
|
||||
* 用户所在省份
|
||||
*/
|
||||
private String province;
|
||||
|
||||
/**
|
||||
* 用户的语言
|
||||
* 简体中文为zh_CN
|
||||
*/
|
||||
private String language;
|
||||
|
||||
/**
|
||||
* 用户头像
|
||||
*/
|
||||
private String headimgurl;
|
||||
|
||||
/**
|
||||
* 用户关注时间,为时间戳
|
||||
*/
|
||||
@JsonProperty("subscribe_time")
|
||||
private Long subscribeTime;
|
||||
|
||||
/**
|
||||
* 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段
|
||||
*/
|
||||
private String unionid;
|
||||
|
||||
/**
|
||||
* 公众号运营者对粉丝的备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 用户所在的分组ID(兼容旧的用户分组接口)
|
||||
*/
|
||||
private Integer groupid;
|
||||
|
||||
/**
|
||||
* 用户被打上的标签ID列表
|
||||
*/
|
||||
@JsonProperty("tagid_list")
|
||||
private List<Integer> tagidList;
|
||||
|
||||
/**
|
||||
* 返回用户关注的渠道来源
|
||||
*/
|
||||
@JsonProperty("subscribe_scene")
|
||||
private String subscribeScene;
|
||||
|
||||
/**
|
||||
* 二维码扫码场景(开发者自定义)
|
||||
*/
|
||||
@JsonProperty("qr_scene")
|
||||
private Long qrScene;
|
||||
|
||||
/**
|
||||
* 二维码扫码场景描述(开发者自定义)
|
||||
*/
|
||||
@JsonProperty("qr_scene_str")
|
||||
private String qrSceneStr;
|
||||
|
||||
/**
|
||||
* 是否已关注
|
||||
*/
|
||||
public boolean isSubscribed() {
|
||||
return subscribe != null && subscribe == 1;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.cool.store.handler;
|
||||
|
||||
import com.cool.store.dto.wechat.CallbackMessageDTO;
|
||||
import com.cool.store.dao.PartnerUserWechatBindDAO;
|
||||
import com.cool.store.dto.wechat.WechatUserInfoDTO;
|
||||
import com.cool.store.service.wechat.WechatTemplateService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.w3c.dom.Document;
|
||||
@@ -8,6 +10,7 @@ import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import java.io.StringReader;
|
||||
@@ -23,7 +26,10 @@ import java.util.Map;
|
||||
@Slf4j
|
||||
public class WeChatHandler {
|
||||
|
||||
|
||||
@Resource
|
||||
PartnerUserWechatBindDAO partnerUserWechatBindDAO;
|
||||
@Resource
|
||||
WechatTemplateService wechatTemplateService;
|
||||
|
||||
public Map<String, Object> parseXmlToMap(String xmlContent) throws Exception {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
@@ -88,8 +94,16 @@ public class WeChatHandler {
|
||||
}
|
||||
|
||||
private String handleSubscribeEvent(String fromUserName,String toUserName) {
|
||||
|
||||
try {
|
||||
|
||||
//根据openId 获取用户信息
|
||||
WechatUserInfoDTO userInfo = wechatTemplateService.getUserInfo(fromUserName, null);
|
||||
|
||||
//根据unionId 更新服务号ID
|
||||
if (userInfo != null) {
|
||||
partnerUserWechatBindDAO.updateByUnionId(userInfo.getUnionid(),fromUserName);
|
||||
}
|
||||
|
||||
// 立即回复欢迎消息
|
||||
return buildWelcomeReply(fromUserName, toUserName);
|
||||
|
||||
|
||||
@@ -116,9 +116,11 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService {
|
||||
partnerUserWechatBindDAO.insertSelective(bindDO);
|
||||
}else {
|
||||
//维护unionId 针对老数据没有unionId
|
||||
if (zlPartnerUserBindDO.getUnionId()==null){
|
||||
zlPartnerUserBindDO.setUnionId(unionId);
|
||||
partnerUserWechatBindDAO.update(zlPartnerUserBindDO);
|
||||
}
|
||||
}
|
||||
BeanUtil.copyProperties(hyPartnerUserInfoDO, userInfoVO);
|
||||
fillLineInfo(userInfoVO, hyPartnerUserInfoDO.getPartnerId());
|
||||
//将数据存储到redis中
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.cool.store.builder.TemplateMessageBuilder;
|
||||
import com.cool.store.config.weixin.WechatMpProperties;
|
||||
import com.cool.store.dto.wechat.AccessTokenDTO;
|
||||
import com.cool.store.dto.wechat.WechatTemplateMessageDTO;
|
||||
import com.cool.store.dto.wechat.WechatUserInfoDTO;
|
||||
import com.cool.store.enums.wechat.WechatTemplateEnum;
|
||||
import com.cool.store.utils.OkHttpUtil;
|
||||
import com.cool.store.utils.poi.StringUtils;
|
||||
@@ -59,6 +60,34 @@ public class WechatTemplateService {
|
||||
return null;
|
||||
}
|
||||
|
||||
public WechatUserInfoDTO getUserInfo(String openId, String lang) {
|
||||
String accessToken = getAccessToken();
|
||||
//默认中国
|
||||
lang = StringUtils.isEmpty(lang)?"zh_CN":lang;
|
||||
if (accessToken == null) {
|
||||
log.error("获取access_token失败");
|
||||
return null;
|
||||
}
|
||||
String url = String.format("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s",
|
||||
accessToken, openId);
|
||||
|
||||
if (lang != null && !lang.trim().isEmpty()) {
|
||||
url += "&lang=" + lang;
|
||||
}
|
||||
try {
|
||||
String result = okHttpUtil.doGet(url);
|
||||
log.debug("获取用户信息响应: {}", result);
|
||||
WechatUserInfoDTO userInfo = objectMapper.readValue(result, WechatUserInfoDTO.class);
|
||||
return userInfo;
|
||||
} catch (IOException e) {
|
||||
log.error("获取用户信息失败", e);
|
||||
return null;
|
||||
} catch (Exception e) {
|
||||
log.error("解析用户信息响应失败", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean sendNormalTemplate(String openId, WechatTemplateEnum template, Map<String, Object> data) {
|
||||
WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildNormalTemplate(openId, template, data);
|
||||
return sendTemplateMessage(messageDTO);
|
||||
|
||||
Reference in New Issue
Block a user