官方文檔:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html
1、登錄公眾號管理平台:廣告與服務 - 模板消息
在這里需要添加“消息模板”(這里是需要拿到模板 id 的),以及查看“模板消息接口文檔”,根據文檔去做后台開發即可。
模板庫里沒有合適的模板時,需要自己新建,等待審核周期有點長,7-15天,所以需要提前申請模板

2、前提條件:
(1)用戶需關注了你的微信公眾號
(2)你有用戶的 openId
3、如何確定發送給哪些人?
(1)如果你有關聯性的成員,比如問題,需要發送給該問題領域的技術專家去回答,那就直接取關聯的該領域的技術專家的 users 去遍歷發送訂閱消息即可
(2)如果沒有關聯性的成員,比如資訊或每日一題,怎么辦呢?
1. 可以在頁面放置微信公眾號的二維碼,讓用戶去掃碼
2. 掃碼進入公眾號,關注后,自動回復快捷鏈接

3. 點擊訂閱數據庫每日一題,即可進入每日一題頁面,給予按鈕進行訂閱(訂閱后在表里存儲訂閱的哪些用戶即可,在發送訂閱消息時,從這些用戶里去取即可)
4、具體開發步驟:
(1)Controller 層:聲明接口
@ApiOperation("發送每日一題微信提醒") @PreAuthorize("hasRole('sys')") @PostMapping("/dailys/{dailyId}/remind") public OperationInfo remindDaily(@PathVariable Integer dailyId) throws EmcsCustomException { dailyService.sendWxRemind(dailyId); return OperationInfo.success("發送訂閱消息成功"); }
(2)異步遍歷訂閱用戶發送消息提醒
@Async public void sendWxRemind(Integer dailyId) throws EmcsCustomException {
...... //獲取訂閱用戶
List<User> users = getSubscribedUsers(); if (users == null || users.isEmpty()) { log.error("每日一題訂閱用戶為空"); return; } users.forEach(user-> { wxService.sendLessonRemind(user, "每日一題更新啦", title, startTime, "點擊查看或退訂", null, pagePath); }); }
(3)如何發送,看文檔即可,比如這樣
public void sendEventStartRemind(User user, String title, String name, String time, String comment, String url) { ...... requestBody.put("template_id", "第一步的模板ID"); requestBody.put("url", url); requestBody.put("data", data); String accessToken = getAccessToken(WxPublicConfig.getInstance()).getAccess_token(); wechatApi.sendPublicTemplateMessage(accessToken, requestBody); }
這里比較重要的是第一步的模板id,以及 accessToken 的獲取,也有文檔
/** * 獲取微信token, 公眾號,開放號,小程序 */
private WxTokenVO getAccessToken(IWxConfig config) { WxTokenVO token = wechatApi.getAccessToken(config.getAppID(), config.getAppSecret()); if (token.getErrcode() != null && token.getErrcode() != 0) { log.error("獲取微信賬戶token異常: {}, code: {}, message: {}", config.getAppID(), token.getErrcode(), token.getErrmsg()); } log.info("獲取{}token: {}", config.getAppID(), JSON.toJSONString(token)); return token; }
下面就是按文檔用 OpenFeign 請求微信提供的接口去做對應事情即可,如這樣:
@FeignClient(name = "wechatApi", url = "https://api.weixin.qq.com") public interface WechatApi { /** * 獲取微信賬號access token, 公眾賬號,開放賬號,小程序賬號 * https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
*/ @RequestLine("GET /cgi-bin/token?grant_type=client_credential&appid={appId}&secret={appSecret}") WxTokenVO getAccessToken(@Param("appId") String appId, @Param("appSecret") String appSecret);/** * 發送微信公眾號模板消息 * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html
*/ @RequestLine("POST /cgi-bin/message/template/send?access_token={accessToken}") @Body("body") void sendPublicTemplateMessage(@Param("accessToken") String accessToken, JSONObject body); }
5、接收微信服務器返回
如果需要接收微信服務器的返回,然后根據發送消息是否發送成功,然后做一些自己的相關業務的話,就需要填寫這個回調地址(你可以把它理解為一個 api 接口,該接口必須是 public 完全公開的,這是供微信服務器去回調的)。
在微信公眾管理平台:設置與開發 - 基本配置 - 服務器配置,這里去進行回調地址配置。
具體如何做,看官方文檔:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html,這里需要注意的是第二步:需要驗證消息的確來自微信服務器,驗證成功之后才能去做自己平台相關的業務邏輯。
