1.去小程序公众平台配置消息推送
开发工具——开发设置——消息推送
2.先来讲url和token怎么配置
我们的url的配置可以根据你的服务器地址来配置,我是先创建了一个Wxservlet,然后在这个里面创建了一个dispose接口,代码如下:
@WebServlet(urlPatterns = "/wx")
public class WxServlet extends HttpServlet {
// 与接口配置信息中的Token要一致
private static String WECHAT_TOKEN = "";//这个token是可以自己取的,随便取一个,我取的就不打出来了
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("来自微信服务器的配置请求");
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("来自微信服务器的配置请求");
response.setHeader("Access-Control-Allow-Origin", "*");//允许所有域名访问
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String result = null;
String op = request.getParameter("op");
switch (op) {
case "dispose"://配置
result = dispose(request);
break;
}
PrintWriter out = response.getWriter();
out.print(result);
out.flush();
out.close();
}
//配置
private String dispose(HttpServletRequest request) {
boolean isGet = request.getMethod().toLowerCase().equals("get");
if (isGet) {
String signature = request.getParameter("signature");// 微信加密签名
String timestamp = request.getParameter("timestamp");// 时间戳
String nonce = request.getParameter("nonce");// 随机数
String echostr = request.getParameter("echostr");// 随机字符串
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (signature != null && SignatureUtil.CheckSignature(signature, timestamp, nonce)) {
System.out.println("接入成功");
return echostr;
}
}
return ReturnResult.fail("接入失败");
}
}
所以根据这个我们就可以配置出url地址
然后就是token,刚刚在上面的代码中我们随便取了一个token,此时我们应该保持上述代码中的token与页面中的token一致
然后剩下的三个就跟上面图片中的一样就可以了
3.配置好了url了之后就可以去申请模板id了
在模板消息——我的模板中创建一个模板消息,获取模板ID,因为我申请的是一个简历投递通知模板,所以就直接这样举例子说明了
4.接下来就是后台的代码问题了,java后台创建小程序 Msg类,用于封装传送的参数
可以先建立一个Msg.java,方便后续的模板添加时可以直接继承部分属性
package wx.Msg;
public class Msg {
protected String openId;//接收者openId
protected String template;//模板编号
protected String page;//点击消息后的调整页面
protected String miniprogram_state;//小程序状态
protected String lang;//语言
public Msg(String openId, String template, String page) {
this.openId = openId;
this.template = template;
this.page = page;
this.miniprogram_state = "developer";
this.lang = "zh_CN";
}
}
我申请的模板如下:
5.java后台创建发送消息推送类
这里用一个例子来说明:就是当我将职位进行修改时,需要推送一条消息告知管理员来审核职位,所以我们可以创建一个方法MsgJobCheck来继承Msg方法,与此同时,我申请的模板如下:
注意:标出来的红框中的内容下面的java代码要与之对应,java代码可以直接拿去用,要和上面的Msg类一起用哦
//职位待审核通知
public class MsgJobCheck extends Msg {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private static final String TEMPLATE_ID = "YihxmDIFpduzM6d8Wgvs2vKeVshkfE7ab10Cr6DO4Dk";//改成你的模板id
private static final String PAGE = "homepage";
private String name;//申请人(模板中有几个字段就定义几个字段)
private String date;//申请时间
public MsgJobCheck(String openId, String name) {
super(openId, TEMPLATE_ID, PAGE);
this.name = name;
this.date = sdf.format(new Date());
}
@Override
public String toString() {
JSONObject json1 = new JSONObject();
JSONObject json4 = new JSONObject();
json1.put("value",name);
json4.put("value",date);
JSONObject data = new JSONObject();
data.put("thing1",json1);//与红框当中的一一对应,顺序也要一模一样,字段名改成你的模板中的字段名
data.put("time4",json4);//这个也一样
JSONObject json = new JSONObject();
json.put("touser",openId);
json.put("template_id",template);
json.put("page",page);
json.put("miniprogram_state",miniprogram_state);
json.put("lang",lang);
json.put("data",data);
return json.toJSONString();
}
}
这个时候后台推送消息的java类已经写好了,然后我们可以在我们需要推送订阅消息的地方加上下面这段代码:
//向管理员推送通知
String openId = "oiAtA5eZ9Z1EhF7GbM8xcVjIzcxw";//管理员的openid
System.out.println("openId:"+openId);
if(openId!=null && !openId.isEmpty()) {
MsgJobCheck msg = new MsgJobCheck(openId, title);//创建了一个MsgJobCheck方法来推送订阅消息
WxAPI.sendSubscribeMsg(msg.toString());
}
现在后台的已经全部完成,我们现在需要写出前台的代码
首先先做一个按钮可以让用户订阅消息,wxml代码如下:
<view class="panel_setting">
<view style="margin:10px auto; width:100%" class="curriculum_open">
<view >为了您可以及时收到用人单位发送给你的消息,请订阅消息</view>
</view>
<view style="margin:10px auto; width:75px">
<form bind:submit='subscribe'>//给按钮绑定事件
<button formType='submit' class="submit" size="mini">订阅</button>
</form>
</view>
</view>
然后当点击按钮时触发订阅消息事件,js中代码如下:
//订阅消息
subscribe:function(){
wx.requestSubscribeMessage({
tmplIds: ['PNGt1HARIL3cf759eQKZHAfWILWN8ScgbpI2bKOptjA','YihxmDIFpduzM6d8Wgvs2vKeVshkfE7ab10Cr6DO4Dk'],//订阅消息模板Id,可以有多个
success:function (res) {
console.log('订阅成功');
},
fail:function(res){
console.log(res);
}
})
},
wxss代码如下(这段代码可能不完整,你们需要自己去调整一下):
.panel_setting{
border: 1px #b0b0b0 solid;
border-radius: 8px;
margin: 5px;
}
.curriculum_open{
font-size: 13px;
text-align:center;
}
这个时候我们就可以实现最终效果了,如图:
这里需要注意的是我这个openid是写死的,如果想要获取的话是要通过当前登录用户id来拿到所对应的openid,其次,这个订阅消息是你允许一次,然后也只能推送一次
推送成功效果如下:
之后我申请的一个模板中有phrase字段,我刚开始并不知道这个字段还有长度限制,于是就写了很多个字,然后一直不能发送成功,调试发现,报错了,是47003错误,一去百度发现,原来是字数限制问题,记下来作为一个教训,这张图片真的很重要!