|
@@ -0,0 +1,106 @@
|
|
|
+package com.fs.task;
|
|
|
+
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.alibaba.fastjson.TypeReference;
|
|
|
+import com.fs.store.domain.FsMiniprogramSubNotifyTask;
|
|
|
+import com.fs.store.dto.ClientCredGrantReqDTO;
|
|
|
+import com.fs.store.dto.MiniGramSubsMsgResultDTO;
|
|
|
+import com.fs.store.dto.TemplateMessageSendRequestDTO;
|
|
|
+import com.fs.store.dto.WeXinAccessTokenDTO;
|
|
|
+import com.fs.store.enums.MiniAppNotifyTaskStatus;
|
|
|
+import com.fs.store.mapper.FsMiniprogramSubNotifyTaskMapper;
|
|
|
+import com.fs.store.service.IWechatMiniProgrService;
|
|
|
+import com.fs.wx.miniapp.config.WxMaProperties;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.apache.commons.lang.exception.ExceptionUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 小程序订阅通知定时任务
|
|
|
+ */
|
|
|
+@Service("miniProgramSubTask")
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class MiniProgramSubTask {
|
|
|
+ private final IWechatMiniProgrService wechatMiniProgrService;
|
|
|
+
|
|
|
+ private final FsMiniprogramSubNotifyTaskMapper notifyTaskMapper;
|
|
|
+
|
|
|
+ private WxMaProperties.Config config = null;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public void setConfig(WxMaProperties properties) {
|
|
|
+ if(ObjectUtil.isNotNull(properties)){
|
|
|
+ this.config = properties.getConfigs().get(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 小程序订阅通知
|
|
|
+ */
|
|
|
+ public void notifyMiniAppSub(){
|
|
|
+ log.info("小程序订阅通知定时任务");
|
|
|
+ // 先获取所有可用待处理任务
|
|
|
+ List<FsMiniprogramSubNotifyTask> pendingData = notifyTaskMapper.selectPendingData();
|
|
|
+ if(CollectionUtils.isEmpty(pendingData)){
|
|
|
+ log.info("小程序订阅通知定时任务, 无待处理数据");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ for (FsMiniprogramSubNotifyTask pendingDatum : pendingData) {
|
|
|
+ pendingDatum.setUpdateTime(LocalDateTime.now());
|
|
|
+
|
|
|
+ ClientCredGrantReqDTO clientCredGrantReqDTO = new ClientCredGrantReqDTO();
|
|
|
+ clientCredGrantReqDTO.setAppid(config.getAppid());
|
|
|
+ clientCredGrantReqDTO.setSecret(config.getSecret());
|
|
|
+ clientCredGrantReqDTO.setGrantType("client_credential");
|
|
|
+
|
|
|
+ try{
|
|
|
+ // 获取accessToken
|
|
|
+ WeXinAccessTokenDTO stableToken = wechatMiniProgrService
|
|
|
+ .getStableToken(clientCredGrantReqDTO);
|
|
|
+
|
|
|
+ String accessToken = stableToken.getAccessToken();
|
|
|
+
|
|
|
+ // 调用微信小程序订阅通知
|
|
|
+ TemplateMessageSendRequestDTO sendRequestDTO = new TemplateMessageSendRequestDTO();
|
|
|
+ sendRequestDTO.setTemplateId(pendingDatum.getTemplateId());
|
|
|
+ sendRequestDTO.setTouser(pendingDatum.getTouser());
|
|
|
+ sendRequestDTO.setPage(pendingDatum.getPage());
|
|
|
+ TypeReference<Map<String, TemplateMessageSendRequestDTO.TemplateDataValue>> typeReference = new TypeReference(){};
|
|
|
+ sendRequestDTO.setData(JSONObject.parseObject(pendingDatum.getData(),typeReference));
|
|
|
+ MiniGramSubsMsgResultDTO miniGramSubsMsgResultDTO = wechatMiniProgrService.sendSubscribeMsg(accessToken, sendRequestDTO);
|
|
|
+ pendingDatum.setRequestBody(JSONObject.toJSONString(sendRequestDTO));
|
|
|
+ pendingDatum.setResponseBody(JSONObject.toJSONString(miniGramSubsMsgResultDTO));
|
|
|
+
|
|
|
+ // 如果推送消息成功
|
|
|
+ if(miniGramSubsMsgResultDTO.getErrcode() == 0){
|
|
|
+ pendingDatum.setStatus(MiniAppNotifyTaskStatus.SUCCESS.getValue());
|
|
|
+ } else {
|
|
|
+ // 更新任务状态为执行失败
|
|
|
+ pendingDatum.setStatus(MiniAppNotifyTaskStatus.FAILED.getValue());
|
|
|
+ pendingDatum.setErrorMessage(JSONObject.toJSONString(miniGramSubsMsgResultDTO));
|
|
|
+ pendingDatum.setRetryCount(pendingDatum.getRetryCount() +1);
|
|
|
+ }
|
|
|
+ }catch (Exception e){
|
|
|
+ // 更新任务状态为执行失败
|
|
|
+ pendingDatum.setStatus(MiniAppNotifyTaskStatus.FAILED.getValue());
|
|
|
+ pendingDatum.setErrorMessage(ExceptionUtils.getStackTrace(e));
|
|
|
+ pendingDatum.setRetryCount(pendingDatum.getRetryCount() +1);
|
|
|
+ log.error("小程序订阅通知定时任务异常: {}", ExceptionUtils.getStackTrace(e));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(CollectionUtils.isNotEmpty(pendingData)){
|
|
|
+ notifyTaskMapper.updateBatchById(pendingData);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|