サービス通知を送信するためのミニ プログラムを実装するにはどうすればよいですか?
小さなプログラムを通じてユーザーにメッセージを送信するには、多くの検証が必要です。この要件に遭遇しただけでも、調査とテストに長い時間がかかる可能性があるため、次のロジックの完全なセットをコンパイルしました。今後の開発に向けて基礎からメッセージを送信 メッセージ通知機能でアイデアを提供し、学習時間を短縮
#テンプレートメッセージの送信は主に以下の部分で構成されます1. access_tokenWeChat へのメッセージ送信をリクエストする場合、ミニプログラムの ID カードに相当する access_token が必要になります。セキュリティ、WeChat は検証に時間制限のある ID 証明書である access_token を使用します。access_token は 2 時間のみ有効で、1 つのアプレットが access_token を要求できるのは 1 日に 1000 回だけです。そのため、可用性を確保するためのロジックのセットが必要です。 access_token のの取得
2. メッセージ テンプレートを作成します3. form_id を取得します4. メッセージ通知を送信します5. スケジュールされたタスクを設定します1. Get access_token
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
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で必ず使用されるトークンを取り出すことができます。メッセージテンプレートを作成します
テンプレートがありますミニ プログラム WeChat パブリック プラットフォームの左側の列にあるメッセージ タブ。文書に従ってテンプレート メッセージを追加して、対応するテンプレート ID を取得するだけです。このステップは基本的に Web ページによって操作され、それ以上の表示は行われません3. form_id の取得##ミニ プログラムがユーザーに過剰な操作を行わないようにするため、WeChat メッセージ通知にはメッセージ通知に関する制限があります。 、form_id または prepay_id が必要です
prepay_id は WeChat 支払いの使用後にユーザーによって返される ID であり、この記事では詳しく説明しません
form_id はボタンにバインドされる ID ですユーザーがバインドされたボタンをクリックするたびに、form_id が返されます。form_id の有効期間は 7 日間で、各ユーザーの form_id はそのユーザーに対してのみ使用できるため、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. メッセージ通知の送信
access_token と form_id が利用可能であることが保証されている場合、ユーザーにメッセージ通知を送信できます
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. スケジュールされたタスクの設定
上記の操作を確実にスムーズに進めるためには、メッセージの送信を支援するためにいくつかのスケジュールされたタスクを設定する必要があります。まず、いくつかのメソッドがあると仮定しましょう
getToken //トークンを更新します毎時delForm_id // 6 日前の form_id を 1 日 1 回削除します
message // 1 分ごとにメッセージを送信します
最初にサーバーに接続し、スケジュールされたタスクの設定
crontab -e
設定の各行はスケジュールされたタスクであり、3 つの部分に分かれています
1.* * * * * 这5个参数分别表示定时任务的执行时间,每个参数与上个参数隔一个空格,分别为(分)(时)(天)(月)(星期),下面举例子 * * * * *//每分钟执行一次 0 * * * *//每小时的第0分钟执行一次 */5 * * * *//每5分钟执行一次 * 23 * * *//每天的23点执行一次 * * 1 * *//每月1号执行一次 * * * */2 *//每2个月执行一次 0 0 * * 6//每周6的0点0分执行一次
2.
/usr/bin/phpこれは php 実行可能ファイルへのパスです。このパスに cd して php 実行可能ファイルへのパスを指定すると、php ファイルが実行されます。php ファイルがスケジュールされたタスクを設定できるかどうかをテストするために使用できます。
注意: このパスは単なるショートカットであり、実際の php 実行ファイルは
/usr/local/php/bin/php または /usr/local/php## にあります。 #(バージョン番号)
/bin/php、bin配下にショートカットが作成されていない場合は自分で作成してください
3./プロジェクトパス/実行ファイル
* */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
以上がサービス通知を送信するミニプログラムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。