?
最近需要開發(fā)微信和小程序的推送功能,需要用java后臺實現(xiàn)推送,自己本身java和小程序都做,所以就自己動手實現(xiàn)下小程序的模版推送功能推送。
實現(xiàn)思路
- 1 小程序獲取用戶openid,收集formid傳給java后臺
- 2 java推送消息給指定小程序用戶
老規(guī)矩,還是先看效果圖
我的這個是跑腿搶單推送,當(dāng)用戶新下單時,會給跑腿員推送消息。
下面開始講解實現(xiàn)步驟
一,微信小程序管理后臺開通模版推送
這里的模版id很重要,接下來我們推送的都是這個模版。
- 1 看微信官方推送消息所需要的字段
- 2 有了官方說明,我門接下來就去拿到官方所需要的這些字段,來組裝請求數(shù)據(jù)就可以了。
三,下面講解實現(xiàn)步驟
我的java后臺是基于springboot開發(fā)的,如果你不了解spring boot,建議你先去了解下springboot再回來接著學(xué)習(xí)。
還有RestTemplate是我們java后臺做get和post請求必須的,我們和微信服務(wù)器交互就用的RestTemplate
- 1 首先根據(jù)官方推送所需字段組裝java-bean
這里用到兩個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";//放大那個推送字段 private Map<String, TemplateData> data;//推送文字 }
/* * 設(shè)置推送的文字和顏色 * qcl 微信:2501902696 * */ @Data public class TemplateData { //keyword1:訂單類型,keyword2:下單金額,keyword3:配送地址,keyword4:取件地址,keyword5備注 private String value;//,,依次排下去 // private String color;//字段顏色(微信官方已廢棄,設(shè)置沒有效果) }
到這里請求推送的數(shù)據(jù)就組裝好了,解下來我們?nèi)崿F(xiàn)推送功能。
奧不對,還有一個重要的字段需要獲取到:access_token
access_token的獲取
/* * 獲取access_token * appid和appsecret到小程序后臺獲取,當(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(); }
這次是真正的可以來請求微信服務(wù)器來實現(xiàn)消息推送了
/* * 微信小程序推送單個用戶 * */ 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ù)庫里,什么時候需要直接拿出來用就可以了。
注意:formid必須和用戶openid對應(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 { //用來請求微信的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("小程序推送結(jié)果={}", responseEntity.getBody()); return responseEntity.getBody(); } /* * 獲取access_token * appid和appsecret到小程序后臺獲取,當(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ù)即可。
這是我推送成功后打印的log
可以看出,我們的formid有效期是7天,并且一個form_id只能使用一次,所以我們小程序端所需要做的就是盡可能的多拿些formid,然后傳個后臺,讓后臺存到數(shù)據(jù)庫中,這樣7天有效期內(nèi),想怎么用就怎么用了。
所以接下來要講的就是小程序開發(fā)怎么盡可能多的拿到formid了。
看下官方提供的,只有在表單提交時把report-submit設(shè)為true時才能拿到formid,比如這樣
<form report-submit='true' > <button form-type='submit'>獲取formid</button> </form>
所以我們就要在這里下功夫了,既然只能在form組件獲取,我們能不能把我們小程序里用到最多的地方用form來偽裝呢。
我的小程序是跑腿小程序,消息也主要推送給跑腿員的,而跑腿員點(diǎn)擊最多的也就是這兩個條目,所以我們就用from組件來偽裝這兩個條目,讓用戶在點(diǎn)擊的同時就可以收集到用的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)擊條目時,收集到用戶formid了
由于上面的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ǔ)充知識點(diǎn)
這樣我們java后臺和小程序開發(fā)就可以開開心心的完成微信小程序的消息推送功能了。
本文摘自 :https://blog.51cto.com/u