|  | @ -0,0 +1,223 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.util.wechat;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.fasterxml.jackson.databind.ObjectMapper;
 | 
	
		
			
				|  |  | import com.yihu.jw.entity.base.wx.*;
 | 
	
		
			
				|  |  | import com.yihu.jw.util.wechat.wxhttp.HttpUtil;
 | 
	
		
			
				|  |  | import com.yihu.utils.network.HttpUtils;
 | 
	
		
			
				|  |  | import org.apache.commons.collections.map.HashedMap;
 | 
	
		
			
				|  |  | import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | import org.json.JSONObject;
 | 
	
		
			
				|  |  | import org.slf4j.Logger;
 | 
	
		
			
				|  |  | import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.stereotype.Component;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import javax.annotation.PostConstruct;
 | 
	
		
			
				|  |  | import java.util.HashMap;
 | 
	
		
			
				|  |  | import java.util.Map;
 | 
	
		
			
				|  |  | import java.util.concurrent.LinkedBlockingQueue;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * 微信模板消息工具类
 | 
	
		
			
				|  |  |  * 调用putWxMsg 发送模板消息
 | 
	
		
			
				|  |  |  * 微信文档地址
 | 
	
		
			
				|  |  |  * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
 | 
	
		
			
				|  |  |  * Created by Trick on 2018/8/21.
 | 
	
		
			
				|  |  |  */
 | 
	
		
			
				|  |  | @Component
 | 
	
		
			
				|  |  | public class WeixinMessagePushUtils {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private static Logger logger = LoggerFactory.getLogger(WeixinMessagePushUtils.class);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private static LinkedBlockingQueue<Map<String,Object>> queue = new LinkedBlockingQueue<Map<String,Object>>();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public void putWxMsg(String accessToken,String opennid,WxTemplateConfigDO wxTemplateConfigDO){
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             Map<String,Object> mes = new HashMap();
 | 
	
		
			
				|  |  |             if(StringUtils.isBlank(opennid)){
 | 
	
		
			
				|  |  |                 logger.info("wechat queue put opennid is null ");
 | 
	
		
			
				|  |  |                 return;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             if(StringUtils.isBlank(accessToken)){
 | 
	
		
			
				|  |  |                 logger.info("wechat queue put accessToken is null ");
 | 
	
		
			
				|  |  |                 return;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             mes.put("accessToken",accessToken);
 | 
	
		
			
				|  |  |             mes.put("openid",opennid);
 | 
	
		
			
				|  |  |             mes.put("wxTemplateConfig",wxTemplateConfigDO);
 | 
	
		
			
				|  |  |             queue.put(mes);
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             logger.info("wechat queue put error :",e);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @PostConstruct
 | 
	
		
			
				|  |  |     private void run() {
 | 
	
		
			
				|  |  |         new Thread(new ConsumerTask()).start();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     // 消费者
 | 
	
		
			
				|  |  |     class ConsumerTask implements Runnable {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         @Override
 | 
	
		
			
				|  |  |         public void run() {
 | 
	
		
			
				|  |  |             while (true) {
 | 
	
		
			
				|  |  |                 try {
 | 
	
		
			
				|  |  |                     // 如果queue为空,则当前线程会堵塞,直到有新数据加入
 | 
	
		
			
				|  |  |                     Map<String,Object> mes = queue.take();
 | 
	
		
			
				|  |  |                     //发送微信模板消息
 | 
	
		
			
				|  |  |                     sendWeixinMessage(mes);
 | 
	
		
			
				|  |  |                 }catch (Exception e){
 | 
	
		
			
				|  |  |                     logger.info("wechat ConsumerTask run:",e);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 发送微信模板消息
 | 
	
		
			
				|  |  |      * @param mes
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public boolean sendWeixinMessage(Map<String,Object> mes){
 | 
	
		
			
				|  |  |         WxTemplateConfigDO wxtemp = (WxTemplateConfigDO)mes.get("wxTemplateConfig");
 | 
	
		
			
				|  |  |         String token = (String)mes.get("accessToken");
 | 
	
		
			
				|  |  |         //发送微信模板地址
 | 
	
		
			
				|  |  |         String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token;
 | 
	
		
			
				|  |  |         //微信消息参数
 | 
	
		
			
				|  |  |         String params = getWxParam(mes);
 | 
	
		
			
				|  |  |         if(StringUtils.isBlank(params)){
 | 
	
		
			
				|  |  |             logger.info("wechat params is null");
 | 
	
		
			
				|  |  |             return false;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //发送微信模板消息
 | 
	
		
			
				|  |  |         String result = HttpUtil.sendPost(url, params);
 | 
	
		
			
				|  |  |         JSONObject jsonResult = new JSONObject(result);
 | 
	
		
			
				|  |  |         if (Integer.parseInt(jsonResult.get("errcode").toString()) == 0) {
 | 
	
		
			
				|  |  |             logger.info("wechat temp send success");
 | 
	
		
			
				|  |  |             return true;
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             logger.error("wechat temp send fail:"+result);
 | 
	
		
			
				|  |  |             return false;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 构造微信模板参数
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param mes
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public String getWxParam(Map<String,Object> mes){
 | 
	
		
			
				|  |  |         try{
 | 
	
		
			
				|  |  |             String toUser = (String)mes.get("openid");
 | 
	
		
			
				|  |  |             //微信模板消息实体
 | 
	
		
			
				|  |  |             WxTemplateConfigDO wxtemp = (WxTemplateConfigDO)mes.get("wxTemplateConfig");
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             //创建微信模板实体,设置参数及内容
 | 
	
		
			
				|  |  |             WechatTemplateDO wechatTemp = new WechatTemplateDO();
 | 
	
		
			
				|  |  |             //接收者的openid
 | 
	
		
			
				|  |  |             wechatTemp.setTouser(toUser);
 | 
	
		
			
				|  |  |             //设置模板ID
 | 
	
		
			
				|  |  |             wechatTemp.setTemplate_id(wxtemp.getTemplateId());
 | 
	
		
			
				|  |  |             //设置跳转路径
 | 
	
		
			
				|  |  |             if(StringUtils.isNotBlank(wxtemp.getUrl())){
 | 
	
		
			
				|  |  |                 wechatTemp.setUrl(wxtemp.getUrl());
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             //设置小程序跳转
 | 
	
		
			
				|  |  |             if(StringUtils.isNotBlank(wxtemp.getAppid())){
 | 
	
		
			
				|  |  |                 Miniprogram miniprogram = new Miniprogram();
 | 
	
		
			
				|  |  |                 miniprogram.setAppid(wxtemp.getAppid());
 | 
	
		
			
				|  |  |                 miniprogram.setPagepath(wxtemp.getPagepath());
 | 
	
		
			
				|  |  |                 wechatTemp.setMiniprogram(miniprogram);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             //配置微信模板内容
 | 
	
		
			
				|  |  |             setWechatTemplateData(wechatTemp,wxtemp);
 | 
	
		
			
				|  |  |             ObjectMapper mapper = new ObjectMapper();
 | 
	
		
			
				|  |  |             String strJson = mapper.writeValueAsString(wechatTemp);
 | 
	
		
			
				|  |  |             logger.info("--------wechat param json message --------:" + strJson);
 | 
	
		
			
				|  |  |             return strJson;
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             logger.info("--------wechat param json message --------:" + e);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return "";
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 设置微信模板内容
 | 
	
		
			
				|  |  |      * @param wechatTemp 微信待发送模板
 | 
	
		
			
				|  |  |      * @param wxtemp 读取数据配置
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public void setWechatTemplateData(WechatTemplateDO wechatTemp,WxTemplateConfigDO wxtemp){
 | 
	
		
			
				|  |  |         //设置模板内容
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         Map<String,WechatTemplateDataDO> data = new HashedMap();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         //设置头部
 | 
	
		
			
				|  |  |         WechatTemplateDataDO first = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |         first.setValue(wxtemp.getFirst());
 | 
	
		
			
				|  |  |         first.setColor("#000000");
 | 
	
		
			
				|  |  |         data.put("first",first);
 | 
	
		
			
				|  |  |         //设置备注
 | 
	
		
			
				|  |  |         WechatTemplateDataDO remark = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |         remark.setValue(wxtemp.getRemark());
 | 
	
		
			
				|  |  |         remark.setColor("#000000");
 | 
	
		
			
				|  |  |         data.put("remark",remark);
 | 
	
		
			
				|  |  |         //配置keyword,微信最多可配置7个项目
 | 
	
		
			
				|  |  |         //设置keyword1
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(wxtemp.getKeyword1())){
 | 
	
		
			
				|  |  |             WechatTemplateDataDO keyword1 = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |             keyword1.setValue(wxtemp.getRemark());
 | 
	
		
			
				|  |  |             keyword1.setColor("#000000");
 | 
	
		
			
				|  |  |             data.put("keyword1",keyword1);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //设置keyword2
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(wxtemp.getKeyword2())){
 | 
	
		
			
				|  |  |             WechatTemplateDataDO keyword2 = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |             keyword2.setValue(wxtemp.getKeyword2());
 | 
	
		
			
				|  |  |             keyword2.setColor("#000000");
 | 
	
		
			
				|  |  |             data.put("keyword2",keyword2);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //设置keyword3
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(wxtemp.getKeyword3())){
 | 
	
		
			
				|  |  |             WechatTemplateDataDO keyword3 = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |             keyword3.setValue(wxtemp.getKeyword3());
 | 
	
		
			
				|  |  |             keyword3.setColor("#000000");
 | 
	
		
			
				|  |  |             data.put("keyword3",keyword3);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //设置keyword4
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(wxtemp.getKeyword4())){
 | 
	
		
			
				|  |  |             WechatTemplateDataDO keyword4 = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |             keyword4.setValue(wxtemp.getKeyword4());
 | 
	
		
			
				|  |  |             keyword4.setColor("#000000");
 | 
	
		
			
				|  |  |             data.put("keyword4",keyword4);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //设置keyword5
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(wxtemp.getKeyword5())){
 | 
	
		
			
				|  |  |             WechatTemplateDataDO keyword5 = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |             keyword5.setValue(wxtemp.getKeyword5());
 | 
	
		
			
				|  |  |             keyword5.setColor("#000000");
 | 
	
		
			
				|  |  |             data.put("keyword5",keyword5);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //设置keyword6
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(wxtemp.getKeyword6())){
 | 
	
		
			
				|  |  |             WechatTemplateDataDO keyword6 = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |             keyword6.setValue(wxtemp.getKeyword6());
 | 
	
		
			
				|  |  |             keyword6.setColor("#000000");
 | 
	
		
			
				|  |  |             data.put("keyword1",keyword6);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //设置keyword7
 | 
	
		
			
				|  |  |         if(StringUtils.isNotBlank(wxtemp.getKeyword7())){
 | 
	
		
			
				|  |  |             WechatTemplateDataDO keyword7 = new WechatTemplateDataDO();
 | 
	
		
			
				|  |  |             keyword7.setValue(wxtemp.getKeyword7());
 | 
	
		
			
				|  |  |             keyword7.setColor("#000000");
 | 
	
		
			
				|  |  |             data.put("keyword7",keyword7);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //设置微信内容,头部,备注,项目参数
 | 
	
		
			
				|  |  |         wechatTemp.setData(data);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 |