如何实现小程序发送服务通知

如何实现小程序发送服务通知?

小程序给用户发送消息需要比较多的验证,刚刚遇到这个需求可能会花较长时间研究测试,所以从基础整理了一整套发送消息的逻辑,为以后开发消息通知功能提供思路,减少学习时间

发送模板消编程网点我wcqh.cn息主要有以下几个部分

一、获取access_token二、建立消息模板三、获取form_id四、发送消息通知五、设定定时任务一、获取access_token

向微信请求发送消息时,会需要到access_t编程网点我wcqh.cnoken,access_token相当于是小程序的身份证,虽然有appid和appsecret这2个证明,但是微信为了保证安全性,就用了access_token这个有时效的身份证明来验证,一条acce编程网点我wcqh.cnss_token只有2小时有效期,而且单个小程序1天只能请求1000次access_token,所以我们需要一套逻辑来保证access_token的可用性

1

https://api.weixin.qq.编程网点我wcqh.cncom/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

登录后复制

只需要向上面这个地址请求就可以返回对应的编程网点我wcqh.cnaccess_token

根据这个接口,写如下方法

1

2

3

4

5

6

7

8

public function test(){

$appId = '';

$appSecret = '';

$编程网点我wcqh.cntoken = file_get_contents(“https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appi编程网点我wcqh.cnd=”.$appId.”&secret=”.$appSecret);

$token = json_decode($token);

$token = $token->access_token;

db(&#39编程网点我wcqh.cn;token')->where('id',1)->update(['access_token'=>$token]);//覆盖上一条access_token

}

登录编程网点我wcqh.cn后复制

再设置一个定时器每小时触发一次该接口,之后就可以随意取出肯定能用的token了

1

2

$token = db('token')->find();

$token = $token[&#3编程网点我wcqh.cn9;access_token'];

登录后复制

二、建立消息模板

在小程序微信公众平台的左边栏有一个模板消息的选项卡,只需要按照文档添加一个模板消息,就可以得到对应的对应的模板ID,这一步基本都是网编程网点我wcqh.cn页自行操作,不作更多展示

三、获取form_id

微信为了防止小程序对用户进行过多消息通知,对消息通知进行了一个限制,每发送一条消息通知,就需要一条form_id或者prepay_id

prepay_id是编程网点我wcqh.cn用户在使用微信支付之后返回的Id,本文中不做详解

form_id是与button绑定的Id,每当用户点击绑定过的button就会返回一条form_id,一条form_id的有效期是7天,且每个用户的fo编程网点我wcqh.cnrm_id只能对该用户使用,所以我们需要一个专门的逻辑来保存和使用form_id

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

3编程网点我wcqh.cn5

36

37

38

39

40

41

42

43

44

45

46

47

48

①设计form_id表结构

form_id有2个条件,第一个是仅7天内有效,第二个是仅对创建form_id的用户有效,针对这2个要求建立如下表

创建时编程网点我wcqh.cn间用户id

idcreateTimeopenIdform_id

id作为主键自增不用解释

createTime作为找到过期form_id的标志,设置定时任务,删除过期form_id

openId用来找到用户自编程网点我wcqh.cn己的form_id来使用

②取到form_id

<!–pages/index/index.wxml–>

<form  report-submit=&#39;ture&#39; bindsubmit=&#编程网点我wcqh.cn39;form_id&#39;>

<button form-type=”submit”>确定</button>

</form>

// pages/index/index.js

form_id: functio编程网点我wcqh.cnn(e) {

wx.request({

url: &#39;test.com/index/index/form_id&#39;,//自行替换接口

method: “POST”,

data: {

form_id:编程网点我wcqh.cn e.detail.formId,

openId: openId//自行获取当前用户openId

},

header: {

&#39;content-type&#39;: &#39;application/x编程网点我wcqh.cn-www-form-urlencoded&#39;

}

})

},

//test.com/index/index/form_id

public function form_id(){

if (empty($_PO编程网点我wcqh.cnST)) {die;}

$form_id = $_POST[&#39;form_id&#39;];

if ($form_id == &#39;the formId is a mock one&#39;){编程网点我wcqh.cndie;}//过滤开发工具生成的form_id

$openId = $_POST[&#39;openId&#39;];

if (!$openId) {die;}

$data = compact(&#39;f编程网点我wcqh.cnorm_id&#39;,&#39;openId&#39;);

db(&#39;form_id&#39;)->insert($data);

}

③使用form_id

public function test()编程网点我wcqh.cn{

$openId = &#39;&#39;;

$form_id = db(&#39;form_id&#39;)->where(&#39;openId&#39;,$openId)->order(&#39;编程网点我wcqh.cnid&#39;)->field(&#39;form_id&#39;)->find();

$form_id = $form_id[&#39;form_id&#39;];

}

④定时删除过期form_id

pub编程网点我wcqh.cnlic function test(){

$time = time()-518400;//保证form_id可用性删除6天前的form_id

db(&#39;form_id&#39;)->where(&#编程网点我wcqh.cn39;createTime&#39;,&#39;<&#39;,$time)->delete();

//将该方法每天执行一次

}

登录后复制

四、发送消息通知

当access_token和form_id都保证可用编程网点我wcqh.cn之后,就可以给用户发送消息通知了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

4编程网点我wcqh.cn7

48

49

50

51

52

53

54

55

public function message($data){

//获取form_id

$form_id = db(&#39;form_id&#39;)->where(&编程网点我wcqh.cn#39;openId&#39;,$openId)->order(&#39;id&#39;)->find();

if (!$form_id) {die;}

$form_id = $form_id[&#39;编程网点我wcqh.cnform_id&#39;];

db(&#39;form_id&#39;)->where(&#39;form_id&#39;,$form_id)->delete();

//获取access_token

$ac编程网点我wcqh.cncess_token = db(&#39;token&#39;)->where(&#39;id&#39;,1)->find();

$access_token = $access_token[&#39;a编程网点我wcqh.cnccess_token&#39;];

//获取消息内容

$openId = $data[&#39;openId&#39;];

$title = $data[&#39;title&#39;];

$data1 =编程网点我wcqh.cn $data[&#39;data1&#39;];

$data2 = $data[&#39;data2&#39;];

$request_url=&#39;https://api.weixin.qq.com/编程网点我wcqh.cncgi-bin/message/wxopen/template/send?access_token=&#39;.$access_token;

$request_data=[

&#39;touser&#39编程网点我wcqh.cn; => $openId,

&#39;template_id&#39; => &#39;&#39;,//表id

&#39;page&#39;  =>  &#39;pages/test/test?data1编程网点我wcqh.cn=&#39;.$data1.&#39;&data2=&#39;.$data2,//本消息点击后跳转到的页面

“form_id”   =>  $form_id,

&#39;data&#39;  =>  [

&编程网点我wcqh.cn#39;keyword1&#39;  =>  [

&#39;value&#39; =>  $title

],

&#39;keyword2&#39;  =>  [

&#39;value&#39; =>  $da编程网点我wcqh.cnta1

],

&#39;keyword3&#39;  =>  [

&#39;value&#39; =>  $data2

]

],

&#39;emphasis_keyword&#39;  =>  “keyword1编程网点我wcqh.cn.DATA”//消息中要放大的内容

];

$return=json_decode($this->request($request_url,$request_data),true);//发送消息,并读取返回编程网点我wcqh.cn

return $return;

}

//上面的$this->request方法

public function request($url, $data=null)

{

$headers=array(&#39;编程网点我wcqh.cnContent-type:application/json;charset=UTF-8&#39;,&#39;Accept:application/json&#39;,&#39;Cache-Contro编程网点我wcqh.cnl:no-cache&#39;,&#39;Pragma:no-cache&#39;);

$curl=curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

c编程网点我wcqh.cnurl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

i编程网点我wcqh.cnf (!empty($data)) {

$data=json_encode($data);

curl_setopt($curl, CURLOPT_POST, 1);

curl_setopt($curl, C编程网点我wcqh.cnURLOPT_POSTFIELDS, $data);

}

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_编程网点我wcqh.cnHTTPHEADER, $headers);

$output=curl_exec($curl);

curl_close($curl);

return $output;

}

登录后复制

五、设定定时任务

为了保证上述编程网点我wcqh.cn操作都能顺利进行,我们需要设定几个定时任务来帮助消息发送,先假设有几个方法

getToken //每小时更新一次token

delForm_id //每天删除一次6天前的form_id

message //编程网点我wcqh.cn每分钟执行一次发送消息

首先连接上服务器打开定时任务设置

1

crontab -e

登录后复制

设置中的每一行就是一个定时任务,分成3个部分

1

2

3

4

5

6

7

8

9

1.* * * * *

这5个参数分别表示定时任务的执编程网点我wcqh.cn行时间,每个参数与上个参数隔一个空格,分别为(分)(时)(天)(月)(星期),下面举例子

* * * * *//每分钟执行一次

0 * * * *//每小时的第0分钟执行一次

*/5 * * * *//每5编程网点我wcqh.cn分钟执行一次

* 23 * * *//每天的23点执行一次

* * 1 * *//每月1号执行一次

* * * */2 *//每2个月执行一次

0 0 * * 6//每周6的0点0分执行一次

登录后复制

2./u编程网点我wcqh.cnsr/bin/php

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

注意,这个路径只是一个快捷方式,真正的php执行文件编程网点我wcqh.cn在/usr/local/php/bin/php或者/usr/local/php(版本号)/bin/php,如果在bin下没有创建快捷方式请自行创建

3./项目路径/执行文件

这是需要执行的php文件路径,编程网点我wcqh.cn如果写的是原生php,直接指到该文件即可,如果是用thinkphp框架写的,那需要指到根目录或者public目录下的index.php,后边跟上/模块/控制器/方法

知道这3点我们就可以写出上述3个定时编程网点我wcqh.cn任务

1

2

3

* */1 * * */usr/bin/php /项目路径/index.php /index/index/getToken

* 4 * * */usr/bin/php /项目路径/index.编程网点我wcqh.cnphp /index/index/delForm_id

* * * * */usr/bin/php /项目路径/index.php /index/index/message

登录后复制

最后,重启一下定时任编程网点我wcqh.cn

1

2

3

4

//CentOS5/CentOS6

/sbin/service crond restart

//CentOS7

/bin/systemctl restart crond.service

登录后复制

编程网点我wcqh.cn关推荐:小程序教程

以上就是如何实现小程序发送服务通知的详细内容,更多请关注php中文网其它相关文章!

© 版权声明
THE END
喜欢就支持一下吧
点赞749 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容