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
Il vous suffit de demander l'adresse ci-dessus pour renvoyer le access_token correspondantSelon cette interface, écrivez la méthode suivanteObtenir un jeton d'accès
2. Créez un modèle de message3. Obtenez form_id4. Envoyer une notification par message5. Obtenez access_tokenLorsque 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=APPSECRETCopier après la connexion
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 }
$token = db('token')->find(); $token = $token['access_token'];
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='ture' bindsubmit='form_id'> <button form-type="submit">确定</button> </form> // pages/index/index.js form_id: function(e) { wx.request({ url: 'test.com/index/index/form_id',//自行替换接口 method: "POST", data: { form_id: e.detail.formId, openId: openId//自行获取当前用户openId }, header: { 'content-type': 'application/x-www-form-urlencoded' } }) }, //test.com/index/index/form_id public function form_id(){ if (empty($_POST)) {die;} $form_id = $_POST['form_id']; if ($form_id == 'the formId is a mock one'){die;}//过滤开发工具生成的form_id $openId = $_POST['openId']; if (!$openId) {die;} $data = compact('form_id','openId'); db('form_id')->insert($data); } ③使用form_id public function test(){ $openId = ''; $form_id = db('form_id')->where('openId',$openId)->order('id')->field('form_id')->find(); $form_id = $form_id['form_id']; } ④定时删除过期form_id public function test(){ $time = time()-518400;//保证form_id可用性删除6天前的form_id db('form_id')->where('createTime','<',$time)->delete(); //将该方法每天执行一次 }
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('form_id')->where('openId',$openId)->order('id')->find(); if (!$form_id) {die;} $form_id = $form_id['form_id']; db('form_id')->where('form_id',$form_id)->delete(); //获取access_token $access_token = db('token')->where('id',1)->find(); $access_token = $access_token['access_token']; //获取消息内容 $openId = $data['openId']; $title = $data['title']; $data1 = $data['data1']; $data2 = $data['data2']; $request_url='https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$access_token; $request_data=[ 'touser' => $openId, 'template_id' => '',//表id 'page' => 'pages/test/test?data1='.$data1.'&data2='.$data2,//本消息点击后跳转到的页面 "form_id" => $form_id, 'data' => [ 'keyword1' => [ 'value' => $title ], 'keyword2' => [ 'value' => $data1 ], 'keyword3' => [ 'value' => $data2 ] ], 'emphasis_keyword' => "keyword1.DATA"//消息中要放大的内容 ]; $return=json_decode($this->request($request_url,$request_data),true);//发送消息,并读取返回值 return $return; } //上面的$this->request方法 public function request($url, $data=null) { $headers=array('Content-type:application/json;charset=UTF-8','Accept:application/json','Cache-Control:no-cache','Pragma:no-cache'); $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; }
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 messagesgetToken //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 minute2.Connectez-vous d'abord au serveur et ouvrez les paramètres de la tâche planifiée
crontab -eCopier après la connexionChaque 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
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
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
* */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
//CentOS5/CentOS6 /sbin/service crond restart //CentOS7 /bin/systemctl restart crond.service
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!