微信公众号消息推送-模板消息发送
先注册一个微信公众号;或者申请接口测试号来进行开发;
接口测试号申请链接:
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
这里先介绍测试号的开发;
点击链接进入页面,会看到y一个二维码,用微信扫描后就会分配给你一个微信公众测试账号;
然后找到如下这个位置,点击“新增测试模板”按钮,填写
下面是相关代码;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | @Test public void sendTemplate(){ postTemplateMsg( "appid" , "appSecret" , "openId" ); //这里替换成你自己的信息 } public String sendTemplateMessage(String openId){ TemplateMsg tm= new TemplateMsg(); tm.setTouser(openId); tm.setTemplate_id( "模板Id" ); tm.setUrl( "https://wwww.baidu.com" ); //about data start Map<String,Object> m = new HashMap<String,Object>(); TemplateData first = new TemplateData(); first.setColor( "#000000" ); first.setValue( "您好,您有一个流程待办需要处理:" ); m.put( "first" , first); TemplateData keyword1 = new TemplateData(); keyword1.setColor( "#000000" ); keyword1.setValue( "11111111111111" ); m.put( "keyword1" , keyword1); TemplateData keyword2 = new TemplateData(); keyword2.setColor( "#000000" ); keyword2.setValue( "爱你一万年" ); m.put( "keyword2" , keyword2); TemplateData keyword3 = new TemplateData(); keyword3.setColor( "#000000" ); keyword3.setValue( "2018.04.27 09:51:30" ); m.put( "keyword3" , keyword3); TemplateData keyword4 = new TemplateData(); keyword4.setColor( "#000000" ); keyword4.setValue( "不够" ); m.put( "keyword4" , keyword4); TemplateData remark = new TemplateData(); remark.setColor( "#000000" ); remark.setValue( "再加一万年" ); m.put( "remark" , remark); //about data end tm.setData(m); String jsonString = JSONObject.fromObject(tm).toString(); System.out.println( "jsonString:" +jsonString); return jsonString; } /** * 发送模板消息 * appId 公众账号的唯一标识 * appSecret 公众账号的密钥 * openId 用户标识 */ public void postTemplateMsg(String appId, String appSecret, String openId){ Token token = CommonUtil.getToken(appId, appSecret); String access_token = token.getAccessToken(); String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" +access_token; System.out.println( "requestUrl:" +requestUrl); String jsonString = sendTemplateMessage(openId); JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "POST" , jsonString); System.out.println( "jsonObject=" +jsonObject); if ( null != jsonObject) { int errorCode = jsonObject.getInt( "errcode" ); if ( 0 == errorCode) { System.out.println( "模板消息发送成功!" ); } else { String errorMsg = jsonObject.getString( "errmsg" ); System.out.println( "模板消息发送失败,错误码是:" +errorCode+ ",错误信息是:" +errorMsg); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | /** * 类名: CommonUtil </br> * 描述: 通用工具类 </br> * 发布版本:V1.0 </br> */ public class CommonUtil { // 凭证获取(GET) public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET" ; /** * 发送https请求 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null ; 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 conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput( true ); conn.setDoInput( true ); conn.setUseCaches( false ); // 设置请求方式(GET/POST) conn.setRequestMethod(requestMethod); // 当outputStr不为null时向输出流写数据 if ( null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意编码格式 outputStream.write(outputStr.getBytes( "UTF-8" )); outputStream.close(); } // 从输入流读取返回内容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8" ); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null ; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null ) { buffer.append(str); } // 释放资源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null ; conn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { System.out.println( "连接超时:" + ce); } catch (Exception e) { System.out.println( "https请求异常:" + e); } return jsonObject; } /** * 获取接口访问凭证 * * @param appid 凭证 * @param appsecret 密钥 * @return */ public static Token getToken(String appid, String appsecret) { Token token = null ; String requestUrl = token_url.replace( "APPID" , appid).replace( "APPSECRET" , appsecret); System.out.println( "requestUrl:" +requestUrl); // 发起GET请求获取凭证 JSONObject jsonObject = httpsRequest(requestUrl, "GET" , null ); if ( null != jsonObject) { try { token = new Token(); token.setAccessToken(jsonObject.getString( "access_token" )); token.setExpiresIn(jsonObject.getInt( "expires_in" )); } catch (JSONException e) { token = null ; // 获取token失败 System.out.println( "获取token失败 errcode:" +jsonObject.getInt( "errcode" )+ "errmsg:" +jsonObject.getString( "errmsg" )); } } return token; } /** * 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; } public static void main(String args[]) { //https://1d488f5d.ngrok.io/WeiXinProject/ String source= "https://565b4dad.ngrok.io/WeChatPublicNumber/oauthServlet" ; System.out.println(CommonUtil.urlEncodeUTF8(source)); } } |
over!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2017-04-27 Pom报错