记录下微信小程序订阅消息的前后台开发(不是推送消息)
2020-04-07 12:14
1176 查看
最近微信爸爸又改规则了.不让推送消息给用户了.这不坑人嘛.又得重构代码!!!没办法人在屋檐下,大家都懂!
话不多说先贴前端代码
nextStep(e) { // 获取课程信息 const item = e.currentTarget.dataset.item; // 调用微信 API 申请发送订阅消息 wx.requestSubscribeMessage({ // 传入订阅消息的模板id,模板 id 可在小程序管理后台申请 tmplIds: ['VHC02ssXK9K67zPC6DhEc_7KRi20ctjO_H3kpHy3NXs'],//这个自己去申请!如果这个id在微信小程序里删除后,你会发现你死活都不能掉用这个方法! success(res) { // 申请订阅成功 if (res.errMsg === 'requestSubscribeMessage:ok') { util.request(api.Push).then(function (res) { if (res.errno === 0) { wx.showToast({ title: '订阅成功', icon: 'success', duration: 2000, }); } else { wx.showToast({ title: '订阅失败', icon: 'success', duration: 2000, }); } }); } }, }); }
然后就是后端代码,我是用的java
public Object pushMessage(Integer userId) { LitemallUser user = userService.selectUser(userId); String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APP_ID + "&secret=" + SECRET_ID; String result = HttpUtils.sendGet(url); JSONObject object = JSON.parseObject(result); String Access_Token = object.getString("access_token"); Template template = new Template(); template.setTemplate_id(TEMPLATE_ID); template.setTouser(user.getWeixinOpenid()); template.setPage("pages/index/index"); List<TemplateParam> paras = new ArrayList<>(); paras.add(new TemplateParam("date5", "2019-10-10")); paras.add(new TemplateParam("thing10", "XXXXX")); paras.add(new TemplateParam("thing8", "XXXXXX")); template.setTemplateParamList(paras); String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN"; requestUrl = requestUrl.replace("ACCESS_TOKEN", Access_Token); System.out.println(template.toJSON()); JSONObject jsonResult = HttpUtils.httpsRequest(requestUrl, "POST", template.toJSON()); if (jsonResult != null) { System.out.println(jsonResult); int errorCode = jsonResult.getInteger("errcode"); String errorMessage = jsonResult.getString("errmsg"); if (errorCode == 0) { System.out.println("Send Success"); } else { System.out.println("订阅消息发送失败:" + errorCode + "," + errorMessage); } } return ResponseUtil.ok(); }
请求类也贴一下吧~
package org.linlinjava.litemall.wx.util; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.linlinjava.litemall.wx.dto.MyX509TrustManager; 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.HttpURLConnection; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * http请求工具类 */ public class HttpUtils { private static final CloseableHttpClient httpclient = HttpClients.createDefault(); /** * 发送HttpGet请求 * @param url * @return */ public static String sendGet(String url) { HttpGet httpget = new HttpGet(url); CloseableHttpResponse response = null; try { response = httpclient.execute(httpget); } catch (IOException e1) { e1.printStackTrace(); } String result = null; try { HttpEntity entity = response.getEntity(); if (entity != null) { result = EntityUtils.toString(entity); } } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 发送HttpPost请求,参数为map * @param url * @param map * @return */ public static String sendPost(String url, Map<String, String> map) { List<NameValuePair> formparams = new ArrayList<NameValuePair>(); for (Map.Entry<String, String> entry : map.entrySet()) { formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8); HttpPost httppost = new HttpPost(url); httppost.setEntity(entity); CloseableHttpResponse response = null; try { response = httpclient.execute(httppost); } catch (IOException e) { e.printStackTrace(); } HttpEntity entity1 = response.getEntity(); String result = null; try { result = EntityUtils.toString(entity1); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 发送不带参数的HttpPost请求 * @param url * @return */ public static String sendPost(String url) { HttpPost httppost = new HttpPost(url); CloseableHttpResponse response = null; try { response = httpclient.execute(httppost); } catch (IOException e) { e.printStackTrace(); } HttpEntity entity = response.getEntity(); String result = null; try { result = EntityUtils.toString(entity); } catch (Exception e) { e.printStackTrace(); } return result; } public static JSONObject httpsRequest(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 = JSON.parseObject(buffer.toString()); } catch (ConnectException ce) { ce.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return jsonObject; } public static String httpRequest(String requestUrl, String requestMethod, String outputStr) { StringBuffer buffer = new StringBuffer(); try { URL url = new URL(requestUrl); HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); 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.fromObject(buffer.toString()); } catch (ConnectException ce) { ce.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return buffer.toString(); } 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 String httpsRequestForStr(String requestUrl, String requestMethod, String outputStr) { String result=""; 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(); result=buffer.toString(); } catch (ConnectException ce) { ce.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return result; } }
package org.linlinjava.litemall.wx.dto; import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; public class MyX509TrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }
特别提醒 如果你的订阅消息参数不符合规则的话,会返回47003的
再附上规则!
好像没啥了! 祝大家开发顺利!
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【微信小程序开发】云函数sql返回结果为对象,需要把结果变为数值类型
- 2017-9月微信公众号支付-Java详解
- Java之微信公众号支付---配置详情
- 微信小程序后端(java)开发流程的详细步骤
- D5——学习微信开发者工具
- Java网页授权登录及获取用户信息---微信授权登录
- WinForm小程序(技术改变世界-cnblog)
- 预约小程序开发:小程序开发的费用都包含了哪些?
- 刷了十分钟下不了单 探访瑞幸沪上门店:火爆到崩溃
- Django的后台接收微信小程序上传的图片
- 小程序自定义组件无法使用iconfont
- 微信小程序的key值
- 小程序之☞页面的生命周期
- 小程序组件和页面的差异
- liferay 7.2.0第一个小程序idea版 GuestbookPortlet_01
- liferay 7.2.0第一个小程序idea版 GuestbookPortlet_02
- C#用timer实现背单词小程序
- 使用Puppeteer爬取微信文章的实现
- 小程序中wxs的使用
- 小程序中的异步处理方式: