Maison  >  Article  >  développement back-end  >  Réalisez une diffusion active sans restriction et illimitée des messages de modèle de mini-programme WeChat

Réalisez une diffusion active sans restriction et illimitée des messages de modèle de mini-programme WeChat

韦小宝
韦小宝original
2018-03-01 14:55:599427parcourir

Contexte des exigences

Basés sur les canaux de notification WeChat, les mini-programmes WeChat fournissent aux développeurs des capacités de message modèle qui peuvent atteindre efficacement les utilisateurs, permettant aux utilisateurs d'interagir avec la page du mini-programme Déclenché après le comportement, vous pouvez accéder rapidement au message via la notification de service dans la liste de discussion WeChat. Cliquez pour afficher les détails et accéder à la page désignée du mini programme qui a envoyé le message.

Les conditions permettant à l'applet WeChat de permettre l'émission de modèles de messages sont divisées en deux catégories : paiement ou soumission de formulaire. La restriction sur l'envoi de modèles de messages en soumettant un formulaire est "Autoriser les développeurs à envoyer un nombre limité de modèles de messages aux utilisateurs dans les 7 jours (un message peut être envoyé une fois qu'un formulaire est soumis, et le nombre de messages soumis plusieurs fois est indépendant et ne s'affectent pas) ".

Cependant, il ne suffit évidemment pas qu'un utilisateur envoie une notification une seule fois et dans un délai de 7 jours. Par exemple, la fonction d'enregistrement utilise la transmission de modèles de messages pour rappeler aux utilisateurs de s'enregistrer tous les jours. Elle ne peut avoir la possibilité de transmettre le modèle de message qu'une seule fois lorsque l'utilisateur s'est enregistré la veille, puis de l'utiliser pour l'envoyer. rappels d'enregistrement à l'utilisateur le lendemain. Cependant, dans de nombreux cas, si un utilisateur oublie de se connecter un certain jour, le système perd le pouvoir de rappeler à l'utilisateur, ce qui entraîne une déconnexion avec l'utilisateur. Dans un autre exemple, le système souhaite informer l'utilisateur de manière proactive ; sur le point d'effectuer une certaine activité, mais que l'applet WeChat déclenche passivement la limite de notification, le système ne pourra pas envoyer activement de messages.

Comment empêcher la diffusion de modèles de messages d'être restreinte ?

Percée : "Une soumission de formulaire peut émettre un message, et plusieurs soumissions peuvent émettre des numéros indépendants sans s'affecter les unes les autres

Afin de dépasser la limite de poussée des modèles de messages." , implémentez Vous pouvez pousser à volonté dans les 7 jours, à condition de collecter suffisamment de codes push, qui est le formId obtenu à chaque fois que vous soumettez un formulaire. Un formId représente l'autorisation unique du développeur de transmettre des modèles de messages à l'utilisateur actuel.

Client

Collecter le code push

Lorsque l'attribut report-submit=true dans le composant de formulaire Il signifie envoyer un modèle de message, et vous pouvez obtenir le formId en soumettant le formulaire. Ensuite, il nous suffit de modifier la page d'origine et de remplacer l'interface dans laquelle l'utilisateur a initialement lié l'événement de clic par le composant boutongroupe de boutons dans le composant de formulaire, c'est-à-dire l'événement bindtap de l'interface interactive de l'utilisateur. click est remplacé par le formulaire bindsubmit. Capturez plutôt l'événement de clic de l'utilisateur pour générer davantage de codes push.

// 收集推送码
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;
},
})

Code push de rapport

En attendant la prochaine fois que l'utilisateur lance une requête réseau, les globalFormIds seront envoyés au serveur.

// 上报推送码
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) {
}
});
},
})

Côté serveur

Stockage des codes push

E/S haute fréquence, utilisant Redis pour stocker les codes push.

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

Modèle de message push

Ce qui suit implémente la fonction d'envoi de groupe, qui est similaire pour des utilisateurs spécifiques.

/**
* 推送消息
*
* @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;
}

La solution ci-dessus peut envoyer plusieurs modèles de messages à l'utilisateur pour rappeler l'utilisateur dans les 7 jours suivant la dernière utilisation du mini-programme par l'utilisateur.

Voici tous les détails sur la façon d'obtenir une diffusion active sans restriction et illimitée des messages de modèle de mini-programme WeChat.

Articles connexes :

Le message de l'applet WeChat pousse la vérification du serveur php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn