package cn.lili.modules.wechat.serviceimpl; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.HttpUtils; import cn.lili.modules.order.order.entity.enums.OrderStatusEnum; import cn.lili.modules.wechat.entity.dos.WechatMPMessage; import cn.lili.modules.wechat.entity.enums.WechatMessageItemEnums; import cn.lili.modules.wechat.mapper.WechatMPMessageMapper; import cn.lili.modules.wechat.service.WechatMPMessageService; import cn.lili.modules.wechat.util.WechatAccessTokenUtil; import cn.lili.modules.wechat.util.WechatMessageUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 微信小程序消息订阅 业务实现 * * @author Chopper */ @Service @Slf4j public class WechatMPMessageServiceImpl extends ServiceImpl implements WechatMPMessageService { @Autowired private WechatAccessTokenUtil wechatAccessTokenUtil; /** * get 获取所有的模版 */ private final String allMsgTpl = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token="; /** * 获取keyid */ private final String keywords = "https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords?access_token="; /** * post 删除模版 添加模版 获取模版id */ private final String delMsgTpl = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate?access_token="; /** * post 添加模版 */ private final String addTpl = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate?access_token="; @Override public void init() { this.baseMapper.deleteAll(); try { String accessToken = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP); //获取已有模版,删除 String context = HttpUtil.get(allMsgTpl + accessToken); log.info("获取全部模版:{}", context); JSONObject jsonObject = new JSONObject(context); WechatMessageUtil.wechatHandler(jsonObject); List oldList = new ArrayList<>(); if (jsonObject.containsKey("data")) { jsonObject.getJSONArray("data").forEach(item -> { oldList.add(JSONUtil.parseObj(item).getStr("priTmplId")); }); } if (oldList.size() != 0) { oldList.forEach(templateId -> { Map params = new HashMap<>(1); params.put("priTmplId", templateId); String message = WechatMessageUtil.wechatHandler(HttpUtil.post(delMsgTpl + accessToken, params)); log.info("删除模版请求:{},删除模版响应:{}", params, message); }); } //加入数据 List tmpList = initData(); tmpList.forEach(tplData -> { WechatMPMessage wechatMPMessage = new WechatMPMessage(); Map params = new HashMap<>(16); params.put("tid", tplData.getTid()); //获取微信消息订阅keys String keywordsItems = WechatMessageUtil.wechatHandler(HttpUtil.get(keywords + accessToken, params)); JSONArray jsonArray = new JSONObject(keywordsItems).getJSONArray("data"); List keywordArray = jsonArray.toList(WechatMessageKeyword.class); log.info("keywords:" + keywordArray); //存放约定好的kids List kids = new ArrayList<>(tplData.keyWord.size()); List kidTexts = new ArrayList<>(tplData.keyWord.size()); keywordArray: for (WechatMessageItemEnums enums : tplData.getKeyWord()) { for (String tplKey : enums.getText()) { for (WechatMessageKeyword wechatMessageKeyword : keywordArray) { if (wechatMessageKeyword.getName().equals(tplKey)) { kids.add(wechatMessageKeyword.getKid()); kidTexts.add(wechatMessageKeyword.getRule() + wechatMessageKeyword.getKid()); continue keywordArray; } } } } params = new HashMap<>(4); params.put("tid", tplData.getTid()); params.put("kidList", kids); params.put("sceneDesc", tplData.getSceneDesc()); String content = HttpUtils.doPostWithJson(addTpl + accessToken, params); log.info("添加模版参数:{},添加模版响应:{}", params, content); JSONObject tplContent = new JSONObject(content); WechatMessageUtil.wechatHandler(tplContent); //如果包含模版id则进行操作,否则抛出异常 if (tplContent.containsKey("priTmplId")) { wechatMPMessage.setCode(tplContent.getStr("priTmplId")); } else { throw new ServiceException(ResultCode.WECHAT_MP_MESSAGE_TMPL_ERROR); } wechatMPMessage.setName(tplData.getSceneDesc()); wechatMPMessage.setTemplateId(tplData.getTid()); wechatMPMessage.setKeywords(JSONUtil.toJsonStr(tplData.getKeyWord())); wechatMPMessage.setKeywordsText(JSONUtil.toJsonStr(kidTexts)); wechatMPMessage.setEnable(true); wechatMPMessage.setOrderStatus(tplData.getOrderStatus().name()); this.save(wechatMPMessage); }); } catch (Exception e) { log.error("初始化微信消息异常", e); } } public List initData() { List msg = new ArrayList<>(); //支付提醒 List PAIDkeyWord = new ArrayList<>(); PAIDkeyWord.add(WechatMessageItemEnums.ORDER_SN); PAIDkeyWord.add(WechatMessageItemEnums.MEMBER_NAME); PAIDkeyWord.add(WechatMessageItemEnums.PRICE); PAIDkeyWord.add(WechatMessageItemEnums.GOODS_INFO); msg.add(new WechatMPMessageData( "订单支付成功,准备发货", "487", PAIDkeyWord, OrderStatusEnum.UNDELIVERED)); //发货提醒 List deliverdKeyWord = new ArrayList<>(); deliverdKeyWord.add(WechatMessageItemEnums.ORDER_SN); deliverdKeyWord.add(WechatMessageItemEnums.GOODS_INFO); deliverdKeyWord.add(WechatMessageItemEnums.LOGISTICS_NAME); deliverdKeyWord.add(WechatMessageItemEnums.LOGISTICS_NO); msg.add(new WechatMPMessageData( "订单发货成功", "374", deliverdKeyWord, OrderStatusEnum.DELIVERED)); //已完成 List completeKeyWord = new ArrayList<>(); completeKeyWord.add(WechatMessageItemEnums.SHOP_NAME); completeKeyWord.add(WechatMessageItemEnums.GOODS_INFO); msg.add(new WechatMPMessageData( "订单完成", "3606", completeKeyWord, OrderStatusEnum.COMPLETED)); return msg; } } @Data @AllArgsConstructor @NoArgsConstructor class WechatMPMessageData { /** * 场景描述 // 等于本服务器模版名称 */ String sceneDesc; /** * 模版id */ String tid; /** * 自身服务器 消息字段 */ List keyWord; /** * 处于什么状态发送 */ OrderStatusEnum orderStatus; } @Data class WechatMessageKeyword { /** * id字段 */ private String kid; /** * 名称 */ private String name; /** * 示例值 */ private String example; /** * 示例值 */ private String rule; }