本文是比較老得技術來實現,用最新技術實現小程序推送,請看
5行java代碼實現微信小程序模版消息推送 (含springboot後臺和小程序源碼)
也可以看最新的視頻講解:https://edu.csdn.net/course/detail/23750
最近需要開發微信和小程序的推送功能,需要用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%;
}
到這裏我們小程序端也圓滿完成自己的任務了。
補充知識點
這樣我們java後臺和小程序開發就可以開開心心的完成微信小程序的消息推送功能了。
如果有java或小程序相關的問題可以加我微信交流學習2501902696(備註小程序或java)
視頻講解:https://edu.csdn.net/course/detail/23750