小程序消息订阅微信对接代码开发完成

This commit is contained in:
纪寒 2024-03-19 17:19:49 +08:00
parent 0c1c45088f
commit 317e38e594
24 changed files with 809 additions and 7 deletions

View File

@ -34,6 +34,7 @@
<jwt.version>0.9.1</jwt.version>
<lombok.version>1.18.4</lombok.version>
<knife4j.version>3.0.3</knife4j.version>
<simple-xml.version>2.7.1</simple-xml.version>
</properties>
<!-- 依赖声明 -->
@ -184,6 +185,12 @@
<artifactId>postdischarge-mobile</artifactId>
<version>${xinelu.version}</version>
</dependency>
<!-- xml文件序列化和反序列化 -->
<dependency>
<groupId>org.simpleframework</groupId>
<artifactId>simple-xml</artifactId>
<version>${simple-xml.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -182,3 +182,26 @@ xss:
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
# 微信小程序参数配置信息
applet-chat-config:
# 微信小程序idwxdec3416aa3d60cab
applet-id: wxdc32268eca6b78f9
# 微信小程序密钥f58e19be0380c2ebc6e9e9684c0dacce
secret: 0d0e41432908750460aef2bf0aa871ae
# 微信小程序返回国家语言
lang: zh_CN
# 微信小程序授权类型
grant-type: authorization_code
# 微信小程序事件回调令牌
token: uI1NGHesp7ylIYVYQvp0TlcDmUTKCHj2
# 微信小程序事件回调消息加密密钥
encoding-aes-key: 5rbyhMBpdnxTEVT54zeHMNcXi3ccilQZ209QqGi89EW
# 优惠券领取模板id
coupon-receive-template-id: e1JRZaw1OfTz2b6X9DTqqaJtV4rXEt7uhwXoZLDb_eA
# 商品订单支付成功通知模板id
goods-order-template-id: -IxZeEkkXFhoSwGtBHbipKQ6kjEmkdTkswKeOypSsNQ
# 预约服务订单通知模板id
appoint-order-template-id: nUB9HRbqQXOVuTpkKBIHMgzWlNq6touzxf5QYBiMkbU
# 签到成功通知模板id
sign-template-id: S_c9bR4znSWpXg-6ACIMn7AkaR11dzo113XM8w4CKz0

View File

@ -0,0 +1,67 @@
package com.xinelu.common.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Description 微信小程序参数配置类
* @Author 纪寒
* @Date 2024-03-19 15:52:38
* @Version 1.0
*/
@Data
@Component
@ConfigurationProperties(prefix = "applet-chat-config")
public class AppletChatConfig {
/**
* 小程序id
*/
private String appletId;
/**
* 小程序secret
*/
private String secret;
/**
* 返回国家地区语言版本zh_CN 简体zh_TW 繁体en 英语
*/
private String lang;
/**
* 授权类型
*/
private String grantType;
/**
* 微信小程序事件回调令牌
*/
private String token;
/**
* 微信小程序事件回调消息加密密钥
*/
private String encodingAesKey;
/**
* 优惠券领取模板id
*/
private String couponReceiveTemplateId;
/**
* 商品订单支付成功通知模板id
*/
private String goodsOrderTemplateId;
/**
* 预约服务订单通知模板id
*/
private String appointOrderTemplateId;
/**
* 签到通知模板
*/
private String signTemplateId;
}

View File

@ -0,0 +1,40 @@
package com.xinelu.common.enums;
import lombok.Getter;
/**
* @Description 微信小程序订阅消息记录表 订阅消息类型枚举
* @Date 2024-03-19 17:16:06
* @Author 纪寒
* @Version 1.0
*/
@Getter
public enum SubscribeMessageTypeEnum {
/**
* 预约服务付款通知提醒
*/
APPOINT_ORDER_MESSAGE_PUSH("APPOINT_ORDER_MESSAGE_PUSH"),
/**
* 优惠券领取提醒
*/
COUPON_RECEIVE_MESSAGE_PUSH("COUPON_RECEIVE_MESSAGE_PUSH"),
/**
* 商品订单支付成功提醒
*/
GOODS_ORDER_MESSAGE_PUSH("GOODS_ORDER_MESSAGE_PUSH"),
/**
* 签到积分通知提醒
*/
SIGN_MESSAGE_PUSH("SIGN_MESSAGE_PUSH"),
;
final private String info;
SubscribeMessageTypeEnum(String info) {
this.info = info;
}
}

View File

@ -167,7 +167,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
* @param date LocalDate
* @param pattern 解析格式
* @return 日期字符串
* @Author jihan
* @Author 纪寒
*/
public static String formatDateToString(LocalDate date, String pattern) {
if (Objects.isNull(date)) {
@ -181,7 +181,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
*
* @param date 指定日期,如果为null,默认为当天
* @return 结束日期
* @author jihan
* @author 纪寒
*/
public static LocalDateTime end(LocalDate date) {
return LocalDateTime.of(null == date ? LocalDate.now() : date, LocalTime.MAX);
@ -193,7 +193,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
* @param beginTime 开始时间
* @param endTime 结束时间可以为null, 如果为null则表示now
* @return 分钟差值
* @author jihan
* @author 纪寒
*/
public static long differenceMinutes(LocalDateTime beginTime, LocalDateTime endTime) {
if (null == beginTime) {
@ -201,4 +201,15 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
return ChronoUnit.MINUTES.between(beginTime, null == endTime ? LocalDateTime.now() : endTime);
}
/**
* 时间戳转LocalDateTime
*
* @param timestamp 时间戳
* @return java.time.LocalDateTime
* @author 纪寒
*/
public static LocalDateTime timestampToLocalDateTime(long timestamp) {
return LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8));
}
}

View File

@ -87,7 +87,7 @@ public class SubscribeMessageRecord extends BaseEntity {
*/
@ApiModelProperty(value = "用于订阅消息次数")
@Excel(name = "用于订阅消息次数")
private Long subscribeCount;
private Integer subscribeCount;
/**
* 订阅时间

View File

@ -102,7 +102,7 @@ public class SubscribeMessageSendRecord extends BaseEntity {
*/
@ApiModelProperty(value = "推送结果状态码")
@Excel(name = "推送结果状态码", readConverterExp = "0=表示成功")
private Long errorCode;
private Integer errorCode;
/**
* 推送结果状态码success成功

View File

@ -58,4 +58,12 @@ public interface PatientInfoMapper {
* @return 结果
*/
public int deletePatientInfoByIds(Long[] ids);
/**
* 根据openid查询被护理人信息
*
* @param openId 微信openId
* @return 被护理人基本信息
*/
PatientInfo getPatientInfoByOpenId(String openId);
}

View File

@ -1,6 +1,7 @@
package com.xinelu.manage.mapper.subscribemessagerecord;
import com.xinelu.manage.domain.subscribemessagerecord.SubscribeMessageRecord;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -58,4 +59,23 @@ public interface SubscribeMessageRecordMapper {
* @return 结果
*/
int deleteSubscribeMessageRecordByIds(Long[] ids);
/**
* 批量新增微信小程序订阅消息记录
*
* @param subscribeMessageRecordList 新增微信小程序订阅消息记录
* @return int
**/
int insertSubscribeMessageRecordList(List<SubscribeMessageRecord> subscribeMessageRecordList);
/**
* 根据会员openid与templateId修改微信小程序订阅消息记录
*
* @param openId 微信openid
* @param templateId 模板id
* @param subscribeStatus 订阅状态
* @param patientId 患者id
* @return int
**/
int updateSubscribeMessageTemplateId(@Param("openId") String openId, @Param("templateId") String templateId, @Param("subscribeStatus") String subscribeStatus, @Param("patientId") Long patientId);
}

View File

@ -58,4 +58,12 @@ public interface SubscribeMessageSendRecordMapper {
* @return 结果
*/
int deleteSubscribeMessageSendRecordByIds(Long[] ids);
/**
* 批量新增微信小程序订阅消息发送记录
*
* @param subscribeMessageSendRecordList 微信小程序订阅发送消息记录
* @return int
**/
int insertSubscribeMessageSendRecordList(List<SubscribeMessageSendRecord> subscribeMessageSendRecordList);
}

View File

@ -519,4 +519,33 @@
#{id}
</foreach>
</update>
<select id="getPatientInfoByOpenId" parameterType="string" resultType="patientInfo">
SELECT
id,
community_code,
area_code,
patient_code,
patient_name,
card_no,
user_id,
unionid,
openid,
phone,
address,
urgent_contact_name,
urgent_contact_phone,
community_alias_name,
home_longitude,
home_latitude,
head_picture_url
FROM
patient_info
<where>
del_flag = 0
<if test="openId != null and openId != ''">
and openid = #{openId}
</if>
</where>
</select>
</mapper>

View File

@ -193,4 +193,45 @@
#{id}
</foreach>
</delete>
<insert id="insertSubscribeMessageRecordList" parameterType="java.util.List">
insert into subscribe_message_record(
patient_id,
unionid,
openid,
template_id,
message_type,
subscribe_count,
subscribe_time,
applet_id,
subscribe_status,
create_by,
create_time,
update_by,
update_time
) values
<foreach item="subscribeMessageRecordList" index="index" collection="list" separator=",">
(
#{subscribeMessageRecordList.patientId},
#{subscribeMessageRecordList.unionid},
#{subscribeMessageRecordList.openid},
#{subscribeMessageRecordList.templateId},
#{subscribeMessageRecordList.messageType},
#{subscribeMessageRecordList.subscribeCount},
#{subscribeMessageRecordList.subscribeTime},
#{subscribeMessageRecordList.appletId},
#{subscribeMessageRecordList.subscribeStatus},
#{subscribeMessageRecordList.createBy},
#{subscribeMessageRecordList.createTime},
#{subscribeMessageRecordList.updateBy},
#{subscribeMessageRecordList.updateTime}
)
</foreach>
</insert>
<update id="updateSubscribeMessageTemplateId">
update subscribe_message_record
set patient_id = #{patientId}, subscribe_status = #{subscribeStatus}, update_time = now()
where openid = #{openId} and template_id = #{templateId}
</update>
</mapper>

View File

@ -204,4 +204,31 @@
#{id}
</foreach>
</delete>
<insert id="insertSubscribeMessageSendRecordList" parameterType="java.util.List">
insert into subscribe_message_send_record(
openid,
applet_id,
subscribe_time,
template_id,
msg_id,
message_type,
error_code,
error_status,
create_time
) values
<foreach item="sendRecord" index="index" collection="list" separator=",">
(
#{sendRecord.openid},
#{sendRecord.appletId},
#{sendRecord.subscribeTime},
#{sendRecord.templateId},
#{sendRecord.msgId},
#{sendRecord.messageType},
#{sendRecord.errorCode},
#{sendRecord.errorStatus},
#{sendRecord.createTime}
)
</foreach>
</insert>
</mapper>

View File

@ -34,5 +34,10 @@
<groupId>com.xinelu</groupId>
<artifactId>postdischarge-manage</artifactId>
</dependency>
<!-- xml文件序列化和反序列化 -->
<dependency>
<groupId>org.simpleframework</groupId>
<artifactId>simple-xml</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,4 +1,4 @@
package com.xinelu.mobile.mapper;
package com.xinelu.mobile.mapper.mobiletest;
/**
* @Description 测试 Mapper

View File

@ -0,0 +1,19 @@
package com.xinelu.mobile.service.wechatappletcallback;
import com.xinelu.mobile.vo.wechatappletcallback.WeChatMessagePushVO;
/**
* @Description 微信小程序事件回调业务层
* @Author 纪寒
* @Date 2024-03-15 15:45:50
* @Version 1.0
*/
public interface WeChatAppletCallBackService {
/**
* 微信小程序消息推送事件回调POST处理
*
* @param weChatMessagePushVO 请求参数
*/
void handleWeChatAppletCallBack(WeChatMessagePushVO weChatMessagePushVO);
}

View File

@ -0,0 +1,278 @@
package com.xinelu.mobile.service.wechatappletcallback.impl;
import com.xinelu.common.config.AppletChatConfig;
import com.xinelu.common.enums.SubscribeMessageTypeEnum;
import com.xinelu.common.exception.ServiceException;
import com.xinelu.common.utils.DateUtils;
import com.xinelu.manage.domain.patientinfo.PatientInfo;
import com.xinelu.manage.domain.subscribemessagerecord.SubscribeMessageRecord;
import com.xinelu.manage.domain.subscribemessagesendrecord.SubscribeMessageSendRecord;
import com.xinelu.manage.mapper.patientinfo.PatientInfoMapper;
import com.xinelu.manage.mapper.subscribemessagerecord.SubscribeMessageRecordMapper;
import com.xinelu.manage.mapper.subscribemessagesendrecord.SubscribeMessageSendRecordMapper;
import com.xinelu.mobile.service.wechatappletcallback.WeChatAppletCallBackService;
import com.xinelu.mobile.vo.wechatappletcallback.WeChatMessagePushVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Description 微信小程序事件回调业务层实现类
* @Author 纪寒
* @Date 2024-03-19 17:13:06
* @Version 1.0
*/
@Service
@Slf4j
public class WeChatAppletCallBackServiceImpl implements WeChatAppletCallBackService {
@Resource
private SubscribeMessageRecordMapper subscribeMessageRecordMapper;
@Resource
private AppletChatConfig appletChatConfig;
@Resource
private PatientInfoMapper patientInfoMapper;
@Resource
private SubscribeMessageSendRecordMapper subscribeMessageSendRecordMapper;
/**
* 微信消息推送变更事件标识
*/
private static final String SUBSCRIBE_MSG_CHANGE_EVENT = "subscribe_msg_change_event";
/**
* 微信消息推送订阅事件标识
*/
private static final String SUBSCRIBE_MSG_POPUP_EVENT = "subscribe_msg_popup_event";
/**
* 微信消息推送发送结果事件标识
*/
private static final String SUBSCRIBE_MSG__SENT_EVENT = "subscribe_msg_sent_event";
/**
* 微信小程序消息推送事件回调POST处理
*
* @param weChatMessagePushVO 请求参数
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void handleWeChatAppletCallBack(WeChatMessagePushVO weChatMessagePushVO) {
if (weChatMessagePushVO.getEvent().equals(SUBSCRIBE_MSG_POPUP_EVENT)) {
//处理用户订阅授权事件
this.handleSubscribeMsgPopupEvent(weChatMessagePushVO);
}
if (weChatMessagePushVO.getEvent().equals(SUBSCRIBE_MSG_CHANGE_EVENT)) {
//处理订阅消息变更事件
this.handleSubscribeMsgChangeEvent(weChatMessagePushVO);
}
if (weChatMessagePushVO.getEvent().equals(SUBSCRIBE_MSG__SENT_EVENT)) {
//处理订阅消息发送结果事件
this.handleSubscribeMsgSentEvent(weChatMessagePushVO);
}
}
/**
* 处理用户订阅授权事件
*
* @param weChatMessagePushVO 参数信息
*/
private void handleSubscribeMsgPopupEvent(WeChatMessagePushVO weChatMessagePushVO) {
//处理订阅消息授权事件
if (Objects.isNull(weChatMessagePushVO.getSubscribeMsgPopupEvent()) || CollectionUtils.isEmpty(weChatMessagePushVO.getSubscribeMsgPopupEvent().getSubscribeMsgPopupEventList())) {
return;
}
//查询用户信息表
PatientInfo patientInfo = patientInfoMapper.getPatientInfoByOpenId(StringUtils.isBlank(weChatMessagePushVO.getFromUserName()) ? "" : weChatMessagePushVO.getFromUserName());
//组装数据
List<SubscribeMessageRecord> subscribeMessageRecordList = createSubscribeMessageRecordList(patientInfo, weChatMessagePushVO, SUBSCRIBE_MSG_POPUP_EVENT);
if (CollectionUtils.isEmpty(subscribeMessageRecordList)) {
return;
}
//根据openid查询数据库原有的订阅消息记录
SubscribeMessageRecord subscribeMessageRecord = new SubscribeMessageRecord();
subscribeMessageRecord.setOpenid(StringUtils.isBlank(weChatMessagePushVO.getFromUserName()) ? "" : weChatMessagePushVO.getFromUserName());
List<SubscribeMessageRecord> existMessageRecordList = subscribeMessageRecordMapper.selectSubscribeMessageRecordList(subscribeMessageRecord);
List<SubscribeMessageRecord> subtractSubscribeList = new ArrayList<>(CollectionUtils.subtract(subscribeMessageRecordList, existMessageRecordList));
if (CollectionUtils.isNotEmpty(subtractSubscribeList)) {
//新增订阅记录信息
int insertCount = subscribeMessageRecordMapper.insertSubscribeMessageRecordList(subtractSubscribeList);
if (insertCount <= 0) {
log.error("微信订阅消息回调,新增用户订阅消息记录失败,记录信息为:[{}]", subtractSubscribeList);
throw new ServiceException("微信订阅消息回调,新增用户订阅消息记录失败!");
}
}
List<SubscribeMessageRecord> intersectionSubscribeList = new ArrayList<>(CollectionUtils.intersection(subscribeMessageRecordList, existMessageRecordList));
if (CollectionUtils.isNotEmpty(intersectionSubscribeList)) {
//修改订阅信息状态
for (SubscribeMessageRecord messageRecord : intersectionSubscribeList) {
Long patientId = null;
if (Objects.nonNull(patientInfo) && Objects.nonNull(patientInfo.getId())) {
patientId = patientInfo.getId();
}
String openId = StringUtils.isBlank(messageRecord.getOpenid()) ? "" : messageRecord.getOpenid();
String templateId = StringUtils.isBlank(messageRecord.getTemplateId()) ? "" : messageRecord.getTemplateId();
String subscribeStatus = StringUtils.isBlank(messageRecord.getSubscribeStatus()) ? "" : messageRecord.getSubscribeStatus();
subscribeMessageRecordMapper.updateSubscribeMessageTemplateId(openId, templateId, subscribeStatus, patientId);
}
}
}
/**
* 处理订阅消息变更事件
*
* @param weChatMessagePushVO 信息
*/
private void handleSubscribeMsgChangeEvent(WeChatMessagePushVO weChatMessagePushVO) {
if (Objects.isNull(weChatMessagePushVO.getSubscribeMsgChangeEvent()) || CollectionUtils.isEmpty(weChatMessagePushVO.getSubscribeMsgChangeEvent().getSubscribeMsgPopupEventList())) {
return;
}
//查询用户信息表
PatientInfo patientInfo = patientInfoMapper.getPatientInfoByOpenId(StringUtils.isBlank(weChatMessagePushVO.getFromUserName()) ? "" : weChatMessagePushVO.getFromUserName());
//组装数据
List<SubscribeMessageRecord> subscribeMessageRecordList = createSubscribeMessageRecordList(patientInfo, weChatMessagePushVO, SUBSCRIBE_MSG_CHANGE_EVENT);
if (CollectionUtils.isEmpty(subscribeMessageRecordList)) {
return;
}
//根据openid查询数据库原有的订阅消息记录
SubscribeMessageRecord subscribeMessageRecord = new SubscribeMessageRecord();
subscribeMessageRecord.setOpenid(StringUtils.isBlank(weChatMessagePushVO.getFromUserName()) ? "" : weChatMessagePushVO.getFromUserName());
List<SubscribeMessageRecord> existMessageRecordList = subscribeMessageRecordMapper.selectSubscribeMessageRecordList(subscribeMessageRecord);
List<SubscribeMessageRecord> intersectionSubscribeList = new ArrayList<>(CollectionUtils.intersection(subscribeMessageRecordList, existMessageRecordList));
if (CollectionUtils.isNotEmpty(intersectionSubscribeList)) {
//修改订阅信息状态
for (SubscribeMessageRecord messageRecord : intersectionSubscribeList) {
Long patientId = null;
if (Objects.nonNull(patientInfo) && Objects.nonNull(patientInfo.getId())) {
patientId = patientInfo.getId();
}
String openId = StringUtils.isBlank(messageRecord.getOpenid()) ? "" : messageRecord.getOpenid();
String templateId = StringUtils.isBlank(messageRecord.getTemplateId()) ? "" : messageRecord.getTemplateId();
String subscribeStatus = StringUtils.isBlank(messageRecord.getSubscribeStatus()) ? "" : messageRecord.getSubscribeStatus();
subscribeMessageRecordMapper.updateSubscribeMessageTemplateId(openId, templateId, subscribeStatus, patientId);
}
}
}
/**
* 处理订阅消息发送结果事件
*
* @param weChatMessagePushVO 信息
*/
private void handleSubscribeMsgSentEvent(WeChatMessagePushVO weChatMessagePushVO) {
if (Objects.isNull(weChatMessagePushVO.getSubscribeMsgSentEvent()) || CollectionUtils.isEmpty(weChatMessagePushVO.getSubscribeMsgSentEvent().getSubscribeMsgSentEventList())) {
return;
}
//组装数据
List<SubscribeMessageSendRecord> subscribeMessageSendRecordList = createSubscribeMessageSendRecordList(weChatMessagePushVO);
if (CollectionUtils.isNotEmpty(subscribeMessageSendRecordList)) {
int insertCount = subscribeMessageSendRecordMapper.insertSubscribeMessageSendRecordList(subscribeMessageSendRecordList);
if (insertCount <= 0) {
log.error("微信订阅消息回调,新增用户订阅消息发送记录失败,记录信息为:[{}]", subscribeMessageSendRecordList);
throw new ServiceException("微信订阅消息回调,新增用户订阅消息发送记录失败!");
}
}
}
/**
* 组装订阅消息数据
*
* @param patientInfo 会员用户信息
* @param weChatMessagePushVO 微信请求参数信息
* @param eventType 事件类型
* @return List<SubscribeMessageRecord>
*/
private List<SubscribeMessageRecord> createSubscribeMessageRecordList(PatientInfo patientInfo, WeChatMessagePushVO weChatMessagePushVO, String eventType) {
List<SubscribeMessageRecord> subscribeMessageRecordList = Lists.newArrayList();
if (SUBSCRIBE_MSG_POPUP_EVENT.equals(eventType)) {
subscribeMessageRecordList = weChatMessagePushVO.getSubscribeMsgPopupEvent().getSubscribeMsgPopupEventList().stream().filter(Objects::nonNull).map(item -> {
SubscribeMessageRecord subscribe = new SubscribeMessageRecord();
if (Objects.nonNull(patientInfo) && Objects.nonNull(patientInfo.getId())) {
subscribe.setPatientId(patientInfo.getId());
}
//此处模板通知需要根据实际情况进行修改
subscribe.setOpenid(StringUtils.isBlank(weChatMessagePushVO.getFromUserName()) ? "" : weChatMessagePushVO.getFromUserName());
subscribe.setAppletId(StringUtils.isBlank(weChatMessagePushVO.getToUserName()) ? "" : weChatMessagePushVO.getToUserName());
subscribe.setTemplateId(StringUtils.isBlank(item.getTemplateId()) ? "" : item.getTemplateId());
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getCouponReceiveTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.COUPON_RECEIVE_MESSAGE_PUSH.getInfo());
}
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getAppointOrderTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.APPOINT_ORDER_MESSAGE_PUSH.getInfo());
}
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getGoodsOrderTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.GOODS_ORDER_MESSAGE_PUSH.getInfo());
}
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getSignTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.SIGN_MESSAGE_PUSH.getInfo());
}
subscribe.setSubscribeCount(1);
subscribe.setSubscribeTime(StringUtils.isBlank(weChatMessagePushVO.getCreateTime()) ? null : DateUtils.timestampToLocalDateTime(Long.parseLong(weChatMessagePushVO.getCreateTime()) * 1000L));
subscribe.setCreateTime(LocalDateTime.now());
subscribe.setSubscribeStatus(StringUtils.isBlank(item.getSubscribeStatusString()) ? "" : item.getSubscribeStatusString());
return subscribe;
}).collect(Collectors.toList());
}
if (SUBSCRIBE_MSG_CHANGE_EVENT.equals(eventType)) {
subscribeMessageRecordList = weChatMessagePushVO.getSubscribeMsgChangeEvent().getSubscribeMsgPopupEventList().stream().filter(Objects::nonNull).map(item -> {
SubscribeMessageRecord subscribe = new SubscribeMessageRecord();
if (Objects.nonNull(patientInfo) && Objects.nonNull(patientInfo.getId())) {
subscribe.setPatientId(patientInfo.getId());
}
//此处模板通知需要根据实际情况进行修改
subscribe.setOpenid(StringUtils.isBlank(weChatMessagePushVO.getFromUserName()) ? "" : weChatMessagePushVO.getFromUserName());
subscribe.setAppletId(StringUtils.isBlank(weChatMessagePushVO.getToUserName()) ? "" : weChatMessagePushVO.getToUserName());
subscribe.setTemplateId(StringUtils.isBlank(item.getTemplateId()) ? "" : item.getTemplateId());
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getCouponReceiveTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.COUPON_RECEIVE_MESSAGE_PUSH.getInfo());
}
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getAppointOrderTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.APPOINT_ORDER_MESSAGE_PUSH.getInfo());
}
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getGoodsOrderTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.GOODS_ORDER_MESSAGE_PUSH.getInfo());
}
if (StringUtils.isNotBlank(item.getTemplateId()) && appletChatConfig.getSignTemplateId().equals(item.getTemplateId())) {
subscribe.setMessageType(SubscribeMessageTypeEnum.SIGN_MESSAGE_PUSH.getInfo());
}
subscribe.setSubscribeCount(1);
subscribe.setSubscribeTime(StringUtils.isBlank(weChatMessagePushVO.getCreateTime()) ? null : DateUtils.timestampToLocalDateTime(Long.parseLong(weChatMessagePushVO.getCreateTime()) * 1000L));
subscribe.setCreateTime(LocalDateTime.now());
subscribe.setSubscribeStatus(StringUtils.isBlank(item.getSubscribeStatusString()) ? "" : item.getSubscribeStatusString());
return subscribe;
}).collect(Collectors.toList());
}
return subscribeMessageRecordList;
}
/**
* 组装订阅消息发送结果数据
*
* @param weChatMessagePushVO 微信请求参数信息
* @return List<SubscribeMessageSendRecord>
*/
private List<SubscribeMessageSendRecord> createSubscribeMessageSendRecordList(WeChatMessagePushVO weChatMessagePushVO) {
return weChatMessagePushVO.getSubscribeMsgSentEvent().getSubscribeMsgSentEventList().stream().map(item -> {
SubscribeMessageSendRecord sendRecord = new SubscribeMessageSendRecord();
sendRecord.setOpenid(StringUtils.isBlank(weChatMessagePushVO.getFromUserName()) ? "" : weChatMessagePushVO.getFromUserName());
sendRecord.setAppletId(StringUtils.isBlank(weChatMessagePushVO.getToUserName()) ? "" : weChatMessagePushVO.getToUserName());
sendRecord.setTemplateId(StringUtils.isBlank(item.getTemplateId()) ? "" : item.getTemplateId());
sendRecord.setMessageType(StringUtils.isBlank(weChatMessagePushVO.getMsgType()) ? "" : weChatMessagePushVO.getMsgType());
sendRecord.setMsgId(StringUtils.isBlank(item.getMsgId()) ? "" : item.getMsgId());
sendRecord.setSubscribeTime(StringUtils.isBlank(weChatMessagePushVO.getCreateTime()) ? null : DateUtils.timestampToLocalDateTime(Long.parseLong(weChatMessagePushVO.getCreateTime()) * 1000L));
sendRecord.setCreateTime(LocalDateTime.now());
sendRecord.setErrorStatus(StringUtils.isBlank(item.getErrorStatus()) ? "" : item.getErrorStatus());
sendRecord.setErrorCode(StringUtils.isBlank(item.getErrorCode()) ? null : Integer.parseInt(item.getErrorCode()));
return sendRecord;
}).collect(Collectors.toList());
}
}

View File

@ -0,0 +1,25 @@
package com.xinelu.mobile.vo.wechatappletcallback;
import lombok.Data;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.io.Serializable;
import java.util.List;
/**
* @Description 当用户在手机端服务通知里消息卡片右上角...管理消息实体类
* @Author 纪寒
* @Date 2024-03-19 16:12:17
* @Version 1.0
*/
@Root(name = "SubscribeMsgChangeEvent", strict = false)
@Data
public class SubscribeMsgChangeEventVO implements Serializable {
private static final long serialVersionUID = -6682105837610124794L;
/**
* 信息集合
*/
@ElementList(inline = true, required = false)
private List<SubscribeMsgPopupEventListVO> subscribeMsgPopupEventList;
}

View File

@ -0,0 +1,36 @@
package com.xinelu.mobile.vo.wechatappletcallback;
import lombok.Data;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
import java.io.Serializable;
/**
* @Description 模板信息集合
* @Author 纪寒
* @Date 2024-03-19 16:10:28
* @Version 1.0
*/
@Root(name = "List", strict = false)
@Data
public class SubscribeMsgPopupEventListVO implements Serializable {
private static final long serialVersionUID = 548605591615555467L;
/**
* 模板id
*/
@Element(name = "TemplateId", required = false)
private String templateId;
/**
* 订阅结果accept接收reject拒收
*/
@Element(name = "SubscribeStatusString", required = false)
private String subscribeStatusString;
/**
* 弹框场景0代表在小程序页面内
*/
@Element(name = "PopupScene", required = false)
private String popupScene;
}

View File

@ -0,0 +1,25 @@
package com.xinelu.mobile.vo.wechatappletcallback;
import lombok.Data;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.io.Serializable;
import java.util.List;
/**
* @Description 当用户触发订阅消息弹框后信息实体类
* @Author 纪寒
* @Date 2024-03-19 16:09:23
* @Version 1.0
*/
@Root(name = "SubscribeMsgPopupEvent", strict = false)
@Data
public class SubscribeMsgPopupEventVO implements Serializable {
private static final long serialVersionUID = -6682105837610124794L;
/**
* 信息集合
*/
@ElementList(inline = true, required = false)
private List<SubscribeMsgPopupEventListVO> subscribeMsgPopupEventList;
}

View File

@ -0,0 +1,42 @@
package com.xinelu.mobile.vo.wechatappletcallback;
import lombok.Data;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
import java.io.Serializable;
/**
* @Description 调用订阅消息接口发送消息给用户的最终结果信息集合实体类
* @Author 纪寒
* @Date 2024-03-19 16:13:39
* @Version 1.0
*/
@Root(name = "List", strict = false)
@Data
public class SubscribeMsgSentEventListVO implements Serializable {
private static final long serialVersionUID = 3771741965224817805L;
/**
* 模板id
*/
@Element(name = "TemplateId", required = false)
private String templateId;
/**
* 消息id调用接口时也会返回
*/
@Element(name = "MsgID", required = false)
private String msgId;
/**
* 推送结果状态码0表示成功
*/
@Element(name = "ErrorCode", required = false)
private String errorCode;
/**
* 推送结果状态码对应的含义
*/
@Element(name = "ErrorStatus", required = false)
private String errorStatus;
}

View File

@ -0,0 +1,25 @@
package com.xinelu.mobile.vo.wechatappletcallback;
import lombok.Data;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.io.Serializable;
import java.util.List;
/**
* @Description 调用订阅消息接口发送消息给用户的最终结果实体类
* @Author 纪寒
* @Date 2024-03-19 16:13:23
* @Version 1.0
*/
@Root(name = "SubscribeMsgSentEvent", strict = false)
@Data
public class SubscribeMsgSentEventVO implements Serializable {
private static final long serialVersionUID = -6682105837610124794L;
/**
* 信息集合
*/
@ElementList(inline = true, required = false)
private List<SubscribeMsgSentEventListVO> subscribeMsgSentEventList;
}

View File

@ -0,0 +1,66 @@
package com.xinelu.mobile.vo.wechatappletcallback;
import lombok.Data;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
import java.io.Serializable;
/**
* @Description 微信小程序消息推送回调实体类
* @Author 纪寒
* @Date 2024-03-19 16:06:17
* @Version 1.0
*/
@Root(name = "xml", strict = false)
@Data
public class WeChatMessagePushVO implements Serializable {
private static final long serialVersionUID = 6233209958847696141L;
/**
* 小程序账号
*/
@Element(name = "ToUserName", required = false)
private String toUserName;
/**
* 用户openid
*/
@Element(name = "FromUserName", required = false)
private String fromUserName;
/**
* 时间戳
*/
@Element(name = "CreateTime", required = false)
private String createTime;
/**
* 消息类型
*/
@Element(name = "MsgType", required = false)
private String msgType;
/**
* 事件类型
*/
@Element(name = "Event", required = false)
private String event;
/**
* 当用户触发订阅消息弹框后触发时间集合
*/
@Element(name = "SubscribeMsgPopupEvent", required = false)
private SubscribeMsgPopupEventVO subscribeMsgPopupEvent;
/**
* 当用户在手机端服务通知里消息卡片右上角...管理消息时
*/
@Element(name = "SubscribeMsgChangeEvent", required = false)
private SubscribeMsgChangeEventVO subscribeMsgChangeEvent;
/**
* 当用户在手机端服务通知里消息卡片右上角...管理消息时
*/
@Element(name = "SubscribeMsgSentEvent", required = false)
private SubscribeMsgSentEventVO subscribeMsgSentEvent;
}

View File

@ -2,5 +2,5 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xinelu.mobile.mapper.MobileTestMapper">
<mapper namespace="com.xinelu.mobile.mapper.mobiletest.MobileTestMapper">
</mapper>