搜索
简帛阁>技术文章>springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码

springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码

最近需要开发微信和小程序的推送功能,需要用java后台实现推送,自己本身java和小程序都做,所以就自己动手实现下小程序的模版推送功能推送。

实现思路

  • 1 小程序获取用户openid,收集formid传给java后台
  • 2 java推送消息给指定小程序用户

老规矩,还是先看效果图

我的这个是跑腿抢单推送,当用户新下单时,会给跑腿员推送消息。

下面开始讲解实现步骤

一,微信小程序管理后台开通模版推送

这里的模版id很重要,接下来我们推送的都是这个模版。

二,java后台实现推送所需字段

  • 1 看微信官方推送消息所需要的字段

  • 2 有了官方说明,我门接下来就去拿到官方所需要的这些字段,来组装请求数据就可以了。

三,下面讲解实现步骤

我的java后台是基于springboot开发的,如果你不了解spring boot,建议你先去了解下springboot再回来接着学习。 还有RestTemplate是我们java后台做get和post请求必须的,我们和微信服务器交互就用的RestTemplate

  • 1 首先根据官方推送所需字段组装java-bean 这里用到两个javabean
/*
* 小程序推送所需数据
* qcl 微信:2501902696
* */
@Data
public class WxMssVo {
    private String touser;//用户openid
    private String template_id;//模版id
    private String page = "index";//默认跳到小程序首页
    private String form_id;//收集到的用户formid
    private String emphasis_keyword = "keyword1.DATA";//放大那个推送字段
    private Map<String, TemplateData> data;//推送文字
}
复制代码
/*
* 设置推送的文字和颜色
* qcl 微信:2501902696
* */
@Data
public class TemplateData {
    //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
    private String value;//,,依次排下去
//    private String color;//字段颜色(微信官方已废弃,设置没有效果)
}
复制代码

到这里请求推送的数据就组装好了,解下来我们去实现推送功能。 奥不对,还有一个重要的字段需要获取到:access_token

access_token的获取

/*
    * 获取access_token
    * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
    * */
    public String getAccess_token(String appid, String appsecret) {
        //获取access_token
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                "&appid=" + appid + "&secret=" + appsecret;
        String json = restTemplate.getForObject(url, String.class);
        AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
        return accessToken.getAccess_token();
    }
复制代码

这次是真正的可以来请求微信服务器来实现消息推送了

/*
    * 微信小程序推送单个用户
    * */
    public String pushOneUser(String openid, String formid) {


        //获取access_token
        String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                "?access_token=" + access_token;

        //拼接推送的模版
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser(openid);//用户openid
        wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
        wxMssVo.setForm_id(formid);//formid


        Map<String, TemplateData> m = new HashMap<>(5);

        //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
        TemplateData keyword1 = new TemplateData();
        keyword1.setValue("新下单待抢单");
        m.put("keyword1", keyword1);

        TemplateData keyword2 = new TemplateData();
        keyword2.setValue("这里填下单金额的值");
        m.put("keyword2", keyword2);
        wxMssVo.setData(m);

        TemplateData keyword3 = new TemplateData();
        keyword3.setValue("这里填配送地址");
        m.put("keyword3", keyword3);
        wxMssVo.setData(m);

        TemplateData keyword4 = new TemplateData();
        keyword4.setValue("这里填取件地址");
        m.put("keyword4", keyword4);
        wxMssVo.setData(m);

        TemplateData keyword5 = new TemplateData();
        keyword5.setValue("这里填备注");
        m.put("keyword5", keyword5);
        wxMssVo.setData(m);

        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        log.error("小程序推送结果={}", responseEntity.getBody());
        return responseEntity.getBody();
    }
复制代码

openid可以让小程序开发人员给你传过来,也可以自己获取。 formid需要小程序开发给你传过来,你也可以把formid存到数据库里,什么时候需要直接拿出来用就可以了。 注意:formid必须和用户openid对应。

下面贴出来完整代码

package com.qcl.paotuischool.wechat;

import com.google.gson.Gson;
import com.qcl.userwechat.bean.AccessToken;
import com.qcl.utils.ConstantUtils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

import lombok.extern.slf4j.Slf4j;

/**
 * Created by qcl on 2018/9/11.
 * 微信小程序推送服务,
 * 包含获取access_token的服务
 */
@Service
@Slf4j
public class WxPushServiceQcl {
    //用来请求微信的get和post
    @Autowired
    private RestTemplate restTemplate;


    /*
    * 微信小程序推送单个用户
    * */
    public String pushOneUser(String openid, String formid) {


        //获取access_token
        String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                "?access_token=" + access_token;

        //拼接推送的模版
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser(openid);//用户openid
        wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
        wxMssVo.setForm_id(formid);//formid


        Map<String, TemplateData> m = new HashMap<>(5);

        //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
        TemplateData keyword1 = new TemplateData();
        keyword1.setValue("新下单待抢单");
        m.put("keyword1", keyword1);

        TemplateData keyword2 = new TemplateData();
        keyword2.setValue("这里填下单金额的值");
        m.put("keyword2", keyword2);
        wxMssVo.setData(m);

        TemplateData keyword3 = new TemplateData();
        keyword3.setValue("这里填配送地址");
        m.put("keyword3", keyword3);
        wxMssVo.setData(m);

        TemplateData keyword4 = new TemplateData();
        keyword4.setValue("这里填取件地址");
        m.put("keyword4", keyword4);
        wxMssVo.setData(m);

        TemplateData keyword5 = new TemplateData();
        keyword5.setValue("这里填备注");
        m.put("keyword5", keyword5);
        wxMssVo.setData(m);

        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        log.error("小程序推送结果={}", responseEntity.getBody());
        return responseEntity.getBody();
    }

    /*
    * 获取access_token
    * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
    * */
    public String getAccess_token(String appid, String appsecret) {
        //获取access_token
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                "&appid=" + appid + "&secret=" + appsecret;
        String json = restTemplate.getForObject(url, String.class);
        AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
        return accessToken.getAccess_token();
    }

}
复制代码

在需要做推送的地方调用WxPushServiceQcl类中的pushOneUser方法,并传入openid, formid参数即可。

这是我推送成功后打印的log

下面来讲小程序端开发需要做些什么

可以看出,我们的formid有效期是7天,并且一个form_id只能使用一次,所以我们小程序端所需要做的就是尽可能的多拿些formid,然后传个后台,让后台存到数据库中,这样7天有效期内,想怎么用就怎么用了。

所以接下来要讲的就是小程序开发怎么尽可能多的拿到formid了。

看下官方提供的,只有在表单提交时把report-submit设为true时才能拿到formid,比如这样

 <form report-submit='true' >
   <button  form-type='submit'>获取formid</button>
  </form>
复制代码

所以我们就要在这里下功夫了,既然只能在form组件获取,我们能不能把我们小程序里用到最多的地方用form来伪装呢。

我的小程序是跑腿小程序,消息也主要推送给跑腿员的,而跑腿员点击最多的也就是这两个条目,所以我们就用from组件来伪装这两个条目,让用户在点击的同时就可以收集到用的formid。

 <view class='button_item'>
  <form class="form_item" bindsubmit='gorRunnerLobby' report-submit='true' data-type="1">
   <button class="button" form-type='submit'>
    <text>抢单大厅</text>
    <text class='runner_desc'>(兼职也可月入万元)</text>
   </button>
  </form>
  <view class='right_arrow' />
 </view>
复制代码

这样就可以在用户点击条目时,收集到用户formid了

由于上面的botton有默认样式,所以我们就通过修改css来去除botton默认样式。

.button_item {
 width: 100%;
 display: flex;
 flex-direction: row;
 align-items: center;
 padding: 2px 20px;
 background: white;
 border-bottom: 1px solid gainsboro;
}
/* 主要通过这里去除botton默认样式 */
.button {
 width: 100%;
 background: white;
 border: none;
 text-align: left;
 padding: 6px 0px;
 margin: 0px;
 line-height: 1.5;
}

/* 主要通过这里去除botton边框 */
.button::after {
 border: none;
}

/* 用button伪装获取formid */

.form_item {
 width: 100%;
}
复制代码

到这里我们小程序端也圆满完成自己的任务了。

补充知识点

  • 小程序开发如何获取用户openid

这样我们java后台和小程序开发就可以开开心心的完成微信小程序的消息推送功能了。

如果有java或小程序相关的问题可以加我微信交流学习2501902696(备注小程序或java)

转载于:https://juejin.im/post/5b9760375188255c54428e8c

最近需要开发程序推送功能,需要用java后台实现推送,自己本身java程序都做,所以就自己动手实现程序的模版推送功能推送实现思路1程序获取用户openid,收集formid传给j
当订单状态变更时,程序如何实现消息推送来通知到用户呢。开放了一个叫模板消息的功能。https://developersweixinqqcom/miniprogram/dev/api/notic
实现效果:下面要显示五个字段接下来,参照官方文档,一步步实现:一、官方给出请求示例、返回示例二、根据上面编写实体类(1)请求参数@DatapublicclassSendTemplateReq{/***
程序消息推送文章目录前言使用步骤1开通程序消息推送功能2接收消息推送并自动应答总结前言最近公司一个项目需要实现程序客服自动为用户发送企业二维码功能主要用到了程序消息推送功能本文大概记录
段时间剁手了PS4,在浏览商店时,发现官方商店真的不好用,主要是网络原因,次要是页面设计。所以就想自己做一个游戏查询的程序,可以关注某个游戏,然后在这个游戏打折的时候发送通知给用户。最后发现有个很
wxml文件:<formbind:submittestSubmitreportsubmittruehidden{<!>{emptyprompt}}><buttonform
文章有点标题党,单纯的从技术上来实现无限推送暂时是不可能的。为什么不可能?推送程序官方的叫法是模板消息。先来看看官方对他的下发条件说明:1支付当用户在程序内完成过支付行为,可允许开发者向用户在7
最近做微信公共号的开发,有个需求是这样的消息推送,以文本的形式把编辑的消息发送给企业号中的某一个应用组,这里做下笔记,以下是整理内容://定义数据模型publicclassAccess_token
最近公司在搞微信小程序:抽奖程序,打卡程序;自己作为项目的负责人随时跟踪进度,程序的前端参与写了一点点2,3个简单的页面,后台系统的搭建和开发我来搞等,感觉微信小程序的前端页面等很想vue,标
司的程序最近开始接入程序的客服功能,主要实现能够自动回复以及人工回复。查阅开放文档后,也基本上完成了需求,但是其中遇到了很多问题,现在总结一下。接入方式的选择的文档中说的是可以有3种实现