>  기사  >  위챗 애플릿  >  서비스 알림을 보내는 미니 프로그램을 구현하는 방법

서비스 알림을 보내는 미니 프로그램을 구현하는 방법

WJ
WJ원래의
2020-06-10 11:27:546430검색

서비스 알림을 보내는 미니 프로그램을 구현하는 방법

서비스 알림을 보내는 미니 프로그램을 구현하는 방법은 무엇입니까?

작은 프로그램을 통해 사용자에게 메시지를 보내려면 많은 검증이 필요합니다. 이 요구 사항에 직면하면 조사하고 테스트하는 데 오랜 시간이 걸릴 수 있으므로 메시지 보내기에 대한 완전한 논리 세트를 정리했습니다. 향후 메시지 알림 기능 개발을 위한 아이디어를 제공하기 위한 기본 사항입니다.

템플릿 메시지 전송은 주로 다음과 같은 부분으로 구성됩니다

1. access_token 가져오기

3. 메시지 템플릿 만들기

4. . 메시지 알림 보내기

5. 예약된 작업 설정

1. access_token 획득

위챗에 메시지 보내기를 요청할 때 access_token은 미니 프로그램의 ID 카드와 동일합니다. 인증서, appid 및 appsecret, WeChat은 보안을 보장하기 위해 access_token을 사용합니다. 이 시간 제한 ID 인증서는 확인에 사용됩니다. access_token은 2시간 동안만 유효하며 단일 애플릿은 하루에 1000번만 access_token을 요청할 수 있습니다. 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
}

그런 다음 매시간 인터페이스를 트리거하도록 타이머를 설정하세요 , 그러면 확실히 사용할 수 있는 토큰을 마음대로 꺼낼 수 있습니다

$token = db('token')->find();
$token = $token['access_token'];

2. 메시지 템플릿 만들기

미니 프로그램 위챗 공개 플랫폼의 왼쪽 열에 템플릿 메시지 탭이 있습니다. 해당 템플릿 ID를 얻으려면 문서에 따라 템플릿 메시지를 추가하세요. 이 단계는 기본적으로 웹 페이지 자체에서 수행되며 더 이상 표시되지 않습니다.

3. 미니 프로그램을 방지하기 위해. 너무 많은 메시지를 사용자에게 알리기 위해 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. 예약 설정 task

위 작업이 원활하게 진행되도록 하려면 메시지 전송에 도움이 되는 몇 가지 예약된 작업을 설정해야 합니다. 먼저 여러 메서드가 있다고 가정해 보겠습니다.

getToken //토큰은 매시간 업데이트됩니다.

delForm_id //6일 전 form_id를 하루에 한 번 삭제

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에 있습니다. code> 또는 <code>/usr/local/php(버전 번호)/bin/php, bin에 단축어가 생성되지 않은 경우 직접 생성해 주세요

/usr/bin/php

这是php执行文件的路径,如果cd到该路径,给出php执行文件路径就会执行php文件,可以用来测试php文件是否可以设置定时任务

注意,这个路径只是一个快捷方式,真正的php执行文件在/usr/local/php/bin/php或者/usr/local/php(版本号)/bin/php3./ 프로젝트 경로/실행 파일

실행해야 하는 PHP 파일 경로입니다. 네이티브 PHP를 작성하는 경우 파일을 직접 가리키면 됩니다. thinkphp 프레임워크를 사용하여 작성하는 경우 루트에서 index.php를 가리켜야 합니다. 디렉토리 또는 공용 디렉토리에 이어 /module/control Device/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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.