精华内容
下载资源
问答
  • 微信公众号消息模板发送微信公众号消息模板群发功能开通申请模板消息功能获取模板消息发送所需参数AccessToken pojo类TemplateData pojo类WxTagsEntity pojo类WxTemplate pojo类WxTemplateEntity pojo类微信公众号...

    微信公众号消息模板群发功能

    开通申请模板消息功能

    1 >> 在微信公众平台的后台,依次进入“功能->添加功能插件->模板消息”,即可申请模板消息(模板消息的申请需账号已经开通微信支付权限)

    2 >> 点击申请

    3 >> 申请时,选择2个和自己相关的行业即可

    4 >> 提交并且申请通过后,可以在模板库中看到模板消息列表,选择一个匹配自己的模板消息点击详情添加(微信提供的模板消息里面基本已经涵盖的很全了,如果没有找到合适自己的也可以自己申请创建一个新的模板消息,我这里用的是一个现成的模板消息)

    5 >> 申请完后就可以在自己的模板消息查看你要用的模板消息的id

    获取模板消息发送所需参数

    1. 获取access_token
    2. 获取模板消息 template_id
    3. 获取标签 tagid 通过tagid 获取标签下用户的 openid
    4. 根据 申请审核的消息模板 创建 data
    	"data":{
               "first": {
                    "value":"您好!课程测试消息!",
                    "color":"#173177"
                },
                "keyword1":{
                    "value":"课程001",
                    "color":"#173177"
                },
                "keyword2": {
                    "value":"张老师",
                    "color":"#173177"
                },
                "remark":{
                    "value":"望准时参加",
                    "color":"#173177"
                }
        };
    

    AccessToken pojo类

    	package net.mingsoft.common.wx.pojo;
    
    import java.util.Calendar;
    
    public class AccessToken {    
        // 获取到的凭证    
        private String token;    
        // 凭证有效时间,单位:秒    
        private Calendar expiresIn;    
        
        public String getToken() {    
            return token;    
        }    
        
        public void setToken(String token) {    
            this.token = token;    
        }
    
    	public Calendar getExpiresIn() {
    		return expiresIn;
    	}
    
    	public void setExpiresIn(Calendar expiresIn) {
    		this.expiresIn = expiresIn;
    	}    
        
    }
    

    TemplateData pojo类

    	package net.mingsoft.common.wx.pojo;
    /**
     * 模板数据
     * @author CLiang
     */
    public class TemplateData {
        private String value;//模板显示值
        private String color;//模板显示颜色
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        public String getColor() {
            return color;
        }
        public void setColor(String color) {
            this.color = color;
        }
    }
    

    WxTagsEntity pojo类

    package net.mingsoft.common.wx.pojo;
    public class WxTagsEntity {   
          
        private String id;  //标签id  
        private String name;  //标签名称
        private String count;  //此标签下粉丝数
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getCount() {
    		return count;
    	}
    	public void setCount(String count) {
    		this.count = count;
    	}
    }  
    

    WxTemplate pojo类

    package net.mingsoft.common.wx.pojo;
    import java.util.Map;
    /**
     * 模板基类
     * @author CLiang
     *
     */
    public class WxTemplate {
        private String template_id;//模板ID
        private Integer tagid;//模板ID
        private Map<String,TemplateData> data;//模板里的数据
    	public String getTemplate_id() {
    		return template_id;
    	}
    	public void setTemplate_id(String template_id) {
    		this.template_id = template_id;
    	}
    	public Integer getTagid() {
    		return tagid;
    	}
    	public void setTagid(Integer tagid) {
    		this.tagid = tagid;
    	}
    	public Map<String, TemplateData> getData() {
    		return data;
    	}
    	public void setData(Map<String, TemplateData> data) {
    		this.data = data;
    	}
    }
     
    

    WxTemplateEntity pojo类

    package net.mingsoft.common.wx.pojo;
    public class WxTemplateEntity {   
          
        private String template_id;  //模板ID  
        private String title;  //模板标题  
        private String primary_industry;  //模板所属行业的一级行业  
        private String deputy_industry;  //模板所属行业的二级行业  
        private String content;  //模板内容  
        private String example;  //模板示例  
    	public String getTemplate_id() {
    		return template_id;
    	}
    	public void setTemplate_id(String template_id) {
    		this.template_id = template_id;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
    	public String getPrimary_industry() {
    		return primary_industry;
    	}
    	public void setPrimary_industry(String primary_industry) {
    		this.primary_industry = primary_industry;
    	}
    	public String getDeputy_industry() {
    		return deputy_industry;
    	}
    	public void setDeputy_industry(String deputy_industry) {
    		this.deputy_industry = deputy_industry;
    	}
    	public String getContent() {
    		return content;
    	}
    	public void setContent(String content) {
    		this.content = content;
    	}
    	public String getExample() {
    		return example;
    	}
    	public void setExample(String example) {
    		this.example = example;
    	}
      
    }  
    

    微信公众号消息模板工具类

    package net.mingsoft.common.wx.wxUtils;    
    import java.io.BufferedReader;    
    import java.io.InputStream;    
    import java.io.InputStreamReader;    
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.ConnectException;    
    import java.net.URL;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.sql.Date;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Formatter;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.net.ssl.HttpsURLConnection;    
    import javax.net.ssl.SSLContext;    
    import javax.net.ssl.SSLSocketFactory;    
    import javax.net.ssl.TrustManager;
    import javax.servlet.http.HttpServletRequest;
    
    import org.slf4j.Logger;    
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.data.convert.WritingConverter;
    import org.springframework.stereotype.Component;
    import org.springframework.web.client.RestTemplate;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    import cn.hutool.json.JSONException;
    import net.mingsoft.common.wx.pojo.AccessToken;
    import net.mingsoft.common.wx.pojo.JsApiTicket;
    import net.mingsoft.common.wx.pojo.TemplateData;
    import net.mingsoft.common.wx.pojo.WxTemplate;    
        
    /**  
     * 公众平台通用接口工具类  
     *  
     */    
    @Component
    public class WeixinUtil {    
        private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);    
        @Value("${weixin.AppId}")
    	private String APPID;
    	@Value("${weixin.AppSecret}")
    	private String AppSecret;
    	@Value("${weixin.domain}")
    	private String domain;
    	@Autowired
    	private RestTemplate rest;
    	 //创建一个静态map缓存  
        private static Map<String,Object> weixinCache = new HashMap<String, Object>();
        /**  
         * 发起https请求并获取结果  
         *   
         * @param requestUrl 请求地址  
         * @param requestMethod 请求方式(GET、POST)  
         * @param outputStr 提交的数据  
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)  
         */    
        public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {    
            JSONObject jsonObject = null;    
            StringBuffer buffer = new StringBuffer();    
            try {    
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化    
                TrustManager[] tm = { new MyX509TrustManager() };    
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");    
                sslContext.init(null, tm, new java.security.SecureRandom());    
                // 从上述SSLContext对象中得到SSLSocketFactory对象    
                SSLSocketFactory ssf = sslContext.getSocketFactory();    
        
                URL url = new URL(requestUrl);    
                HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();    
                httpUrlConn.setSSLSocketFactory(ssf);    
        
                httpUrlConn.setDoOutput(true);    
                httpUrlConn.setDoInput(true);    
                httpUrlConn.setUseCaches(false);    
                // 设置请求方式(GET/POST)    
                httpUrlConn.setRequestMethod(requestMethod);    
        
                if ("GET".equalsIgnoreCase(requestMethod))    
                    httpUrlConn.connect();    
        
                // 当有数据需要提交时    
                if (null != outputStr) {    
                    OutputStream outputStream = httpUrlConn.getOutputStream();    
                    // 注意编码格式,防止中文乱码    
                    outputStream.write(outputStr.getBytes("UTF-8"));    
                    outputStream.close();    
                }    
        
                // 将返回的输入流转换成字符串    
                InputStream inputStream = httpUrlConn.getInputStream();    
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");    
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);    
        
                String str = null;    
                while ((str = bufferedReader.readLine()) != null) {    
                    buffer.append(str);    
                }    
                bufferedReader.close();    
                inputStreamReader.close();    
                // 释放资源    
                inputStream.close();    
                inputStream = null;    
                httpUrlConn.disconnect();    
                jsonObject = JSONObject.parseObject(buffer.toString());    
            } catch (ConnectException ce) {    
                log.error("Weixin server connection timed out.");    
            } catch (Exception e) {    
                log.error("https request error:{}", e);    
            }    
            return jsonObject;    
        }    
        
        // 获取access_token的接口地址(GET) 限200(次/天)    
        public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";    
        /**  
         * 获取access_token  
         *   
         * @param appid 凭证  
         * @param appsecret 密钥  
         * @return  
         */    
        public static AccessToken getAccessToken(String appid, String appsecret) {    
            AccessToken accessToken = (AccessToken) weixinCache.get("accessToken"); 
            
            String request_url = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);      
            if(accessToken != null){  
                Calendar current = Calendar.getInstance();  
                Calendar ever = accessToken.getExpiresIn();
                if(ever.before(current)){  
                    JSONObject jsonObject = WeixinUtil.httpRequest(request_url, "GET", null);  
                    weixinCache.remove("accessToken");  
                    accessToken = new AccessToken();    
                    long etime1=System.currentTimeMillis()+(jsonObject.getInteger("expires_in")*1000);//延时函数,单位毫秒,这里是延时了5分钟
                    Date expiresIn = new Date(etime1);  
                    Calendar ever1 = Calendar.getInstance();
                    ever1.setTime(expiresIn); 
                    accessToken.setExpiresIn(ever1); 
                    accessToken.setToken(jsonObject.getString("access_token"));    
                    weixinCache.put("accessToken", accessToken); 
                    log.info("accessToken is invalid : --------------------------------"+accessToken.getToken(),WeixinUtil.class);
                }  
                log.info("accessToken is available : --------------------------------"+accessToken.getToken(),WeixinUtil.class);
            }else{  
                //同上面的else里的code  
                JSONObject jsonObject = WeixinUtil.httpRequest(request_url, "GET", null);  
                if(jsonObject.containsKey("errcode")&&jsonObject.getInteger("errcode")!=0) {
                	log.info("获取access_token 失败:"+jsonObject.toJSONString(),WeixinUtil.class);
                	return null;
                }
                weixinCache.remove("accessToken");  
                accessToken = new AccessToken();    
                accessToken.setToken(jsonObject.getString("access_token"));    
                long etime1=System.currentTimeMillis()+(jsonObject.getInteger("expires_in")*1000);//延时函数,单位毫秒,这里是延时了5分钟
                Date expiresIn = new Date(etime1);  
                Calendar ever1 = Calendar.getInstance();
                ever1.setTime(expiresIn); 
                accessToken.setExpiresIn(ever1); 
                weixinCache.put("accessToken", accessToken); 
                log.info("accessToken is null : --------------------------------"+accessToken.getToken(),WeixinUtil.class);
            } 
            return accessToken;    
        }   
        
        
       
        public static JsApiTicket getJsApiTicket(String accessToken){  
                String ticket_str = null;  
                        JsApiTicket jsApiTicket = (JsApiTicket) weixinCache.get("ticket");  
                if(jsApiTicket != null){  
                    Calendar ever = jsApiTicket.getExpiresIn();  
                    Calendar current = Calendar.getInstance();  
                    if(ever.before(current)){  
                    	String request_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi".replace("ACCESS_TOKEN", accessToken);  
                        JSONObject jsonObject = WeixinUtil.httpRequest(request_url, "GET", null);  
                        ticket_str = jsonObject.getString("ticket");  
                        weixinCache.remove("ticket");  
                        jsApiTicket = new JsApiTicket();  
                        Calendar ever1 = Calendar.getInstance();  
                        long etime1=System.currentTimeMillis()+(jsonObject.getInteger("expires_in")*1000);//延时函数,单位毫秒,这里是延时了5分钟
                        Date date=new Date(etime1);
                        ever1.setTime(date);
                        jsApiTicket.setExpiresIn(ever1);  
                        jsApiTicket.setTicket(ticket_str);  
                        weixinCache.put("ticket", jsApiTicket); 
                    }  
                }else{  
                    //同上面的else里的code  
                	String request_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi".replace("ACCESS_TOKEN", accessToken);  
                    JSONObject jsonObject = WeixinUtil.httpRequest(request_url, "GET", null);  
                    ticket_str = jsonObject.getString("ticket");  
                    weixinCache.remove("ticket");  
                    jsApiTicket = new JsApiTicket();  
                    Calendar ever1 = Calendar.getInstance();  
                    long etime1=System.currentTimeMillis()+(jsonObject.getInteger("expires_in")*1000);//延时函数,单位毫秒,这里是延时了5分钟
                    Date date=new Date(etime1);
                    ever1.setTime(date);
                    jsApiTicket.setExpiresIn(ever1);  
                    jsApiTicket.setTicket(ticket_str);  
                    weixinCache.put("ticket", jsApiTicket); 
                }  
                  
                return jsApiTicket;  
            } 
        
        
        //微信分享签名算法;
        public static Map<String, Object> sign(String jsapi_ticket, String url) {  
            Map<String, Object> ret = new HashMap<String, Object>();  
            String nonce_str = create_nonce_str();  
            String timestamp = create_timestamp();  
            String string1;  
            String signature = "";  
      
            //注意这里参数名必须全部小写,且必须有序  
            string1 = "jsapi_ticket=" + jsapi_ticket +  
                      "&noncestr=" + nonce_str +  
                      "&timestamp=" + timestamp +  
                      "&url=" + url;  
            System.out.println(string1);  
      
            try  
            {  
                MessageDigest crypt = MessageDigest.getInstance("SHA-1");  
                crypt.reset();  
                crypt.update(string1.getBytes("UTF-8")); //对string1 字符串进行SHA-1加密处理  
                signature = byteToHex(crypt.digest());  //对加密后字符串转成16进制  
            }  
            catch (NoSuchAlgorithmException e)  
            {  
                e.printStackTrace();  
            }  
            catch (UnsupportedEncodingException e)  
            {  
                e.printStackTrace();  
            }  
      
            ret.put("url", url);  
            ret.put("jsapi_ticket", jsapi_ticket);  
            ret.put("nonceStr", nonce_str);  
            ret.put("timestamp", timestamp);  
            ret.put("signature", signature);  
      
            return ret;  
        }  
      
        private static String byteToHex(final byte[] hash) {  
            Formatter formatter = new Formatter();  
            for (byte b : hash)  
            {  
                formatter.format("%02x", b);  
            }  
            String result = formatter.toString();  
            formatter.close();  
            return result;  
        }  
        //生成随机字符串  
        private static String create_nonce_str() {  
            return UUID.randomUUID().toString().replace("-", "");  
        }  
        //生成时间戳字符串  
        private static String create_timestamp() {  
            return Long.toString(System.currentTimeMillis() / 1000);  
        } 
        
        
        /**
         * 获取网页授权凭证
         * 
         * 
         * @param code
         * @return WeixinAouth2Token
         */
        public JSONObject getOauth2AccessToken(String code) {
        	JSONObject jsonObject = null;
        	try {
        		// 拼接请求地址
        		String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APPID+"&secret="+AppSecret+"&code="+code+"&grant_type=authorization_code";
        		//String requestUrl = "https://api.weixin.qq.com/sns/jscode2session?appid="+APPID+"&secret="+APPSECRET+"&js_code="+code+"&grant_type=authorization_code";
        		String resStr = rest.getForObject(requestUrl, String.class);
        		jsonObject=JSON.parseObject(resStr,JSONObject.class);
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
            return jsonObject;
        }
        /**
         * 获取网页授权凭证
         * 
         * 
         * @param code
         * @return WeixinAouth2Token
         */
        public String getOauth2Code(HttpServletRequest request) {
        	try {
    //    		String uri = urlEncodeUTF8("http://6gsw4p.natappfree.cc/weChat/loginByWX");
        		String uri = urlEncodeUTF8("http://"+domain+"/weChat/loginByWX");
        		// 拼接请求地址
        		String requestUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+APPID+"&redirect_uri="+uri+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
        		return requestUrl;
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
            return null;
        }
        /**
         * URL编码(utf-8)
         * 
         * @param source
         * @return
         */
        public static String urlEncodeUTF8(String source) {
            String result = source;
            try {
                result = java.net.URLEncoder.encode(source, "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return result;
        }
        
        /**
         * 发送模板消息前获取token
         * @param template_id_short 模板库中模板的编号
         * @param t
         * @param m
         */
    //    public static void sendMessageBefore(String template_id_short,WxTemplate t,Map<String,TemplateData> m){
    //        AccessToken token = null;
    //        token = AccessTokenInfo.accessToken;
            if(template_id_short!=null&&!"".equals(template_id_short)){
                WxTemplate template = WeixinUtil.getTemplate(template_id_short,token.getToken());
                t.setTemplate_id(template.getTemplate_id());
            }
    //        t.setData(m);
    //        sendMessage(t,token.getAccessToken());
    //    }
        /**
         * 发送模板消息
         * @param t
         * @param accessToken
         * @return
         */
        public int sendMessage(WxTemplate t,String accessToken) {
            int result = 0;
            // 拼装创建菜单的url
            String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", accessToken);
            // 将菜单对象转换成json字符串
            String jsonMenu = JSONObject.toJSONString(t);
            // 调用接口创建菜单
            JSONObject jsonObject = WeixinUtil.httpRequest(url, "POST", jsonMenu);
            //JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);
            if (null != jsonObject) {
                if (0 != jsonObject.getIntValue("errcode")) {
                    result = jsonObject.getIntValue("errcode");
                    System.out.println("发送模板消息失败 errcode:{"
                    +jsonObject.getIntValue("errcode")+"} errmsg:{"+jsonObject.getString("errmsg")+"}");
                }
            }
            return result;
        }
    }  
    

    消息模板群发消息

    	@ApiOperation(value = "消息模板群发消息")
      	@RequestMapping("/groupSending")
      	@ResponseBody
      	public Result groupSending(@RequestBody(required=false) WxTemplate wxTemplate,HttpServletRequest request,HttpServletResponse response,HttpSession session){
      		Integer tagid=wxTemplate.getTagid();
      		String templateId=wxTemplate.getTemplate_id();
      		Map<String, TemplateData> map = wxTemplate.getData();
      		TemplateData templateData = map.get("first");
      		System.out.println("value= "+templateData.getValue());
      		System.out.println("color= "+templateData.getColor());
      		if(tagid==null) {
      			return Result.build(false, "9999","tagid不能为空");
      		}
      		if(StringUtils.isBlank(templateId)) {
      			return Result.build(false, "9999","templateId不能为空");
      		}
      		try {
      			Thread thread=new Thread() {
      				@Override
      				public void run() {
      					// TODO Auto-generated method stub
      					AccessToken accessToken = WeixinUtil.getAccessToken(APPID,AppSecret);
      		  			String url="https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token="+accessToken.getToken();
      		  			JSONObject postData = new JSONObject();   
      		  			postData.put("tagid", tagid);
      		  			JSONObject body = rest.postForEntity(url, postData, JSONObject.class).getBody();
      		  			System.out.println(body.getJSONObject("data").getString("openid"));
      		  			String[] list =body.getJSONObject("data").getObject("openid", String[].class);
      		  			url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+accessToken.getToken();
      		  			postData.remove("tagid");
      		  			postData.put("data", map);
      		  			postData.put("template_id", templateId);
      		  			postData.put("url", "");
      		  			for(String openid:list) {
      		  				postData.put("touser", openid);
      		  				String result = rest.postForEntity(url, postData, String.class).getBody();
      		  				log.info("模板消息发送:openid is "+openid+" and result is "+result,WeChatAction.class);
      		  			}
      				}
      			};
      			thread.start();
      		} catch (Exception e) {
      			// TODO: handle exception
      			e.printStackTrace();
      			return Result.error();
      		}
    		return Result.ok("您的消息已发送成功");
      	}
    
    展开全文
  • 首先要去微信公众号开通模板消息 通过之后 可以进行申请模板id 实现代码 public function guestbook(){ //此处模拟前端表单ajax提交 $input_data = input("post."); // if(isset($input_data) && ....

    小程序下单后 微信公众号也一并提示功能

    首先要去微信公众号开通模板消息

    通过之后 可以进行申请模板id

    实现代码

     public function guestbook(){
            //此处模拟前端表单ajax提交
            $input_data = input("post.");
    //        if(isset($input_data) && !empty($input_data)){
    
    
                $openid = '用户openid';
                $time_str = strtotime(date("Y-m-d 0:0:0",time()));
                //检查今天是否有提交过
    //            $check = Db::name("guestbook")->where('openid',$openid)->where('create_time',">=",$time_str)->find();
    //            if(isset($check) && !empty($check)){
    //                return ['code'=>-3];
    //            }else{
                    //提交成功,触发信息推送
                    $data=[
                        'touser'=>$openid,
                        'template_id'=>'模板消息id',
                        'url'=>'http://weixin.qq.com/download',
                        'topcolor'=>"#FF0000",
                        'data'=>array(
                            'first'=>array('value'=>"订单支付成功",'color'=>"#fc0101"),
                            'keyword1'=>array('value'=>1111,'color'=>"#173177"),
                            'keyword2'=>array('value'=>'1111','color'=>"#173177"),
                            'keyword3'=>array('value'=>1800,'color'=>"#173177"),
                            'keyword4'=>array('value'=>'1111','color'=>"#173177"),
                            'remark'=>array('value'=>"您的报名信息已提交,请耐心等待",'color'=>"#173177"),
                        )
                    ];
    
                    $get_all_access_token = $this->getWxAccessToken();
    
    
                    $json_data= str_replace("\\/", "/", json_encode($data, JSON_UNESCAPED_UNICODE));;//转化成json数组让微信可以接收
    
    
                    $url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$get_all_access_token;//模板消息请求URL
    
                    $res=$this->https_request($url,urldecode($json_data));//请求开始
    
    
                    $res=json_decode($res,true);
    
                    if($res['errcode']==0 && $res['errcode']=="ok"){
                        return ['code'=>1];
                    }else{
                        return ['code'=>-4];
                    }
               // }
            //}
        }
    
    
    
    
        public function https_request($url,$data = null){
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)){
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }

    用户的openid 在上篇说过 https://blog.csdn.net/wanganji5252/article/details/100929442

    可以和小程序中的unionid 进行比对 拿出保存好的openid

    getWxAccessToken() 方法也在上篇中进行说明

    这样就可以给指定的用户发送相对应的模板消息了

     

    展开全文
  • Java 微信公众号消息模板推送 引入pom.xml <!--微信模版消息推送三方sdk--> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp&l...

    Java 微信公众号消息模板推送

    可以在微信公众号中
    开发==》开发者工具==》公众平台测试账号
    申请测试账号用于测试

    或者点击下面链接进入测试平台
    微信公众平台

    消息模板

    用户姓名:{{userName.DATA}}
    消费金额:{{consumeMoney.DATA}}
    消费日期:{{consumeDate.DATA}}

    引入pom.xml

            <!--微信模版消息推送三方sdk-->
            <dependency>
                <groupId>com.github.binarywang</groupId>
                <artifactId>weixin-java-mp</artifactId>
                <version>3.3.0</version>
            </dependency>
    

    WxPushUtil

    package com.shiyu.clients.util;
    
    import com.shiyu.clients.form.WxConsumeInfoForm;
    import me.chanjar.weixin.common.error.WxErrorException;
    import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
    import me.chanjar.weixin.mp.api.WxMpService;
    import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
    import me.chanjar.weixin.mp.bean.result.WxMpUserList;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    /**
     * @auther abu
     * @date 2019/12/26 18:17
     */
    public class WxPushUtil {
    
        private static final String APPID = "appid";
        private static final String SECRET = "secret";
    
        public static void pushConsumeInfo(WxConsumeInfoForm form) {
            try {
                //1,配置
                WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
                wxStorage.setAppId(APPID);
                wxStorage.setSecret(SECRET);
                WxMpService wxMpService = new WxMpServiceImpl();
                wxMpService.setWxMpConfigStorage(wxStorage);
                //2,推送消息
                WxMpTemplateMessage templateMessage = new WxMpTemplateMessage();
                templateMessage.setTemplateId(form.getTemplateId());
                if (form.getUrl() != null && !form.getUrl().equals("")) {
                    templateMessage.setUrl(form.getUrl());
                }
                if(form.getAppid()!=null&&!form.getAppid().equals("")&&form.getPagePath()!=null&&!form.getPagePath().equals("")){
                    //设置小程序的appId和转发的页面
                    WxMpTemplateMessage.MiniProgram miniprograms = new WxMpTemplateMessage.MiniProgram();
                    miniprograms.setAppid(form.getAppid());
                    miniprograms.setPagePath(form.getPagePath());
                    templateMessage.setMiniProgram(miniprograms);
                }
    
                templateMessage.setData(form.getList());
    
                if (form.getSendAll()) {
                    List<String> openList = new ArrayList<>();
                    openList = recursionOpenId(openList, null, wxMpService);
                    for (String id : openList) {
                        templateMessage.setToUser(id);//全部推送
                        wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
                    }
                } else {
                    templateMessage.setToUser(form.getOpenId());//要推送的用户openid
                    wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
                }
            } catch (Exception e) {
                System.out.println("推送失败:" + e.getMessage());
                e.printStackTrace();
            }
    
        }
    
        /**
         * 递归查询openId,一次最多拉取10000各个关注者的OpenId,可以多次拉取满足需求
         *
         * @param openIdList
         * @param nextOpenId  第一次拉取的openId,不填默认从头开始拉取
         * @param wxMpService
         * @return
         */
        public static List<String> recursionOpenId(List<String> openIdList, String nextOpenId, WxMpService wxMpService) {
            try {
                WxMpUserList openList = wxMpService.getUserService().userList(nextOpenId);
                for (String strId : openList.getOpenids()) {
                    openIdList.add(strId);
                }
                if (openList.getOpenids().size() > 10000) {
                    recursionOpenId(openIdList, openList.getNextOpenid(), wxMpService);
                }
            } catch (WxErrorException e) {
                e.printStackTrace();
            }
    
            return openIdList;
        }
    
        /**
         * 测试
         */
        public static void main(String[] args) {
            WxConsumeInfoForm form = new WxConsumeInfoForm();
            form.setTemplateId("模板ID");
            String color = "#001EFF";//蓝色
            //如果推送给全部用户
    		form.setSendAll(true);
            //推送给的单个用户
            //form.setOpenId("openID");
            
            //有链接就加这条,没链接就删除
            form.setUrl("baidu.com");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            List<WxMpTemplateData> wxMpTemplateData = new ArrayList<>();
            wxMpTemplateData.add(new WxMpTemplateData("userName", "天梓", color));
            wxMpTemplateData.add(new WxMpTemplateData("consumeMoney", "1998.88", color));
            wxMpTemplateData.add(new WxMpTemplateData("consumeDate", sdf.format(new Date()), color));
            form.setList(wxMpTemplateData);
    
            WxPushUtil.pushConsumeInfo(form);
        }
    
    }
    
    

    WxConsumeInfoForm

    package com.shiyu.clients.form;
    
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
    
    import java.io.Serializable;
    import java.util.List;
    
    public class WxConsumeInfoForm implements Serializable {
    
        private static final long serialVersionUID = 2035293165820350664L;
    
        //用户openId
        private String openId;
        //模板编号
        private String templateId;
        //小程序id
        private String appid;
        //小程序页面
        private String pagePath;
        //跳转地址
        private String url;
        //是否群发所有用户
        private Boolean sendAll=false;
    
        private List<WxMpTemplateData> list;
    
        public String getOpenId() {
            return openId;
        }
    
        public void setOpenId(String openId) {
            this.openId = openId;
        }
    
        public String getTemplateId() {
            return templateId;
        }
    
        public void setTemplateId(String templateId) {
            this.templateId = templateId;
        }
    
        public String getAppid() {
            return appid;
        }
    
        public void setAppid(String appid) {
            this.appid = appid;
        }
    
        public String getPagePath() {
            return pagePath;
        }
    
        public void setPagePath(String pagePath) {
            this.pagePath = pagePath;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public List<WxMpTemplateData> getList() {
            return list;
        }
    
        public void setList(List<WxMpTemplateData> list) {
            this.list = list;
        }
    
        public Boolean getSendAll() {
            return sendAll;
        }
    
        public void setSendAll(Boolean sendAll) {
            this.sendAll = sendAll;
        }
    }
    
    
    展开全文
  • 软件大小: 56.0 MB软件版本: 4.0.0软件类型:文本处理查看详情直接下载yesky标签:微信公众号怎么使用页面模板功能?微信公众号页面模板功能怎么使用?微信公众号后台推出了“页面模板”功能,页面模版功能,是给...

    bc6da48468eaa452b087f1a3affa4696.png

    软件大小: 56.0 MB

    软件版本: 4.0.0

    软件类型:

    文本处理

    查看详情

    直接下载

    yesky

    标签:

    微信公众号怎么使用页面模板功能?微信公众号页面模板功能怎么使用?微信公众号后台推出了“页面模板”功能,页面模版功能,是给公众号创建行业网页的功能插件。公众号可选择行业模版,导入控件和素材生成网页,对外发布公众号可复制链接通过自定义菜单、图文消息阅读原文和其它方式发布。如下图展示方式。

    18de49893e448ecee6bfb7939b2650d4.png

    1、首先搜索微信公众平台,点击进入并登陆公众账号密码等信息;认准官网字样(如图)一个地址。

    9eb14f7058e279c1250ef74ba604888a.png

    ed4e7d39af43c26c9d1587248eca3f76.png

    2、进入以后 ,点击右侧功能列表“页面模板”,如右侧没有则直接点击下方功能插件添加,在插件功能列表内找到“页面模板”并添加即可。

    487444bb086df0c959d94e7f881bcc92.png

    daf6dfded937d347f01bd941f684b033.png

    3、之后点击添加页面模板进入以下列表(如图)一共有两种展现模式如图所示和手机端展现无差异。如果要制作一个模板的话我们就要选择一个类型。例如:封面模板。出现添加界面以后如图可以自行添加已经发布的图文或编辑好微发布的图文。接下来一次类推都是同样的方法,想添加模板哪个版块的内容,就直接点击版块,然后点击添加即可。

    ca16f86d2fcaab0487cb77867b83bb44.png

    d49b49ee77d2f1359ce55ddf99670bd5.png

    b1f640001a66535b544bc79e4323798c.png

    9889ee38928f3b8e3c0302189338e6f9.png

    f18f9822b5de4f82a7036011d734cda7.png

    28f8e9576776bc64c585dd9f0e16d33e.png

    4、制作模板就是新建一个公众号页面,可复制链接放到自定义菜单发布。如果在自定义才但还有空闲的情况下,可直接把制作好的模板链接,复制到自定义菜单的转向链接栏里。

    5、我们把刚才建立好的模板的链接复制下来,直接粘贴到自定义菜单即可。(如图)保存并发布菜单。

    9882103b96866e1e4a3ba2f911dea7d6.png

    21f34a60a3fb18c5ccf156f619bb2582.png

    二、手机端展现

    1、如图:编辑好后,保存并发布菜单之后。在手机前端查看。

    abdf2514c05d31f0417ed5029c7a8942.png

    注意事项:暂时只有开通了原创声明功能的公众号可以申请开通,暂时只提供媒体行业模版,包括列表模版和封面模版,后续将提供更多行业模版。

    展开全文
  • 已经通过微信认证的公众号并且已经申请开通过模板消息接口,而且还需要从模板库中选择过模板并已添加到自己的公众平台 首先点击这里的按钮: 之后找到合适模板点“添加按钮” 三 程序调用模板消息发送接口 1 模板...
  • 第一步:微信公众号申请模板消息权限: 立即申请申请过程就不说了,提交并且申请通过后,可以在模板库中看到模板消息列表: 想用哪个模板点击进去添加就行了: 添加模板后就存放到“我的模板库”中了...
  • 新需求,需要在订单的时候给用户,商家,配送员发送想对于的微信消息模板,之前没有做过微信公众号相关的开发,这次就一并熟悉吧 ##公众号注册 第一步就是要进行公众号的注册,这个东西这个东西网上有教程,这个就不说了 ##...
  • 微信小程序使用微信公众号模板消息进行消息推送 微信公众号服务号,微信公众号订阅号,微信公众号开发者平台,微信小程序 这些的账号都是独立的不能共用 微信开放平台开发者资质认证审核费用为300元,认证...
  • 自己在微信公众平台中申请模板消息的id;这里没有没有提供获取用户openid的方法,我在之前的一个博客中有写过获取用户openid的代码;需要注意的是,有一点很坑,那就是在获取用户openid的时候会返回给你一个token;...
  • 微信公众号页面模板是最近公众号推出的功能哦,这个功能可以解决管理员不少的麻烦呢,很多的公众号都开通了这个功能,就算你开通了这个功能,你也要学会使用哦,企业微信公众号页面模板使用的方法是什么呢?企业微信...
  • 简介 TNW: TypeScript(The) + Node.js(Next) + WeChat 微信公众号开发脚手架,支持 http 模块扩展、支持任何 Node.js 的服务端框架(Express、NestJS...概述 微信公众号模板消息的使用权限、设置所属行业、规则、申请...
  • 使用shell通过微信公众号发送模板消息

    千次阅读 热门讨论 2017-05-05 23:10:51
    如下通过shell脚本实现,通过微信公众号发送模板消息到个人微信号。1.配置微信公众号由于没有认证的公众号,只能通过自己申请的个人订阅号(可以自行申请),并到开发者工具中开通公众平台测试帐号实现该功能。
  • 微信公众号-模板消息管理

    千次阅读 2018-12-23 16:59:33
    微信公众号-模板消息管理 通过模板消息接口,公众号能向关注其账号的用户发送预设模板消息模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知...
  • 微信公众号配置模板消息

    千次阅读 2020-08-25 11:56:01
    1.登录微信公众号平台,使有权限的工作人员进行扫码登录。 2.基本配置里会得到AppID和AppSecret,在后端Config进行配置。 3.新建模板消息,需要什么类型的可以在模板库中选用。 4.在后端新建一个类,这里的参数和...
  • 1、首先要获得接收模板消息用户的 openid 和 accss_token,可参考微信公众号获取用户基本信息 2、发布推送 public function sendMsg() { $url = ...
  • 微信公众号模板消息发送前提准备功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建...
  • 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。关于使用规则,请注意:1...
  • 微信公众号消息推送

    2020-05-05 16:25:22
    微信公众号消息推送微信公众号消息推送1.1申请测试号1.2模板消息的开发1.2.1获取模板id1.2.2发起请求1.3搭建消息系统1.3.1模型的封装(消息模型)1.3.2微信通知服务1.3.3实现Service创建一个表格 微信公众号消息推送...
  • 微信公众号模板消息申请

    万次阅读 2018-08-08 18:48:06
    图一为申请模板消息模板内容,发送模板消息时只需将first keywords和remark数据(图二)传递给微信即可发送成功; 所以开始和结尾可以直接传递first和remark的date即可区分两种模板内容,申请...
  • 很多人在创立微信公众号的时候,发现没有页面模式,很多时候这个模式也是比较重要的,那么到底这个微信公众号怎么没有页面模板是什么原因,微信公众号添加页面模板怎么开通?大家知道吗?下面小编就给大家说说这些问题...
  • 微信公众号为服务号且开通微信认证(其他类型账号不能发送) 申请备案个线上域名 公众号设置->功能设置,配置网页授权域名 进入基础设置,开通开发者密码(AppSecret),并保存起来 ip白名单设置你的服务器...
  • 对于微信公众号, 基于防止对用户发送广告营销等信息骚扰用户, 所以不允许公众号主动发送消息给微信用户的, 但是对于一些特定的模板信息,例如 用户充值提醒, 消费提醒,绑定成功通知等等非广告营销以及非违法信息, 是...
  • 官方文档有点看不进去,找了各种资源,又容易入坑,仅实现微信推送预警消息到用户功能。自我记录,不喜勿喷。实现效果。 官网:https://mp.weixin.qq.com/ API:...微信公众号推送...
  • 微信公众号模板消息

    2021-08-17 10:58:29
    目前项目中需要有一个除短信外其他方式通知或提醒用户业务操作的功能,故采用了...模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广
  • 开发微信公众号模板消息推送功能(入门)- 资源篇 相关文章: Nodejs + express 开发微信公众号模板消息推送功能 (花生壳+本地服务器) 微信后台开发第一步:nodeJS+express接入微信后台详细教程 微信公众号nodejs...
  • 微信公众号主要面向名人、政府、媒体、企业等机构推出的合作推广业务。在这里可以通过微信渠道将品牌推广给上亿的微信用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象。 3. 公众平台 微信公众平...
  • 微信模板消息发送 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277 下面是服务号的模板列表 下面是具体的模板 其中模板ID很重要,可以将它配置到配置文件中。 'TEMPLATE_ID' => [ '...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,026
精华内容 1,610
关键字:

微信公众号消息模板申请