Comment implémenter un mini programme pour envoyer des notifications de service

WJ
Libérer: 2020-06-10 11:27:54
original
6522 Les gens l'ont consulté

Comment implémenter un mini programme pour envoyer des notifications de service

Comment implémenter le mini programme pour envoyer des notifications de service ?

L'envoi de messages aux utilisateurs via un petit programme nécessite beaucoup de vérification. Si vous venez de rencontrer cette exigence, vous risquez de passer beaucoup de temps à la rechercher et à la tester, j'ai donc trié un ensemble complet de logique d'envoi de messages à partir des bases pour le développement futur. La fonction de notification de message fournit des idées et réduit le temps d'apprentissage

L'envoi de messages modèles comprend principalement les parties suivantes

Obtenir un jeton d'accès

2. Créez un modèle de message

3. Obtenez form_id

4. Envoyer une notification par message

5. Obtenez access_token

Lorsque vous demandez à envoyer un message à WeChat, vous aurez besoin d'access_token, qui équivaut à la carte d'identité du mini programme, bien qu'il existe deux certificats, appid et appsecret, pour pouvoir le faire. Pour garantir la sécurité, WeChat utilise access_token, un certificat d'identité à durée limitée, pour la vérification, un access_token n'est valable que 2 heures et une seule applet ne peut demander access_token que 1 000 fois par jour, nous avons donc besoin d'un ensemble de logique pour garantir la sécurité. disponibilité du access_token

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
Copier après la connexion
Il vous suffit de demander l'adresse ci-dessus pour renvoyer le access_token correspondant

Selon cette interface, écrivez la méthode suivante

public function test(){
$appId = '';
$appSecret = '';
$token = file_get_contents("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret);
$token = json_decode($token);
$token = $token->access_token;
db('token')->where('id',1)->update(['access_token'=>$token]);//覆盖上一条access_token
}
Copier après la connexion

puis réglez une minuterie pour déclencher l'interface toutes les heures, et vous pourrez ensuite retirer le token qui sera sûrement utilisé à volonté

$token = db('token')->find();
$token = $token['access_token'];
Copier après la connexion

2 Créez un modèle de message

Il y a. un onglet de message modèle dans la colonne de gauche de la plateforme publique du mini programme WeChat. Il vous suffit d'ajouter un modèle de message selon le document pour obtenir l'ID de modèle correspondant correspondant, cette étape est essentiellement opérée par la page Web sans autre affichage

3. Obtenez form_id

Afin d'éviter que les mini-programmes n'en fassent trop aux utilisateurs, les notifications de message WeChat ont une restriction sur les notifications de message à chaque fois qu'une notification de message est envoyée. , un form_id ou prepay_id est requis

prepay_id est l'identifiant renvoyé par l'utilisateur après avoir utilisé le paiement WeChat, qui ne sera pas expliqué en détail dans cet article

form_id est l'identifiant lié au bouton . Chaque fois que l'utilisateur clique sur le bouton lié, un form_id sera renvoyé. La période de validité d'un form_id est de 7 jours, et le form_id de chaque utilisateur ne peut être utilisé que pour cet utilisateur, nous avons donc besoin d'une logique spéciale pour enregistrer et utiliser form_id<🎜. >
①设计form_id表结构
form_id有2个条件,第一个是仅7天内有效,第二个是仅对创建form_id的用户有效,针对这2个要求建立如下表
创建时间用户id
idcreateTimeopenIdform_id
id作为主键自增不用解释
createTime作为找到过期form_id的标志,设置定时任务,删除过期form_id
openId用来找到用户自己的form_id来使用
②取到form_id
<!--pages/index/index.wxml-->
<form  report-submit=&#39;ture&#39; bindsubmit=&#39;form_id&#39;>
    <button form-type="submit">确定</button>
</form>
// pages/index/index.js
form_id: function(e) {
    wx.request({
        url: &#39;test.com/index/index/form_id&#39;,//自行替换接口
        method: "POST",
        data: {
            form_id: e.detail.formId,
            openId: openId//自行获取当前用户openId
        },
        header: {
            &#39;content-type&#39;: &#39;application/x-www-form-urlencoded&#39;
        }
    })
},
//test.com/index/index/form_id
public function form_id(){
    if (empty($_POST)) {die;}
    $form_id = $_POST[&#39;form_id&#39;];
    if ($form_id == &#39;the formId is a mock one&#39;){die;}//过滤开发工具生成的form_id
    $openId = $_POST[&#39;openId&#39;];
    if (!$openId) {die;}
    $data = compact(&#39;form_id&#39;,&#39;openId&#39;);
    db(&#39;form_id&#39;)->insert($data);
}
③使用form_id
public function test(){
    $openId = &#39;&#39;;
    $form_id = db(&#39;form_id&#39;)->where(&#39;openId&#39;,$openId)->order(&#39;id&#39;)->field(&#39;form_id&#39;)->find();
    $form_id = $form_id[&#39;form_id&#39;];
}
④定时删除过期form_id
public function test(){
    $time = time()-518400;//保证form_id可用性删除6天前的form_id
    db(&#39;form_id&#39;)->where(&#39;createTime&#39;,&#39;<&#39;,$time)->delete();
    //将该方法每天执行一次
}
Copier après la connexion

4. Envoyer une notification par message

Lorsque access_token et form_id sont tous deux garantis disponibles, vous pouvez envoyer une notification par message à l'utilisateur

public function message($data){
    //获取form_id
    $form_id = db(&#39;form_id&#39;)->where(&#39;openId&#39;,$openId)->order(&#39;id&#39;)->find();
    if (!$form_id) {die;}
    $form_id = $form_id[&#39;form_id&#39;];
    db(&#39;form_id&#39;)->where(&#39;form_id&#39;,$form_id)->delete();
    //获取access_token
    $access_token = db(&#39;token&#39;)->where(&#39;id&#39;,1)->find();
    $access_token = $access_token[&#39;access_token&#39;];
    //获取消息内容
    $openId = $data[&#39;openId&#39;];
    $title = $data[&#39;title&#39;];
    $data1 = $data[&#39;data1&#39;];
    $data2 = $data[&#39;data2&#39;];
    $request_url=&#39;https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=&#39;.$access_token;
    $request_data=[
        &#39;touser&#39; => $openId,
        &#39;template_id&#39; => &#39;&#39;,//表id
        &#39;page&#39;  =>  &#39;pages/test/test?data1=&#39;.$data1.&#39;&data2=&#39;.$data2,//本消息点击后跳转到的页面
        "form_id"   =>  $form_id,
        &#39;data&#39;  =>  [
            &#39;keyword1&#39;  =>  [
                &#39;value&#39; =>  $title
            ],
            &#39;keyword2&#39;  =>  [
                &#39;value&#39; =>  $data1
            ],
            &#39;keyword3&#39;  =>  [
                &#39;value&#39; =>  $data2
            ]
        ],
        &#39;emphasis_keyword&#39;  =>  "keyword1.DATA"//消息中要放大的内容
    ];
    $return=json_decode($this->request($request_url,$request_data),true);//发送消息,并读取返回值
    return $return;
}
//上面的$this->request方法
public function request($url, $data=null)
{
    $headers=array(&#39;Content-type:application/json;charset=UTF-8&#39;,&#39;Accept:application/json&#39;,&#39;Cache-Control:no-cache&#39;,&#39;Pragma:no-cache&#39;);
    $curl=curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    if (!empty($data)) {
        $data=json_encode($data);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    $output=curl_exec($curl);
    curl_close($curl);
    return $output;
}
Copier après la connexion

5. >

Afin de garantir le bon déroulement des opérations ci-dessus, nous devons configurer plusieurs tâches planifiées pour faciliter l'envoi de messages

getToken //Update. jeton toutes les heures

delForm_id //Supprimer form_id il y a 6 jours une fois par jour

message //Envoyer un message une fois par minute

Connectez-vous d'abord au serveur et ouvrez les paramètres de la tâche planifiée

crontab -e
Copier après la connexion

Chaque ligne dans les paramètres est une tâche planifiée, divisée en 3 parties

1.* * * * *
这5个参数分别表示定时任务的执行时间,每个参数与上个参数隔一个空格,分别为(分)(时)(天)(月)(星期),下面举例子
* * * * *//每分钟执行一次
0 * * * *//每小时的第0分钟执行一次
*/5 * * * *//每5分钟执行一次
* 23 * * *//每天的23点执行一次
* * 1 * *//每月1号执行一次
* * * */2 *//每2个月执行一次
0 0 * * 6//每周6的0点0分执行一次
Copier après la connexion
2.

C'est l'exécution PHP Le chemin de le fichier. Si cd vers ce chemin, le fichier php sera exécuté si le chemin vers le fichier d'exécution php est donné. Il peut être utilisé pour tester si le fichier php peut configurer des tâches planifiées

Notez que cela. le chemin n'est qu'un raccourci, le vrai Le fichier exécutable php est dans /usr/bin/php ou

(numéro de version)

S'il n'y a pas de raccourci créé sous bin, veuillez le créer vous-même

3. /Chemin du projet/fichier d'exécution /usr/local/php/bin/php/usr/local/php Il s'agit du chemin d'accès au fichier PHP qui doit être exécuté. Si vous écrivez du PHP natif, pointez simplement vers le fichier directement. Si vous écrivez en utilisant le framework thinkphp, vous. il faut pointer vers index.php dans le répertoire racine ou le répertoire public, suivi de /Module/Controller/Method/bin/php

Connaissant ces 3 points, nous pouvons écrire les 3 tâches planifiées ci-dessus

* */1 * * */usr/bin/php /项目路径/index.php /index/index/getToken
* 4 * * */usr/bin/php /项目路径/index.php /index/index/delForm_id
* * * * */usr/bin/php /项目路径/index.php /index/index/message
Copier après la connexion

Enfin , redémarrez la tâche planifiée

//CentOS5/CentOS6
/sbin/service crond restart
//CentOS7
/bin/systemctl restart crond.service
Copier après la connexion
Recommandations associées :

Tutoriel du mini programme

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal