ホームページ  >  記事  >  WeChat アプレット  >  サービス通知を送信するミニプログラムを実装する方法

サービス通知を送信するミニプログラムを実装する方法

WJ
WJオリジナル
2020-06-10 11:27:546430ブラウズ

サービス通知を送信するミニプログラムを実装する方法

サービス通知を送信するためのミニ プログラムを実装するにはどうすればよいですか?

小さなプログラムを通じてユーザーにメッセージを送信するには、多くの検証が必要です。この要件に遭遇しただけでも、調査とテストに長い時間がかかる可能性があるため、次のロジックの完全なセットをコンパイルしました。今後の開発に向けて基礎からメッセージを送信 メッセージ通知機能でアイデアを提供し、学習時間を短縮

#テンプレートメッセージの送信は主に以下の部分で構成されます

1. access_token

の取得

2. メッセージ テンプレートを作成します

3. form_id を取得します

4. メッセージ通知を送信します

5. スケジュールされたタスクを設定します

1. Get access_token

WeChat へのメッセージ送信をリクエストする場合、ミニプログラムの ID カードに相当する access_token が必要になります。セキュリティ、WeChat は検証に時間制限のある ID 証明書である access_token を使用します。access_token は 2 時間のみ有効で、1 つのアプレットが access_token を要求できるのは 1 日に 1000 回だけです。そのため、可用性を確保するためのロジックのセットが必要です。 access_token の

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

対応する access_token を返すには、上記のアドレスをリクエストするだけです

このインターフェイスに従って、次のメソッドを記述します

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
}

次に、トリガーするタイマーを設定します1時間ごとにインターフェイスを更新し、意志

$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=&#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();
    //将该方法每天执行一次
}

4. メッセージ通知の送信

access_token と form_id が利用可能であることが保証されている場合、ユーザーにメッセージ通知を送信できます

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;
}

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./プロジェクトパス/実行ファイル

これ実行する必要がある php ファイルへのパスです (記述されている場合) ネイティブ PHP です。ファイルを直接指定するだけです。thinkphp フレームワークを使用して記述されている場合は、ルート ディレクトリまたはパブリックのindex.php を指定する必要がありますディレクトリ、/module/controller/method

これら 3 つの点を理解すると、上記の 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。