微信小程序结合微信公众号进行消息发送
微信小程序结合微信公众号进行消息发送
由于小程序的模板消息已经废弃了,官方让使用订阅消息功能。而订阅消息的使用限制比较大,用户必须得订阅、需要获取用户同意接收消息的权限、用户必须得和小程序有交互的时候才能发送且只能发送一次。而我们的需求有可能是不限时间不限“次数”的发送消息。那么就可以使用官方提供的统一服务消息。
统一服务消息
该功能还是有一点的使用限制的。
第一:小程序和公众号的主体必须是同一个。
第二:用户必须关注公众号。
第三:我们得有消息模板,小程序消息模板和公众号消息模板都可以。
结合文档,使用Java对发送消息的功能进行简单的封装
第一:使用httpClient请求地址,获取access_token
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
根据官方接口的返回值,我们封装返回值对象
@Data
public class AccessToken {
/** 接口调用凭证 */
private String access_token;
/** 过期时间 */
private Long expires_in;
/** 错误信息代码 */
private String errcode;
/** 错误信息 */
private String errmsg;
}
使用httpClient发送请求
AccessToken accessToken = new AccessToken();
String url = WxMessageConstant.GET_XCX_ACCESS_TOKEN_URL + "&appid=" + WxMessageConstant.APP_ID + "&secret=" + WxMessageConstant.SECRET;
String result = HttpClientUtils.doGet(url);
accessToken = JSON.parseObject(result, AccessToken.class);
注意:获得的token结果可以放在redis里面,设置上过期时间,防止应用重复获取access_token!
第二:构造请求
构造请求url
根据官方提供的接口再加上我们的获取的access_token进行构造
POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
构造请求参数
根据官方文档,我们一步一步来构造请求参数对象,我们用的是公众号的消息模板,所以这里没有weapp_template_msg参数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ReqSendMessageData {
/**
* 消息接收者
*/
private String touser;
/**
* 公众号模板消息信息
*/
private MpTemplateMsg mp_template_msg;
}
构造mp_template_msg对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MpTemplateMsg {
/** 公众号openId */
private String appid;
/** 公众号模板id */
private String template_id;
/** 跳转到公众号的地址,文档上写的必填,我没填,没有报错 */
private String url;
/** 公众号绑定的小程序信息 */
private Miniprogram miniprogram;
/** 数据 */
private Map<String,Object> data;
}
构造小程序信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Miniprogram {
/** 小程序appid */
private String appid;
/** 要跳转到小程序的页面 */
private String page;
}
贴出httpClient发送post请求的方式
public static String postSendJsonParam(String url, String param) {
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = null;
// 请求方式
HttpPost httpPost = null;
// 响应
CloseableHttpResponse httpResponse = null;
httpPost = new HttpPost(url);
httpPost.setHeader("Connection", REQUEST_HEADER_CONNECTION);
httpPost.setHeader("User-Agent", REQUEST_HEADER_USER_AGENT);
httpPost.addHeader("content-type", "application/json;charset=utf-8");
httpPost.addHeader("accept", "application/json");
httpPost.setEntity(new StringEntity(param, "UTF-8"));
try {
httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
result = EntityUtils.toString(httpEntity);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (httpClient != null) {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
构造返回值对象,我们根据错误代码进行扩展操作
@Data
public class ResSendMessageDTO {
/** 错误代码 */
private String errcode;
/** 错误信息 */
private String errmsg;
}
最后我们可以把这些封装成一个service交给spring管理。
public interface MessageService {
/**
* @author: taoym
* @date: 2020/7/2 9:08
* @desc: 推送消息
*/
ResSendMessageDTO sendMessage(ReqSendMessageData data);
}
具体实现不展示了。
封装消息发送者
@Component
public class MessageSender {
@Autowired
private MessageService messageService;
/**
* @param first 消息标题
* @param keywordMap 消息内容
* @param page 要跳转到小程序的页面
* @param templateId 模板消息编号
* @param touser 消息接收者openId
* @author: taoym
* @date: 2020/9/28 11:25
* @desc: 消息发送者
*/
public ResSendMessageDTO sendMessage(String first, Map<String, Keyword> keywordMap, String touser, String page, String templateId) {
// 消息模板上的数据
Map<String, Object> messageData = Maps.newHashMap();
// first,可以理解为 标题
messageData.put("first", new First(first));
// keywordMap 可以理解为内容
messageData.putAll(keywordMap);
ReqSendMessageData reqSendMessageData = new ReqSendMessageData();
reqSendMessageData.setTouser(PasswordUtils.decrypt(touser));
MpTemplateMsg mpTemplateMsg = new MpTemplateMsg();
Miniprogram miniprogram = new Miniprogram();
miniprogram.setPage(page);
mpTemplateMsg.setMiniprogram(miniprogram);
mpTemplateMsg.setData(messageData);
mpTemplateMsg.setTemplate_id(templateId);
reqSendMessageData.setMp_template_msg(mpTemplateMsg);
ResSendMessageDTO resSendMessageDTO = messageService.sendMessage(reqSendMessageData);
// 0为成功的标志
if (!resSendMessageDTO.getErrcode().equals("0")) {
throw new ExceptionCore(resSendMessageDTO.getErrcode(), resSendMessageDTO.getErrmsg());
}
return resSendMessageDTO;
}
}
最后我们只需要根据模板消息的内容构造合理的参数,然后调用该方法即可发送消息。
微信小程序结合微信公众号进行消息发送的更多相关文章
- 微信小程序和微信公众号的id是一个吗
首先,简单说下我遇到的问题是我们的程序调用微信小程序得到openid,然后通过openID得到用户的唯一标识,用户得以登录,然而,当我们调用微信公众号也同样的到openid,同一以用户两个不同的ope ...
- [转]微信小程序、微信公众号、H5之间相互跳转
本文转自:https://www.cnblogs.com/colorful-paopao1/p/8608609.html 转自慕课网 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加 ...
- 微信小程序、微信公众号、H5之间相互跳转
转自慕课网 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 图片有点小,我把文字打出来吧: 可关联已有的小程序或快速创建小程序.已关联的小程序可被使用在自定义菜单和模版消息 ...
- 使用Appium 测试微信小程序和微信公众号方法
由于腾讯系QQ.微信等都是基于腾讯自研X5内核,不是google原生webview,需要打开TBS内核Inspector调试功能才能用Chrome浏览器查看页面元素,并实现Appium自动化测试微信小 ...
- 微信小程序与微信公众号同一用户登录问题
微信小程序与微信公众号同一用户登录问题 最近在做微信小程序与微信公众号登录合并的接口.整理相关资料以及个人认识的心得写了这篇文章与大家一起分享. 首先,简单说下我遇到的问题是我们的程序调用微信小程序得 ...
- 微信小程序(原名微信应用号)开发工具0.9版安装教程
微信小程序全称微信公众平台·小程序,原名微信公众平台·应用号(简称微信应用号) 声明 微信小程序开发工具类似于一个轻量级的IDE集成开发环境,目前仅开放给了少部分受微信官方邀请的人士(据说仅200个名 ...
- 微信小程序(微信应用号)开发ide安装解决方法
这两天整个技术圈都炸锅了,微信小程序(微信应用号)发布内测,首批200家收到邀请,但是没受邀请的同学,也不用担心,下面介绍一下解决方法. 首先需要下载ide,昨天只需要下载0.9版本的编辑器并替换文件 ...
- 微信小程序(微信应用号)组件讲解[申明:来源于网络]
微信小程序(微信应用号)组件讲解[申明:来源于网络] 地址:http://www.cnblogs.com/muyixiaoguang/p/5902008.html
- 如何玩转小程序+公众号?手把手教你JeeWx小程序CMS与公众号关联
随着微信小程序新功能.新入口的不断更新,小程序的商业价值逐步增强,特别是小程序与公众号的深度融合,已经让小程序成为各行业新的营销渠道.Jeewx平台专注小程序的开发,逐步完善小程序生态圈,通过简单操作 ...
随机推荐
- python数据处理工具 -- pandas(序列与数据框的构造)
Pandas模块的核心操作对象就是对序列(Series)和数据框(Dataframe).序列可以理解为数据集中的一个字段,数据框是值包含至少两个字段(或序列) 的数据集. 构造序列 1.通过同质的列表 ...
- C# Mongo DB 修改多层嵌套集合中的字段
C# Mongo DB 修改嵌套集合中的字段 虽然c#的mongo 驱动很强大,而且还支持linq,但是一些复杂的操作语句还是比较困难 这里我用Bson实现功能 这是模型(我这里有多层嵌套) publ ...
- C#.WinForm 拖动文件到PictrueBox(支持跨UAC拖动)
如程序以普通方式打开,那么DragDrop DragEnter 事件是可以正常使用的.但以管理员身份运行时,这两个方法将失效. 原因是 Windows机制(用户界面特权隔离). UIPI:用户界面特权 ...
- 搜索会抓取网站域名的whoise信息吗
http://www.wocaoseo.com/thread-309-1-1.html 网站是否在信产部备案,这是不是会成为影响网站收录和排名的一个因素?百度是否会抓取域名注册人的相关whois信息吗 ...
- 启动Spring后,连接mysql报错
连接失败,原因是Mysql服务未启动 解决方法:启动mysql服务 方法一: 以管理员身份运行CMD 输入命令:net start mysql 方法二: 右键计算机-管理-服务和应用程序-服务 右键启 ...
- Apache Tika实战
Apache Tika实战 Tika 简介 Apache Tika 是一个内容分析工具包,可以检测上千种文件类型,并提取它们的元数据和文本.tika在设计上十分精巧,单一的接口使它易于使用,在搜索引擎 ...
- 力扣Leetcode 面试题51. 数组中的逆序对 - 归并排序
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= ...
- 详细分析链表的数据结构的实现过程(Java 实现)
目录 链表的数据结构的实现过程(Java 实现) 前言 基本概念 链表的基本结构 链表的基本操作的实现 在链表中添加元素 在链表头添加元素 在链表指定位置处添加元素 链表的虚拟头节点 链表的查询和修改 ...
- frozenset冻结集合函数
1.描述 frozenset()返回一个冻结的集合,冻结后不能添加.删除和修改. set()无序且不重复,是可以变的,有add.remove.扩展:删除重复数据,还可以计算交集.差集.并集等 2.函数 ...
- 轻轻松松学CSS:float
float属性,会使元素向左或向右移动,其周围的元素也会重新排列.float不仅自己飘忽不定,还对周围元素有影响,这种影响力不容小觑.他捉摸不定(浮动规律不好把握),他干涉他国内政(对周围元素有影响) ...