| 
					
				 | 
			
			
				@ -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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 |