Heim > Backend-Entwicklung > PHP-Tutorial > Ermöglichen Sie den uneingeschränkten und unbegrenzten aktiven Push von WeChat-Miniprogramm-Vorlagennachrichten

Ermöglichen Sie den uneingeschränkten und unbegrenzten aktiven Push von WeChat-Miniprogramm-Vorlagennachrichten

韦小宝
Freigeben: 2023-03-20 16:10:01
Original
9538 Leute haben es durchsucht

Anforderungshintergrund

Basierend auf WeChat-Benachrichtigungskanälen bieten WeChat-Miniprogramme Entwicklern Vorlagennachrichtenfunktionen, mit denen Benutzer effizient erreicht werden können, sodass Benutzer mit der Miniprogrammseite interagieren können. Ausgelöst nach dem Verhalten können Sie über die Dienstbenachrichtigung in der WeChat-Chatliste schnell auf die Nachricht zugreifen. Klicken Sie hier, um die Details anzuzeigen und zur angegebenen Seite des Miniprogramms zu springen, das die Nachricht gesendet hat.

Die Bedingungen für das WeChat-Applet, die die Ausgabe von Vorlagennachrichten ermöglichen, sind in zwei Kategorien unterteilt: Zahlung oder Formularübermittlung. Die Einschränkung beim Senden von Vorlagennachrichten durch das Absenden eines Formulars lautet: „Entwicklern erlauben, eine begrenzte Anzahl von Vorlagennachrichten innerhalb von 7 Tagen an Benutzer zu senden (eine Nachricht kann gesendet werden, sobald ein Formular gesendet wurde, und die Anzahl der mehrmals gesendeten Nachrichten ist unabhängig und beeinflussen sich nicht gegenseitig) ".

Allerdings reicht es offensichtlich nicht aus, dass ein Benutzer einmal und innerhalb von 7 Tagen eine Benachrichtigung sendet. Die Check-in-Funktion verwendet beispielsweise das Pushen von Vorlagennachrichten, um Benutzer daran zu erinnern, jeden Tag einzuchecken. Sie kann die Vorlagenachricht nur einmal pushen, wenn der Benutzer am Vortag eingecheckt hat, und sie dann zum Senden verwenden Check-in-Erinnerungen für den Benutzer am nächsten Tag. Wenn ein Benutzer jedoch an einem bestimmten Tag vergisst, sich anzumelden, verliert das System die Befugnis, den Benutzer daran zu erinnern, was dazu führt, dass die Verbindung zum Benutzer getrennt wird. Beispielsweise möchte das System den Benutzer proaktiv darüber informieren Wenn Sie gerade eine bestimmte Aktivität ausführen, das WeChat-Applet jedoch passiv das Benachrichtigungslimit auslöst, kann das System keine Nachrichten aktiv senden.

Wie kann verhindert werden, dass der Vorlagen-Nachrichten-Push eingeschränkt wird?

Durchbruch: „Eine Formularübermittlung kann eine Nachricht ausgeben, und mehrere Übermittlungen können unabhängige Nummern ausgeben, ohne sich gegenseitig zu beeinflussen.“

Um das Push-Limit von Vorlagennachrichten zu durchbrechen , implementieren Sie können innerhalb von 7 Tagen nach Belieben pushen, solange Sie genügend Push-Codes sammeln. Dies ist die Formular-ID, die Sie jedes Mal erhalten, wenn Sie ein Formular senden. Eine formId stellt die einmalige Berechtigung des Entwicklers dar, Vorlagennachrichten an den aktuellen Benutzer zu senden.

Kunde

Push-Code sammeln

Wenn das Attribut report-submit=true in der Formularkomponente Es bedeutet, eine Vorlagennachricht zu senden, und Sie können die Formular-ID erhalten, indem Sie das Formular absenden. Als nächstes müssen wir nur die Originalseite ändern und die Schnittstelle, an der der Benutzer ursprünglich das Klickereignis gebunden hat, durch die Schaltflächenkomponente Schaltflächengruppe in der Formularkomponente ersetzen, dh das Bindtap-Ereignis der interaktiven Benutzeroberfläche click wird durch das Formular bindsubmit ersetzt. Erfassen Sie stattdessen das Klickereignis des Benutzers, um weitere Push-Codes zu generieren.

// 收集推送码
Page({
   formSubmit: funcition(e) {
let formId = e.detail.formId;
this.collectFormIds(formId); //保存推送码
let type = e.detail.target.dataset.type; // 根据type执行点击事件
},

   collectFormIds: function(formId) { 
let formIds = app.globalData.globalFormIds; // 获取全局推送码数组
if (!formIds)
           formIds = [];
let data = {
           formId: formId,
           expire: new Data().getTime() + 60480000 // 7天后的过期时间戳
}
       formIds.push(data);
       app.globalData.globalFormIds = formIds;
},
})
Nach dem Login kopieren

Push-Code melden

Wenn der Benutzer das nächste Mal eine Netzwerkanfrage initiiert, werden die globalFormIds an den Server gesendet.

// 上报推送码
Page({
   onLoad: funcition(e) {
this.uploadFormIds(); //上传推送码
},

   collectFormIds: function(formId) { 
var formIds = app.globalData.globalFormIds; // 获取全局推送码
if (formIds.length) {
            formIds = JSON.stringify(formIds); // 转换成JSON字符串
            app.globalData.gloabalFomIds = ''; // 清空当前全局推送码
}
       wx.request({ // 发送到服务器
           url: 'http://xxx',
           method: 'POST',
           data: {
               openId: 'openId',
               formIds: formIds
},
           success: function(res) {
}
});
},
})
Nach dem Login kopieren

Serverseitig

Push-Codes speichern

Hochfrequenz-IO, Verwendung von Redis zum Speichern von Push-Codes.

/**
* 收集用户推送码
*
* @param openId        用户的openid
* @param formTemplates 用户的表单模板
*/
public void collect(String openId, List<FormTemplateVO> formTemplates) {
   redisTemplate.opsForList().rightPushAll("mina:openid:" + openId, formTemplates);
}
Nach dem Login kopieren

Push-Vorlagennachricht

Im Folgenden wird die Funktion des Gruppenversands implementiert, die für bestimmte Benutzer ähnlich ist.

/**
* 推送消息
*
* @param templateId 模板消息id
* @param page       跳转页面
* @param keyWords   模板内容
*/
public void push(String templateId, String page, String keyWords) {
String logPrefix = "推送消息";

// 获取access token
String accessToken = this.getAccessToken();

// 创建消息通用模板
MsgTemplateVO msgTemplateVO = MsgTemplateVO.builder().template_id(templateId).build();
// 跳转页面
   msgTemplateVO.setPage(StringUtils.isNotBlank(page) ? page : "");
// 模板内容
if (StringUtils.isNotBlank(keyWords)) {
String[] keyWordArr = keyWords.split(BaseConsts.COMMA_STR);
Map<String, MsgTemplateVO.KeyWord> keyWordMap = new HashMap<>(8);
for (int i = 0; i < keyWordArr.length; i++) {
MsgTemplateVO.KeyWord keyWord = msgTemplateVO.new KeyWord(keyWordArr[i]);
           keyWordMap.put(MsgTemplateVO.KEYWORD + (i + 1), keyWord);
}
       msgTemplateVO.setData(keyWordMap);
} else {
       msgTemplateVO.setData(Collections.emptyMap());
}

// 获取所有用户
List<String> openIdList = minaRedisDao.getAllOpenIds();

for (String openId : openIdList) {
// 获取有效推送码
String formId = minaRedisDao.getValidFormId(openId);
if (StringUtils.isBlank(formId)) {
           LOGGER.error("{}>>>openId={}>>>已无有效推送码[失败]", logPrefix, openId);
continue;
}

// 指派消息
MsgTemplateVO assignMsgTemplateVO = msgTemplateVO.assign(openId, formId);

// 发送消息
Map<String, Object> resultMap;
try {
String jsonBody = JsonUtils.getObjectMapper().writeValueAsString(assignMsgTemplateVO);

String resultBody = OkHttpUtils.getInstance().postAsString(messageUrl + accessToken, jsonBody);
           resultMap = JsonUtils.getObjectMapper().readValue(resultBody, Map.class);
} catch (IOException e) {
           LOGGER.error("{}>>>openId={}>>>{}[失败]", logPrefix, openId, e.getMessage(), e);
continue;
}

if ((int) resultMap.get(ResponseConsts.Mina.CODE) != 0) {
           LOGGER.error("{}>>>openId={}>>>{}[失败]", logPrefix, openId, resultMap.get(ResponseConsts.Mina.MSG));
continue;
}

       LOGGER.info("{}>>>openId={}>>>[成功]", logPrefix, openId);
}
}

/**
* 根据用户获取有效的推送码
*
* @param openId 用户的openid
* @return 推送码
*/
public String getValidFormId(String openId) {
List<FormTemplateVO> formTemplates = redisTemplate.opsForList().range("mina:openid:" + openId, 0, -1);

String validFormId = "";
int trimStart = 0;

int size;
for (int i = 0; i < (size = formTemplates.size()); i++) {
if (formTemplates.get(i).getExpire() > System.currentTimeMillis()) {
           validFormId = formTemplates.get(i).getFormId();
           trimStart = i + 1;
break;
}
}

// 移除本次使用的和已过期的
   redisTemplate.opsForList().trim(KEY_MINA_PUSH + openId, trimStart == 0 ? size : trimStart, -1);

return validFormId;
}
Nach dem Login kopieren

Die obige Lösung kann mehrere Vorlagennachrichten an den Benutzer senden, um den Benutzer innerhalb von 7 Tagen nach der letzten Verwendung des Miniprogramms zurückzurufen.

Hier finden Sie alle Details dazu, wie Sie einen uneingeschränkten und unbegrenzten aktiven Push von WeChat-Miniprogramm-Vorlagennachrichten erreichen.

Verwandte Artikel:

WeChat-Applet-Nachrichten-Push-PHP-Serverüberprüfung

Das obige ist der detaillierte Inhalt vonErmöglichen Sie den uneingeschränkten und unbegrenzten aktiven Push von WeChat-Miniprogramm-Vorlagennachrichten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage