精华内容
下载资源
问答
  • 主要为大家详细介绍了微信公众号开发之回复图文消息java代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Java开发微信公众号开发模板消息功能,详细描述微信公众号后台设置,详细开发步骤,关键代码编写,完整功能实现。
  • 微信公众号开发-接收消息+模板消息。包含所有源代码、工具类、JAR包,MyEclipse开发的,其他软件开发的可以参考着修改。
  • 微信公众号、小程序项目开发模板源码(https://blog.csdn.net/rongbo91/article/details/112506514) 微信公众号/小程序开发项目源码(支持多公众号) 微信应用开发一步到位,结合测试公众号完成开发Demo演示,项目源码...
  • 以订单推送为例,主要为大家详细介绍了java实现微信公众号发送模版消息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java spring boot框架下的微信公众号开发,供参考。包含基础接入,机器人回复文字或图文消息,欢迎消息,设置自定义菜单,推送模板消息,换取网页授权access_token(snsapi_base方式)
  • 微信公众号开发之模板消息

    千次阅读 2018-11-27 15:09:56
    微信公众号发送模板消息其实很简单,调用下面的这个工具类即可(这个工具类是我在网上找的。。。)。工具类主要用于调用微信发送模板消息的接口。 首先会获取ACCESS_TOKEN,若之前获取的没过期则用之前的,若过期了...

    微信公众号发送模板消息其实很简单,调用下面的这个工具类即可(这个工具类是我在网上找的。。。)。工具类主要用于调用微信发送模板消息的接口。
    首先会获取ACCESS_TOKEN,若之前获取的没过期则用之前的,若过期了则从新获取。然后用一个http工具类调用发送模板消息的接口即可。
    发送模板消息工具类:

    
    import java.io.IOException;
    import java.util.Date;
    import java.util.Properties;
    
    import net.sf.json.JSONObject;
    
    public class WeChatUtil {
    	// // URL验证时使用的token
    	// public static final String TOKEN = "qq";
    	// appid
    	public static String APPID = "";
    	// secret
    	public static String SECRET = "";
    	// 创建菜单接口地址
    	// public static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
    	// 发送模板消息的接口
    	public static final String SEND_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
    	// 获取access_token的接口地址
    	public static final String GET_ACCESSTOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    	// 缓存的access_token
    	private static String accessToken;
    	// access_token的失效时间
    	private static long expiresTime;
    	
    	private static Properties properties = new Properties();
    
    	
    	static{
    	    try {
    	        properties.load(WeChatUtil.class.getClassLoader().getResourceAsStream("weixin.properties"));
    	        APPID = properties.getProperty("APPID");
    	        SECRET = properties.getProperty("SECRET");
    	    } catch (IOException e) {
    	        e.printStackTrace();
            }
    	}
    	
    	/**
    	 * 获取accessToken
    	 * 
    	 * @return
    	 * @throws IOException
    	 */
    	public static String getAccessToken() throws IOException {
    		// 判断accessToken是否已经过期,如果过期需要重新获取
    		if (accessToken == null || expiresTime < new Date().getTime()) {
    			// 发起请求获取accessToken
    			String result = HttpUtil.get(GET_ACCESSTOKEN_URL.replace("APPID",
    					APPID).replace("APPSECRET", SECRET));
    			System.out.println(APPID + "/" + SECRET);
    			// 把json字符串转换为json对象
    			JSONObject json = JSONObject.fromObject(result);
    			// 缓存accessToken
    			accessToken = json.getString("access_token");
    			// 设置accessToken的失效时间
    			long expires_in = json.getLong("expires_in");
    			// 失效时间 = 当前时间 + 有效期(提前一分钟)
    			expiresTime = new Date().getTime() + (expires_in - 60) * 1000;
    		}
    		return accessToken;
    	}
    
    	/**
    	 * 发送模板
    	 * 
    	 * @return 结果集({"errcode":0,"errmsg":"ok","msgid":528986890112614400})、
    	 * 				({"errcode":40003,"errmsg":"invalid openid hint: [tv6YMa03463946]"})
    	 * @throws IOException
    	 */
    	public static String sendTemplate(String data) throws IOException {
    		// 通过调用HttpUtil工具类发送post请求
    		// 调用微信发送模板消息的接口
    		String result = HttpUtil.post(SEND_TEMPLATE_URL.replace("ACCESS_TOKEN",
    				getAccessToken()), data);
    		System.out.println(result);
    		return result;
    	}
    }
    
    

    weixin.properties是配置文件。用于动态获取APPID和APPSECRET。

    APPID=xxxxxxxx
    SECRET=xxxxxxxxxxxxxxxxxxxxxx
    

    至于HttpUtil是一个http工具类,网上有很多。

    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    
    public class HttpUtil {
    	/**
    	 * Send a get request
    	 * 
    	 * @param url
    	 * @return response
    	 * @throws IOException
    	 */
    	static public String get(String url) throws IOException {
    		return get(url, null);
    	}
    
    	/**
    	 * Send a get request
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param headers
    	 *            Optional map with headers
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String get(String url, Map<String, String> headers)
    			throws IOException {
    		return fetch("GET", url, null, headers);
    	}
    
    	/**
    	 * Send a post request
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param body
    	 *            Request body as string
    	 * @param headers
    	 *            Optional map with headers
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String post(String url, String body,
    			Map<String, String> headers) throws IOException {
    		return fetch("POST", url, body, headers);
    	}
    
    	/**
    	 * Send a post request
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param body
    	 *            Request body as string
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String post(String url, String body) throws IOException {
    		return post(url, body, null);
    	}
    
    	/**
    	 * Post a form with parameters
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param params
    	 *            map with parameters/values
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String postForm(String url, Map<String, String> params)
    			throws IOException {
    		return postForm(url, params, null);
    	}
    
    	/**
    	 * Post a form with parameters
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param params
    	 *            Map with parameters/values
    	 * @param headers
    	 *            Optional map with headers
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String postForm(String url, Map<String, String> params,
    			Map<String, String> headers) throws IOException {
    		// set content type
    		if (headers == null) {
    			headers = new HashMap<String, String>();
    		}
    		headers.put("Content-Type", "application/x-www-form-urlencoded");
    
    		// parse parameters
    		String body = "";
    		if (params != null) {
    			boolean first = true;
    			for (String param : params.keySet()) {
    				if (first) {
    					first = false;
    				} else {
    					body += "&";
    				}
    				String value = params.get(param);
    				body += URLEncoder.encode(param, "UTF-8") + "=";
    				body += URLEncoder.encode(value, "UTF-8");
    			}
    		}
    
    		return post(url, body, headers);
    	}
    
    	/**
    	 * Send a put request
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param body
    	 *            Request body as string
    	 * @param headers
    	 *            Optional map with headers
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String put(String url, String body,
    			Map<String, String> headers) throws IOException {
    		return fetch("PUT", url, body, headers);
    	}
    
    	/**
    	 * Send a put request
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String put(String url, String body) throws IOException {
    		return put(url, body, null);
    	}
    
    	/**
    	 * Send a delete request
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param headers
    	 *            Optional map with headers
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String delete(String url, Map<String, String> headers)
    			throws IOException {
    		return fetch("DELETE", url, null, headers);
    	}
    
    	/**
    	 * Send a delete request
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String delete(String url) throws IOException {
    		return delete(url, null);
    	}
    
    	/**
    	 * Append query parameters to given url
    	 * 
    	 * @param url
    	 *            Url as string
    	 * @param params
    	 *            Map with query parameters
    	 * @return url Url with query parameters appended
    	 * @throws IOException
    	 */
    	static public String appendQueryParams(String url,
    			Map<String, String> params) throws IOException {
    		String fullUrl = new String(url);
    
    		if (params != null) {
    			boolean first = (fullUrl.indexOf('?') == -1);
    			for (String param : params.keySet()) {
    				if (first) {
    					fullUrl += '?';
    					first = false;
    				} else {
    					fullUrl += '&';
    				}
    				String value = params.get(param);
    				fullUrl += URLEncoder.encode(param, "GBK") + '=';
    				fullUrl += URLEncoder.encode(value, "GBK");
    			}
    		}
    
    		return fullUrl;
    	}
    
    	/**
    	 * Retrieve the query parameters from given url
    	 * 
    	 * @param url
    	 *            Url containing query parameters
    	 * @return params Map with query parameters
    	 * @throws IOException
    	 */
    	static public Map<String, String> getQueryParams(String url)
    			throws IOException {
    		Map<String, String> params = new HashMap<String, String>();
    
    		int start = url.indexOf('?');
    		while (start != -1) {
    			// read parameter name
    			int equals = url.indexOf('=', start);
    			String param = "";
    			if (equals != -1) {
    				param = url.substring(start + 1, equals);
    			} else {
    				param = url.substring(start + 1);
    			}
    
    			// read parameter value
    			String value = "";
    			if (equals != -1) {
    				start = url.indexOf('&', equals);
    				if (start != -1) {
    					value = url.substring(equals + 1, start);
    				} else {
    					value = url.substring(equals + 1);
    				}
    			}
    
    			params.put(URLDecoder.decode(param, "GBK"), URLDecoder.decode(
    					value, "GBK"));
    		}
    
    		return params;
    	}
    
    	/**
    	 * Returns the url without query parameters
    	 * 
    	 * @param url
    	 *            Url containing query parameters
    	 * @return url Url without query parameters
    	 * @throws IOException
    	 */
    	static public String removeQueryParams(String url) throws IOException {
    		int q = url.indexOf('?');
    		if (q != -1) {
    			return url.substring(0, q);
    		} else {
    			return url;
    		}
    	}
    
    	/**
    	 * Send a request
    	 * 
    	 * @param method
    	 *            HTTP method, for example "GET" or "POST"
    	 * @param url
    	 *            Url as string
    	 * @param body
    	 *            Request body as string
    	 * @param headers
    	 *            Optional map with headers
    	 * @return response Response as string
    	 * @throws IOException
    	 */
    	static public String fetch(String method, String url, String body,
    			Map<String, String> headers) throws IOException {
    		// connection
    		URL u = new URL(url);
    		HttpURLConnection conn = (HttpURLConnection) u.openConnection();
    		conn.setConnectTimeout(90000);
    		conn.setReadTimeout(90000);
    
    		// method
    		if (method != null) {
    			conn.setRequestMethod(method);
    		}
    
    		// headers
    		if (headers != null) {
    			for (String key : headers.keySet()) {
    				conn.addRequestProperty(key, headers.get(key));
    			}
    		}
    
    		// body
    		if (body != null) {
    			conn.setDoOutput(true);
    			OutputStream os = conn.getOutputStream();
    			os.write(body.getBytes("UTF-8"));
    			os.flush();
    			os.close();
    		}
    
    		// response
    		InputStream is = conn.getInputStream();
    		String response = streamToString(is);
    		is.close();
    
    		// handle redirects
    		if (conn.getResponseCode() == 301) {
    			String location = conn.getHeaderField("Location");
    			return fetch(method, location, body, headers);
    		}
    
    		return response;
    	}
    
    	/**
    	 * Read an input stream into a string
    	 * 
    	 * @param in
    	 * @return
    	 * @throws IOException
    	 */
    	static public String streamToString(InputStream in) throws IOException {
    		StringBuffer out = new StringBuffer();
    		byte[] b = new byte[4096];
    		for (int n; (n = in.read(b)) != -1;) {
    			out.append(new String(b, 0, n));
    		}
    		return out.toString();
    	}
    }
    

    做完以上准备,接下来就开始来正式的了。
    在这里插入图片描述这是官网上说的一些参数。
    接下来编写一个实体类用于存放这些参数。

    
    import java.util.TreeMap;
    
    public class TemplateMessage {
    	private String touser; // 接收者openid
    
    	private String template_id; // 模板ID
    
    	private String url; // 模板跳转链接
    
    	private TreeMap<String, TreeMap<String, String>> data; // data数据
    
    	//get、set已省略
    
    	/**
    	 * 参数
    	 * 
    	 * @param value
    	 * @param color
    	 *            可不填
    	 * @return
    	 */
    	public static TreeMap<String, String> item(String value, String color) {
    		TreeMap<String, String> params = new TreeMap<String, String>();
    		params.put("value", value);
    		params.put("color", color);
    		return params;
    	}
    }
    
    

    然后再调用:

    public void sendTemplateMessage() throws IOException {
    	System.out.println("开始封装模板消息。。。。。。。。。。");
    	// 将信息内容封装到实体类
    	TemplateMessage temp = new TemplateMessage();
    	// 设置接收方的openid		user.getOpenid()是从数据库中得到的对应的openid
    	temp.setTouser(user.getOpenid());
    	// 设置模板id(从页面上复制)
    	temp.setTemplate_id("VMFMaNyr67yn8dMk1UJPwS1yTLgPUDHZbBj9D608O0c");
    	// 设置回调地址(点击模板消息所跳转的地址,设置为空即无跳转)
    	temp.setUrl("");
    	// 设置模板消息内容和对应的字体颜色
    	TreeMap<String, TreeMap<String, String>> params = new TreeMap<String, TreeMap<String, String>>();
    	params.put("first", TemplateMessage.item("新的学习任务已发布,请登录APP尽快完成,完成任务得红包!", "#173177"));
    	//date为当前时间,new出来的在这里省略
    	params.put("keyword1", TemplateMessage.item(date, "#173177"));
    	params.put("keyword2", TemplateMessage.item("尚未完成!", "#173177"));
    	params.put("keyword3", TemplateMessage.item("-", "#173177"));
    	params.put("remark", TemplateMessage.item("", "#173177"));
    	// 将实体类转为jsonObject
    	JSONObject data = JSONObject.fromObject(temp);
    	System.out.println(data + "");
    	// 通过工具类调用微信接口发送模板消息
    	String result = WeChatUtil.sendTemplate(data + "");
    	System.out.println("返回结果集:" + result);
    }
    

    结果如下图所示:
    在这里插入图片描述
    没设置url即为不可点击,设置了则点击即可跳转到设定的url。

    展开全文
  • 微信公众号消息模板推送demo,亲测能用,替换下参数就能用
  • 主要介绍了微信公众平台 发送模板消息(Java接口开发),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • java微信公众号开发之自定义菜单的创建
  • 主要为大家详细介绍了java微信公众号发送消息模板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java二次开发微信公众号接口,实现根据用户授权,获取用户code,再获取openid,然后向其推送模版消息
  • 微信公众号接口调用 java demo, maven工程, 包含获得微信 AccessToken, 获得微信用户信息, 微信公众号用于调用微信JS接口的临时票据, 微信分享, 发送模板消息
  • Java 实现微信公众号模板消息推送,demo
  • 微信发送模板消息接口文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277 ...一、微信公众号开发框架 <!-- 微信框架 参考:https://github.com/Wechat-Gr...

    微信发送模板消息接口文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

    温馨提示:请各位开发者使用微信模板消息功能前,仔细阅读上述发送模板消息接口文档 ,少走弯路;

     

    一、微信公众号开发框架

         <!-- 微信框架 参考:https://github.com/Wechat-Group/weixin-java-tools -->
          <dependency>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-mp</artifactId>
             <version>3.0.0</version>
          </dependency>

    二、发送模板消息效果

              

    三、模板消息申请

     为了保证用户不受到骚扰,在开发者出现需要主动提醒、通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒、通知消息。

     模板消息调用时主要需要模板ID和模板中各参数的赋值内容。请注意:
     1. 模板中参数内容必须以".DATA"结尾,否则视为保留字;
     2. 模板保留符号"{{ }}"

     1. 以下是我使用的模板消息

    1. {{first.DATA}}  
    2. 用户名:{{keyword1.DATA}}  
    3. 订单号:{{keyword2.DATA}}  
    4. 订单金额:{{keyword3.DATA}}  
    5. 商品信息:{{keyword4.DATA}}  
    6. {{remark.DATA}}  

      2. 发送模板消息POST数据示例

              {
               "touser":"OPENID",
               "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
               "url":"http://weixin.qq.com/download",  
               "miniprogram":{
                 "appid":"xiaochengxuappid12345",
                 "pagepath":"index?foo=bar"
               },          
               "data":{
                       "first": {
                           "value":"恭喜你支付成功!",
                           "color":"#173177"
                       },
                       "keynote1":{
                           "value":"曹",
                           "color":"#173177"
                       },
                       "keynote2": {
                           "value":"2019698571200",
                           "color":"#173177"
                       },
                       "keynote3": {
                           "value":"¥98.80",
                           "color":"#173177"
                       },
                       "keynote4":{
                           "value":"星冰乐(焦糖味) 家乐氏香甜玉米片*2 乐天七彩爱情糖*3",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"如有问题请致电xxx客服热线400-8070028或直接在微信留言,客服在线时间为工作日10:00-18:00,客服人员将第一时间为您服务。",
                           "color":"#173177"
                       }
               }
           }

    详细参考: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

     

    四、通过Postman测试发送模板消息

     1. 登录微信公众平台,申请一个发送模板消息的模板

         

     

    2. 通过微信公众平台接口调试工具获取AccessToken

    3. Postman发送模板消息

    上面需要填入的有openid、template_id

     {
               "touser":"oJIGa0Xlgv1nAtrWLWMlB75ekNDs",
               "template_id":"KIe4rXP3pRvX8BUnomZtCOFjZkSRzFdOzcJOob_9MR4",
               "url":"https://blog.csdn.net/thinkingcao",  
               "data":{
                       "first": {
                           "value":"矿泉水",
                           "color":"#173177"
                       },
                       "keyword1":{
                           "value":"11111111",
                           "color":"#173177"
                       },
                       "keyword2": {
                           "value":"123456789",
                           "color":"#173177"
                       },
                        "keyword3": {
                           "value":"39.8元",
                           "color":"#173177"
                       },
                       "keyword4": {
                           "value":"2014年9月22日",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"欢迎再次购买!",
                           "color":"#173177"
                       }
               }
           }

     通过Postman发送玩了之后就是步骤三中的效果图

     

    五、发送模板消息工具类封装

      配置微信公众号参数:appid、appsecret、token、asekey、template_id(模板id)

      1.wx.properties

    #=========微信公众号开发基本配置============
    #微信公众号的appid
    wx_appid=
    #微信公众号的appsecret
    wx_appsecret=
    #微信公众号的token
    wx_token=
    #微信公众号的消息加解密密钥aeskey
    wx_aeskey=
    #微信模板消息template_id
    wx_template_id=

     2.WeChatTemplateMsgUtils:

     这里将WeChatTemplateMsgUtils.java以注册为Spring容器,交给Spring容器管理,方便Controller、Service中注入使用

    package com.thinkgem.jeesite.modules.wechat.commonUtil;
    
    import com.thinkgem.jeesite.modules.wechat.inter.PushMessageService;
    import lombok.extern.slf4j.Slf4j;
    import me.chanjar.weixin.common.exception.WxErrorException;
    import me.chanjar.weixin.mp.api.WxMpService;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * <pre>
     * @Description: 微信模板消息推送实现
     * @Aouth: cao_wencao
     * @Date: 2019-01-24 14:07
     * </pre>
     */
    @Slf4j
    @Component
    public class WeChatTemplateMsgUtils implements PushMessageService {
        @Autowired
        private WxMpService wxMpService;
    
        @Value("#{wxProperties.wx_template_id}")
        private String wx_template_id;
    
        //案例: 星巴克支付通知
        @Override
        public String manuscriptExamine(String openId) {
            //实例化模板对象
            WxMpTemplateMessage wxMpTemplateMessage = new WxMpTemplateMessage();
            //设置模板ID
            wxMpTemplateMessage.setTemplateId(wx_template_id);
            //设置发送给哪个用户
            wxMpTemplateMessage.setToUser(openId);
            //构建消息格式
            List<WxMpTemplateData> listData = Arrays.asList(
                    new WxMpTemplateData("first", "恭喜你支付成功!", "#173177"),
                    new WxMpTemplateData("keyword1", "曹.", "#173177"),
                    new WxMpTemplateData("keyword2", "2019698571200", "#173177"),
                    new WxMpTemplateData("keyword3", "¥98.80", "#173177"),
                    new WxMpTemplateData("keyword4", "星冰乐(焦糖味) 家乐氏香甜玉米片*2 乐天七彩爱情糖*3", "#173177"),
                    new WxMpTemplateData("remark", "如有疑问,请联系客服电话:021-54145323", "#173177")
            );
            //接收发送模板消息结果,就是msgid,if(msgid! = null)即成功
            String wxTemplateResult = null;
            //放进模板对象。准备发送
            wxMpTemplateMessage.setData(listData);
            try {
                //发送模板
                wxTemplateResult = wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage);
            } catch (WxErrorException e) {
                log.error("发送模板消息异常:{}", e.getMessage());
                e.printStackTrace();
            }
            return wxTemplateResult;
        }
    
        /**
         * <pre>
         * 设置所属行业
         * @auther: cao_wencao
         * @date: 2019/2/18 15:17
         * </pre>
         */
        public boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException {
            Boolean flag = wxMpService.getTemplateMsgService().setIndustry(wxMpIndustry);
            return flag;
        }
    
        /**
         * <pre>
         * 获取设置的行业信息
         * @auther: cao_wencao
         * @date: 2019/2/18 15:21
         * </pre>
         */
        public WxMpTemplateIndustry getIndustry() throws WxErrorException {
            WxMpTemplateIndustry wxMpTemplateIndustry = wxMpService.getTemplateMsgService().getIndustry();
            return wxMpTemplateIndustry;
        }
    
        /**
         * <pre>
         * 发送模板消息
         * @auther: cao_wencao
         * @date: 2019/2/18 15:25
         * </pre>
         */
        public String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException {
            String result = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
            return result;
        }
    
    
        /**
         * <pre>
         * 获得模板ID
         * shortTemplateId: 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式
         * @auther: cao_wencao
         * @date: 2019/2/18 15:29
         * </pre>
         */
        public String addTemplate(String shortTemplateId) throws WxErrorException {
            String result = wxMpService.getTemplateMsgService().addTemplate(shortTemplateId);
            return result;
        }
    
        /**
         * <pre>
         * 获得模板列表
         * @auther: cao_wencao
         * @date: 2019/2/18 15:30
         * </pre>
         */
        List<WxMpTemplate> getAllPrivateTemplate() throws WxErrorException {
            List<WxMpTemplate> templateList = wxMpService.getTemplateMsgService().getAllPrivateTemplate();
            return templateList;
        }
    
        /**
         * <pre>
         * 删除模板
         * templateId: 公众帐号下模板消息ID
         * @auther: cao_wencao
         * @date: 2019/2/18 15:32
         * </pre>
         */
        boolean delPrivateTemplate(String templateId) throws WxErrorException {
            Boolean flag = wxMpService.getTemplateMsgService().delPrivateTemplate(templateId);
            return flag;
        }
    
    }
    

    六、如何使用模板消息工具类

     新建一个controller,在controller中注入WeChatTemplateMsgUtils即可

    @Autowired

    private WeChatTemplateMsgUtils weChatTemplateMsgUtils;

     

    七、WxMpService注入为空问题 

    首先,我在专栏首页里也说明过,本微信开发专栏是全部基于开源微信框架WxJava(原名:weixin-java-tools)来实现的一些功能,所以大家应该先去熟悉下WxJava如何使用以及其demo项目如何运行,在这篇文章推出后,发现很多评论说WxMpService注入为空,其实这是缺少配置文件的问题,demo里面就有,下面说下具体缺少项,以及针对SpringMVC项目和SpringBoot项目应该配置哪些东西;

    1. SpringMVC项目

     如果是SpringMVC项目,WxMpService注入为空可能是缺少图中的配置文件,加入这两项配置即可,具体参考demo项目:https://github.com/binarywang/weixin-java-mp-demo-springmvc

    2.SpringBoot项目

    如果是SpringBoot项目,WxMpService注入为空可能是缺少图中的配置文件,加入这两项配置即可,具体参考demo项目:https://github.com/binarywang/weixin-java-mp-demo-springboot

     

    上面就是针对针对SpringMVC架构和SpringBoot架构的项目,在使用微信模板消息时,注入WxMpService为空的各自问题及解决方案,在这里记录下,方便大家出现这种问题时看到就知道是什么原因,其实不是bug,自己多细心点就好了。

    展开全文
  • 包括以下功能: 1、获取token 2、获取js_ticket 3、上传多媒体文件 4、下载多媒体文件 5、发送客服消息 ...7、发送模板消息 8、网页授权 9、js_sdk 签名 10、被动回复消息 有使用方面的问题加qq: 3046707616
  • 遇到了模板消息空白,犯了最蠢的一种错误。 测试号,新增测试模板的时候 ...直接复制粘贴微信开发文档里的模板样式的时候,每行后面都会有空格,需要删掉这些空格。 然后代码部分: public class TemplateMes...

    遇到了模板消息空白,犯了最蠢的一种错误。

    测试号,新增测试模板的时候
    {{first.DATA}}
    商品:{{product.DATA}}
    下单时间:{{time.DATA}}
    消费金额:{{amount.DATA}}
    {{remark.DATA}}
    直接复制粘贴微信开发文档里的模板样式的时候,每行后面都会有空格,需要删掉这些空格。

    然后代码部分:

    public class TemplateMessageManager {
    	// 发送模板消息
    	@Test
    	public void sendTemplateMessage() {
    		String at = WxService.getAccessToken();
    		String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+ at;
    		String data ="{\"touser\":\"o6Ycf1Hij7X-arhIyo7qIN30R3UM\",\"template_id\":\"aec2hROP0Og-ByBDm08mXftXJHYPB6AsAhXEhqcAiRw\",\"url\":\"http://weixin.qq.com/download\","+
                    "\"data\":{\"first\":{\"value\":\"恭喜你购买成功!\",\"color\":\"#173177\"},\"product\":{\"value\":\"巧克力\",\"color\":\"#173177\"},\"time\":{\"value\":\"2014年9月22日\",\"color\":\"#173177\"},\"amount\":{\"value\":\"1\",\"color\":\"#173177\"},\"remark\":{\"value\":\"欢迎再次购买!\",\"color\":\"#173177\"}}}";
    		String result = Util.post(url, data);
    		System.out.println(result);
    	}
    }
    

    把String data=后面的转义字符串中的空格全删了,然后问题解决了。

    展开全文
  • 基于SpringBoot + Mybatis + Themeleaf的微信公众号网页授权demo代码;使用时需修改weinxinutil中的配置为自己申请的测试公众号
  • 微信公众号开发之发送模板消息

    万次阅读 多人点赞 2018-11-10 11:08:37
    在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧! 1、申请模板消息 首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2...

    在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧!

    1、申请模板消息

    首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2--3个工作日,结果第二天早上就发现已经开通了,所以说腾讯官方还是比较给力的哈)。

    但是我们在申请时还是有一些东西要注意,这个在官方的文档有非常详细的说明。

    这个我建议你好好看看。选择行业的时候可要谨慎些,因为这个一个月只可以修改一次。

    那么,我们来看看在哪里申请?

    这里我已经申请过了。

    申请之后就耐心等待,审核通过之后再功能这一栏里就会出现模板消息的菜单。你可以看看我上面的截图,就在第三项。

    2、添加模板消息

    审核通过之后,我们就可以添加模板消息,进行开发了。

    这个很简单:

    我们点击模板消息进入后,直接在模板库中选择你需要的消息模板添加就可以了,添加之后就会在我的模板中。会有一个模板id,这个模板id在我们发送消息的时候会用到。

    3、消息发送功能开发

    接下来我们就看看如何发送模板消息:

    这个是官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

    我呢,也来说说我的实现吧。为了更方便,我会直接将相关代码贴出来。

    文档中我们可以看到接口地址如下:

    http请求方式: POST
    https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

    这里我们首先需要的就是access_token了,这个在这里就不多说了。通过你的appid和secret就可以获取。

    【获取access_token : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

    关于相关参数,我直接就将官方文档贴来了(文档写的很清楚):

    POST数据示例如下:

          {
               "touser":"OPENID",
               "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
               "url":"http://weixin.qq.com/download",  
               "miniprogram":{
                 "appid":"xiaochengxuappid12345",
                 "pagepath":"index?foo=bar"
               },          
               "data":{
                       "first": {
                           "value":"恭喜你购买成功!",
                           "color":"#173177"
                       },
                       "keyword1":{
                           "value":"巧克力",
                           "color":"#173177"
                       },
                       "keyword2": {
                           "value":"39.8元",
                           "color":"#173177"
                       },
                       "keyword3": {
                           "value":"2014年9月22日",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"欢迎再次购买!",
                           "color":"#173177"
                       }
               }
           }
    

    参数说明

    参数是否必填说明
    touser接收者openid
    template_id模板ID
    url模板跳转链接(海外帐号没有跳转能力)
    miniprogram跳小程序所需数据,不需跳小程序可不用传该数据
    appid所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
    pagepath所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),暂不支持小游戏
    data模板数据
    color模板内容字体颜色,不填默认为黑色

    注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。

    返回码说明

    在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

        {
               "errcode":0,
               "errmsg":"ok",
               "msgid":200228332
           }

    相信看完以上文档,基本上没有什么问题了。

    以下是我的部分代码:

    // 获取token
            String token = saveAndFlushAccessTokenUtil.getToken();
    
            String postUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;
    
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("touser", "发送到用户的openid");   // openid
            jsonObject.put("template_id", "你的模板id");
            jsonObject.put("url", "http://www.baidu.com");
    
            JSONObject data = new JSONObject();
            JSONObject first = new JSONObject();
            first.put("value", "hello");
            first.put("color", "#173177");
            JSONObject keyword1 = new JSONObject();
            keyword1.put("value", "hello");
            keyword1.put("color", "#173177");
            JSONObject keyword2 = new JSONObject();
            keyword2.put("value", "hello");
            keyword2.put("color", "#173177");
            JSONObject keyword3 = new JSONObject();
            keyword3.put("value", "hello");
            keyword3.put("color", "#173177");
            JSONObject remark = new JSONObject();
            remark.put("value", "hello");
            remark.put("color", "#173177");
            
            data.put("first",first);
            data.put("keyword1",keyword1);
            data.put("keyword2",keyword2);
            data.put("keyword3",keyword3);
            data.put("remark",remark);
    
            jsonObject.put("data", data);
    
            String string = HttpClientUtils.sendPostJsonStr(postUrl, jsonObject.toJSONString());
            JSONObject result = JSON.parseObject(string);
            int errcode = result.getIntValue("errcode");
            if(errcode == 0){
                // 发送成功
                System.out.println("发送成功");
            } else {
                // 发送失败
                System.out.println("发送失败");
            }

    下面是http请求工具类:

    package car.repair.common.util;
    
    import lombok.extern.slf4j.Slf4j;
    import org.apache.http.HttpEntity;
    import org.apache.http.ParseException;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    
    /**
     * @author zhuzhe
     * @date 2017/12/11
     * HttpClient工具类
     */
    @Slf4j
    public class HttpClientUtils {
    
        /**
         * 以jsonString形式发送HttpPost的Json请求,String形式返回响应结果
         *
         * @param url
         * @param jsonString
         * @return
         */
        public static String sendPostJsonStr(String url, String jsonString) throws IOException {
            if (jsonString == null || jsonString.isEmpty()) {
                return sendPost(url);
            }
            String resp = "";
            StringEntity entityStr = new StringEntity(jsonString,
                    ContentType.create("text/plain", "UTF-8"));
            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(entityStr);
            CloseableHttpResponse response = null;
            try {
                response = httpClient.execute(httpPost);
                HttpEntity entity = response.getEntity();
                resp = EntityUtils.toString(entity, "UTF-8");
                EntityUtils.consume(entity);
            } catch (ClientProtocolException e) {
                log.error(e.getMessage());
            } catch (IOException e) {
                log.error(e.getMessage());
            } finally {
                if (response != null) {
                    try {
                        response.close();
                    } catch (IOException e) {
                        log.error(e.getMessage());
                    }
                }
            }
            if (resp == null || resp.equals("")) {
                return "";
            }
            return resp;
        }
    
        /**
         * 发送不带参数的HttpPost请求
         *
         * @param url
         * @return
         */
        public static String sendPost(String url) throws IOException {
            // 1.获得一个httpclient对象
            CloseableHttpClient httpclient = HttpClients.createDefault();
            // 2.生成一个post请求
            HttpPost httppost = new HttpPost(url);
            CloseableHttpResponse response = null;
            try {
                // 3.执行get请求并返回结果
                response = httpclient.execute(httppost);
            } catch (IOException e) {
                log.error(e.getMessage());
            }
            // 4.处理结果,这里将结果返回为字符串
            HttpEntity entity = response.getEntity();
            String result = null;
            try {
                result = EntityUtils.toString(entity);
            } catch (ParseException | IOException e) {
                log.error(e.getMessage());
            }
            return result;
        }
    }
    
    

     

    收到消息,我就不自己弄图了。这里附上官方图片一张:

     

    转载请务必保留此出处(原作者):https://blog.csdn.net/zhuzhezhuzhe1/article/details/83927016

     

    版权声明:本文为原创文章,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。

    https://blog.csdn.net/zhuzhezhuzhe1

     

    展开全文
  • java实现微信公众号模版消息推送 准备 登录微信公众号后台(公众号模版消息推送必须为认证后的服务号)获取获取添加模版消息ID 具体实现 java代码 /** * 体脂数据推送信息给微信 * @param access_token ...
  • 本篇文章讲解了如何向用户发送模板消息,前提是已经搭建了微信开发环境。读完本文后,实现的主要效果如下 向已绑定用户发送模板消息,如我们常见的消费通知、订单通知等业务都可以用该功能实现。理论知识就不反复...
  • 这段时间接触公众号开发,写下向用户发送消息模板的接口调用 先上接口代码 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,...
  • 以下是简单的使用Java代码实现微信公众号推送模板消息,不包含跳转到小程序网页代码 1、pom.xml文件中添加依赖 <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId>...
  • 微信公众号提供了多种消息能力,这里我们主要讲得是模板消息,有需要其他消息实现方式的朋友可以留言,出其他实现文章。 功能介绍 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,...
  • java实现关注微信公众号推送模板消息 消息模板配置 直接上代码 消息模板配置 百度搜索有很多教程,线面附地址。 教程:消息模板配置教程 值得注意的是,公众号配置菜单之后再配置消息模板会有冲突,导致菜单无法显示...
  • 及时和用户进行沟通以及反馈也是微信公众号开发的一个重要内容,那么微信客服和模板就解决了这个问题,本套课程带领大家一起去学习客服消息模板消息
  • 微信公众号开发之消息模板

    千次阅读 热门讨论 2018-07-06 09:22:29
    微信公众号开发之消息模板 这个消息模板是以订阅号进行模板配置的,如果是认证号就更加简单了,不用自己配置!!! 只需要知道模板ID,和模板的样式就行。 微信公众号发送消息模板,当前首先要关注这个公众号,...
  • 微信公众号二次开发项目源码

    千次下载 热门讨论 2016-01-18 17:29:13
    微信公众号二次开发项目源码 微信开发 公众号开发 OAuth2.0 微信二次开发 微信 java 代码,保护微信OAuth2.0授权 微信自定义菜单 微信回复图文消息 微信动态回复内容 微信开发即微信公众平台开发,将企业信息、服务...
  • 采用bootstrap开发的一组微信公众号界面,采用VUE动态绑定数据。界面美观,并且可以兼容各种版本。
  • Java微信公众号发送模板消息

    千次阅读 2019-07-18 16:14:14
    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。 1、模板消息调用时主要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,905
精华内容 4,362
关键字:

微信公众号开发之模板消息java

java 订阅