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;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
@@ -8,6 +10,7 @@ import org.w3c.dom.Node;
|
|||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
@@ -23,7 +26,10 @@ import java.util.Map;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class WeChatHandler {
|
public class WeChatHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
PartnerUserWechatBindDAO partnerUserWechatBindDAO;
|
||||||
|
@Resource
|
||||||
|
WechatTemplateService wechatTemplateService;
|
||||||
|
|
||||||
public Map<String, Object> parseXmlToMap(String xmlContent) throws Exception {
|
public Map<String, Object> parseXmlToMap(String xmlContent) throws Exception {
|
||||||
Map<String, Object> result = new HashMap<>();
|
Map<String, Object> result = new HashMap<>();
|
||||||
@@ -88,8 +94,16 @@ public class WeChatHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String handleSubscribeEvent(String fromUserName,String toUserName) {
|
private String handleSubscribeEvent(String fromUserName,String toUserName) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
//根据openId 获取用户信息
|
||||||
|
WechatUserInfoDTO userInfo = wechatTemplateService.getUserInfo(fromUserName, null);
|
||||||
|
|
||||||
|
//根据unionId 更新服务号ID
|
||||||
|
if (userInfo != null) {
|
||||||
|
partnerUserWechatBindDAO.updateByUnionId(userInfo.getUnionid(),fromUserName);
|
||||||
|
}
|
||||||
|
|
||||||
// 立即回复欢迎消息
|
// 立即回复欢迎消息
|
||||||
return buildWelcomeReply(fromUserName, toUserName);
|
return buildWelcomeReply(fromUserName, toUserName);
|
||||||
|
|
||||||
|
|||||||
@@ -116,8 +116,10 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService {
|
|||||||
partnerUserWechatBindDAO.insertSelective(bindDO);
|
partnerUserWechatBindDAO.insertSelective(bindDO);
|
||||||
}else {
|
}else {
|
||||||
//维护unionId 针对老数据没有unionId
|
//维护unionId 针对老数据没有unionId
|
||||||
zlPartnerUserBindDO.setUnionId(unionId);
|
if (zlPartnerUserBindDO.getUnionId()==null){
|
||||||
partnerUserWechatBindDAO.update(zlPartnerUserBindDO);
|
zlPartnerUserBindDO.setUnionId(unionId);
|
||||||
|
partnerUserWechatBindDAO.update(zlPartnerUserBindDO);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
BeanUtil.copyProperties(hyPartnerUserInfoDO, userInfoVO);
|
BeanUtil.copyProperties(hyPartnerUserInfoDO, userInfoVO);
|
||||||
fillLineInfo(userInfoVO, hyPartnerUserInfoDO.getPartnerId());
|
fillLineInfo(userInfoVO, hyPartnerUserInfoDO.getPartnerId());
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.cool.store.builder.TemplateMessageBuilder;
|
|||||||
import com.cool.store.config.weixin.WechatMpProperties;
|
import com.cool.store.config.weixin.WechatMpProperties;
|
||||||
import com.cool.store.dto.wechat.AccessTokenDTO;
|
import com.cool.store.dto.wechat.AccessTokenDTO;
|
||||||
import com.cool.store.dto.wechat.WechatTemplateMessageDTO;
|
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.enums.wechat.WechatTemplateEnum;
|
||||||
import com.cool.store.utils.OkHttpUtil;
|
import com.cool.store.utils.OkHttpUtil;
|
||||||
import com.cool.store.utils.poi.StringUtils;
|
import com.cool.store.utils.poi.StringUtils;
|
||||||
@@ -59,6 +60,34 @@ public class WechatTemplateService {
|
|||||||
return null;
|
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) {
|
public boolean sendNormalTemplate(String openId, WechatTemplateEnum template, Map<String, Object> data) {
|
||||||
WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildNormalTemplate(openId, template, data);
|
WechatTemplateMessageDTO messageDTO = templateMessageBuilder.buildNormalTemplate(openId, template, data);
|
||||||
return sendTemplateMessage(messageDTO);
|
return sendTemplateMessage(messageDTO);
|
||||||
|
|||||||
Reference in New Issue
Block a user