小程式訂閱訊息推送
小程式訂閱訊息推送
最近在做微信小程式的專案,有一個功能是使用者註冊,在後臺稽核後進行使用者的訊息推送,告知使用者是否稽核通過
先看效果圖:
大概就是這樣的,可以先看一下官方文件是怎麼介紹訊息推送的介面的,詳情可看:
通過文件我們可以知道請求訊息推送的介面主要要拿到使用者的openId和access_token,然後寫入模板等資訊,呼叫推送介面即可,具體步驟如下:
獲取使用者的openId
關於獲取使用者的openId這裡不做說明,詳情可以檢視微信小程式的官方文件的方法
獲取access_token
使用者的access_token是微信小程式給我們的一個介面呼叫憑證,呼叫絕大多數後臺介面時都需使用 access_token,開發者需要進行妥善儲存,微信官方文件給出的意見是最好在中控伺服器中同統一進行獲取和重新整理,因此在本專案中也是通過中控服務統一獲取access_token,程式碼中不多贅述access_token的獲取方法,詳情可看官方文件。
程式碼的編寫
看官方文件給出的例項,除了openId和access_token是我們要主動去進行獲取以外,還有其他的引數
{ "touser": "OPENID", "template_id": "TEMPLATE_ID", "page": "index", "miniprogram_state":"developer", "lang":"zh_CN", "data": { "number01": { "value": "339208499" }, "date01": { "value": "2015年01月05日" }, "site01": { "value": "TIT創意園" } , "site02": { "value": "廣州市新港中路397號" } } }
template_id:是所需下方的模板id,必填項
page:是點選模板卡片後的跳轉頁面,僅限本小程式內的頁面。支援帶引數,(示例index?foo=bar)。該欄位不填則模板無跳轉,非必填項。
data:是模板內容,也就是上圖我所擷取的文字內容,必填項。
miniprogram_state:跳轉小程式型別:developer為開發版;trial為體驗版;formal為正式版;預設為正式版,非必填。
lang: 進入小程式檢視”的語言型別,支援zh_CN(簡體中文)、en_US(英文)、zh_HK(繁體中文)、zh_TW(繁體中文),預設為zh_CN,非必填。
介面返回為Json格式的資料包:
話不多說可以看程式碼:
定義一個介面:
實體類:
詳細程式碼如下:
contoller層
/**
* 訊息推送
* @author yedan
* @date 2020/7/30 16:52
* @param openId openId
* @return com.anso.common.result.BaseResult
*/
@GetMapping("/pushOneUser")
public BaseResult pushOneUser(@RequestParam("openId") String openId) {
return new BaseResult<>(userRegisterAuditService.push(openId));
}
實現層:
@Override
public Object push(String openId) {
RestTemplate restTemplate = new RestTemplate();
//中控獲取access_token
AccessToken accessToken = WechatClient.getAccessToken("006");
SendData sendData = new SendData();
sendData.setAccessToken(accessToken.getAccessToken());
//模板id
sendData.setTemplate_id("EwptsdkNpyXylTwvVFtb379aia1h-8udIytP9og5E2s");
//openId
sendData.setTouser(openId);
//新增模板內容
Map<String, TemplateData> map = new HashMap<>();
map.put("phrase2", new TemplateData("稽核通過"));
map.put("time3", new TemplateData(DateUtils.formatToStr(new Date())));
map.put("thing5", new TemplateData("填寫資訊成功"));
sendData.setData(map);
String url = String.format(FETCH_ACCESS_TOKEN_URL_PATTERN, accessToken.getAccessToken());
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, sendData, String.class);
String resultStr = responseEntity.getBody();
JSONObject jsonObject = JSONObject.parseObject(resultStr);
System.out.println(jsonObject.toJSONString());
return responseEntity.getBody();
}
以上便是訊息推送的方法。