當(dāng)前位置:首頁 > IT技術(shù) > 微信平臺(tái) > 正文

小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送
2021-08-07 18:53:02

?

最近需要開發(fā)微信和小程序的推送功能,需要用java后臺(tái)實(shí)現(xiàn)推送,自己本身java和小程序都做,所以就自己動(dòng)手實(shí)現(xiàn)下小程序的模版推送功能推送。

實(shí)現(xiàn)思路

  • 1 小程序獲取用戶openid,收集formid傳給java后臺(tái)
  • 2 java推送消息給指定小程序用戶

老規(guī)矩,還是先看效果圖

小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_小程序模版消息推送
我的這個(gè)是跑腿搶單推送,當(dāng)用戶新下單時(shí),會(huì)給跑腿員推送消息。

下面開始講解實(shí)現(xiàn)步驟

一,微信小程序管理后臺(tái)開通模版推送

小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_java實(shí)現(xiàn)小程序推送_02
這里的模版id很重要,接下來我們推送的都是這個(gè)模版。

二,java后臺(tái)實(shí)現(xiàn)推送所需字段
  • 1 看微信官方推送消息所需要的字段
    小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_小程序消息推送_03
    小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_微信小程序推送_04
  • 2 有了官方說明,我門接下來就去拿到官方所需要的這些字段,來組裝請(qǐng)求數(shù)據(jù)就可以了。

三,下面講解實(shí)現(xiàn)步驟

我的java后臺(tái)是基于springboot開發(fā)的,如果你不了解spring boot,建議你先去了解下springboot再回來接著學(xué)習(xí)。
還有RestTemplate是我們java后臺(tái)做get和post請(qǐng)求必須的,我們和微信服務(wù)器交互就用的RestTemplate

  • 1 首先根據(jù)官方推送所需字段組裝java-bean
    這里用到兩個(gè)javabean
/*
* 小程序推送所需數(shù)據(jù)
* qcl 微信:2501902696
* */
@Data
public class WxMssVo {
    private String touser;//用戶openid
    private String template_id;//模版id
    private String page = "index";//默認(rèn)跳到小程序首頁
    private String form_id;//收集到的用戶formid
    private String emphasis_keyword = "keyword1.DATA";//放大那個(gè)推送字段
    private Map<String, TemplateData> data;//推送文字
}
/*
* 設(shè)置推送的文字和顏色
* qcl 微信:2501902696
* */
@Data
public class TemplateData {
    //keyword1:訂單類型,keyword2:下單金額,keyword3:配送地址,keyword4:取件地址,keyword5備注
    private String value;//,,依次排下去
//    private String color;//字段顏色(微信官方已廢棄,設(shè)置沒有效果)
}

到這里請(qǐng)求推送的數(shù)據(jù)就組裝好了,解下來我們?nèi)?shí)現(xiàn)推送功能。
奧不對(duì),還有一個(gè)重要的字段需要獲取到:access_token

access_token的獲取

/*
    * 獲取access_token
    * appid和appsecret到小程序后臺(tái)獲取,當(dāng)然也可以讓小程序開發(fā)人員給你傳過來
    * */
    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();
    }

這次是真正的可以來請(qǐng)求微信服務(wù)器來實(shí)現(xiàn)消息推送了

/*
    * 微信小程序推送單個(gè)用戶
    * */
    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("小程序推送結(jié)果={}", responseEntity.getBody());
        return responseEntity.getBody();
    }

openid可以讓小程序開發(fā)人員給你傳過來,也可以自己獲取。
formid需要小程序開發(fā)給你傳過來,你也可以把formid存到數(shù)據(jù)庫里,什么時(shí)候需要直接拿出來用就可以了。
注意:formid必須和用戶openid對(duì)應(yīng)。

下面貼出來完整代碼

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.
 * 微信小程序推送服務(wù),
 * 包含獲取access_token的服務(wù)
 */
@Service
@Slf4j
public class WxPushServiceQcl {
    //用來請(qǐng)求微信的get和post
    @Autowired
    private RestTemplate restTemplate;


    /*
    * 微信小程序推送單個(gè)用戶
    * */
    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("小程序推送結(jié)果={}", responseEntity.getBody());
        return responseEntity.getBody();
    }

    /*
    * 獲取access_token
    * appid和appsecret到小程序后臺(tái)獲取,當(dāng)然也可以讓小程序開發(fā)人員給你傳過來
    * */
    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();
    }

}

在需要做推送的地方調(diào)用WxPushServiceQcl類中的pushOneUser方法,并傳入openid, formid參數(shù)即可。
小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_小程序消息推送_05
這是我推送成功后打印的log

下面來講小程序端開發(fā)需要做些什么

可以看出,我們的formid有效期是7天,并且一個(gè)form_id只能使用一次,所以我們小程序端所需要做的就是盡可能的多拿些formid,然后傳個(gè)后臺(tái),讓后臺(tái)存到數(shù)據(jù)庫中,這樣7天有效期內(nèi),想怎么用就怎么用了。

小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_小程序消息推送_06

所以接下來要講的就是小程序開發(fā)怎么盡可能多的拿到formid了。

小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_小程序模版消息推送_07
看下官方提供的,只有在表單提交時(shí)把report-submit設(shè)為true時(shí)才能拿到formid,比如這樣

 <form report-submit='true' >
   <button  form-type='submit'>獲取formid</button>
  </form>

所以我們就要在這里下功夫了,既然只能在form組件獲取,我們能不能把我們小程序里用到最多的地方用form來偽裝呢。
小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_小程序模版消息推送_08
我的小程序是跑腿小程序,消息也主要推送給跑腿員的,而跑腿員點(diǎn)擊最多的也就是這兩個(gè)條目,所以我們就用from組件來偽裝這兩個(gè)條目,讓用戶在點(diǎn)擊的同時(shí)就可以收集到用的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>

這樣就可以在用戶點(diǎn)擊條目時(shí),收集到用戶formid了
小程序消息推送(含源碼)java實(shí)現(xiàn)小程序推送,springboot實(shí)現(xiàn)微信消息推送_微信小程序推送_09
由于上面的botton有默認(rèn)樣式,所以我們就通過修改css來去除botton默認(rèn)樣式。

.button_item {
 width: 100%;
 display: flex;
 flex-direction: row;
 align-items: center;
 padding: 2px 20px;
 background: white;
 border-bottom: 1px solid gainsboro;
}
/* 主要通過這里去除botton默認(rèn)樣式 */
.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%;
}

到這里我們小程序端也圓滿完成自己的任務(wù)了。

補(bǔ)充知識(shí)點(diǎn)

這樣我們java后臺(tái)和小程序開發(fā)就可以開開心心的完成微信小程序的消息推送功能了。

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >