MsgDemo.php
5.9 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<?php
ini_set("display_errors", "on");
require_once dirname(__DIR__) . '/msg_sdk/vendor/autoload.php';
require_once __DIR__ . '/lib/TokenGetterForAlicom.php';
require_once __DIR__ . '/lib/TokenForAlicom.php';
use Aliyun\Core\Config;
use AliyunMNS\Exception\MnsException;
use AliyunMNS\Requests\BatchReceiveMessageRequest; // 批量拉取请求
// 加载区域结点配置
Config::load();
/**
* Class MsgDemo
*/
class MsgDemo
{
/**
* @var TokenGetterForAlicom
*/
static $tokenGetter = null;
public static function getTokenGetter() {
$accountId = "1943695596114318"; // 此处不需要替换修改!
// TODO 此处需要替换成开发者自己的AK (https://ak-console.aliyun.com/)
$accessKeyId = "LTAIogztSGFaqzyc"; // AccessKeyId
$accessKeySecret = "sCWqSkhjVIbVMAw4fQDgCDSzRDchpL"; // AccessKeySecret
if(static::$tokenGetter == null) {
static::$tokenGetter = new TokenGetterForAlicom(
$accountId,
$accessKeyId,
$accessKeySecret);
}
return static::$tokenGetter;
}
/**
* 获取消息
*
* @param string $messageType 消息类型
* @param string $queueName 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName<br/>(e.g. Alicom-Queue-xxxxxx-xxxxxReport)
* @param callable $callback <p>
* 回调仅接受一个消息参数;
* <br/>回调返回true,则工具类自动删除已拉取的消息;
* <br/>回调返回false,消息不删除可以下次获取.
* <br/>(e.g. function ($message) { return true; }
* </p>
*/
public static function receiveMsg($messageType, $queueName, callable $callback)
{
$i = 0;
// 取回执消息失败3次则停止循环拉取
while ( $i < 3)
{
try
{
// 取临时token
$tokenForAlicom = static::getTokenGetter()->getTokenByMessageType($messageType, $queueName);
// 使用MNSClient得到Queue
$queue = $tokenForAlicom->getClient()->getQueueRef($queueName);
// ------------------------------------------------------------------
// 1. 单次接收消息,并根据实际情况设置超时时间
$message = $queue->receiveMessage(2);
// 计算消息体的摘要用作校验
$bodyMD5 = strtoupper(md5(base64_encode($message->getMessageBody())));
// 比对摘要,防止消息被截断或发生错误
if ($bodyMD5 == $message->getMessageBodyMD5())
{
// 执行回调
if(call_user_func($callback, json_decode($message->getMessageBody())))
{
// 当回调返回真值时,删除已接收的信息
$receiptHandle = $message->getReceiptHandle();
$queue->deleteMessage($receiptHandle);
}
}
// ------------------------------------------------------------------
// ------------------------------------------------------------------
// 2. 批量接收消息
// $res = $queue->batchReceiveMessage(new BatchReceiveMessageRequest(10, 5)); // 每次拉取10条,超时等待时间5秒
// /* @var \AliyunMNS\Model\Message[] $messages */
// $messages = $res->getMessages();
// foreach($messages as $message) {
// // 计算消息体的摘要用作校验
// $bodyMD5 = strtoupper(md5(base64_encode($message->getMessageBody())));
// // 比对摘要,防止消息被截断或发生错误
// if ($bodyMD5 == $message->getMessageBodyMD5())
// {
// // 执行回调
// if(call_user_func($callback, json_decode($message->getMessageBody())))
// {
// // 当回调返回真值时,删除已接收的信息
// $receiptHandle = $message->getReceiptHandle();
// $queue->deleteMessage($receiptHandle);
// }
// }
// }
// ------------------------------------------------------------------
return; // 整个取回执消息流程完成后退出
}
catch (MnsException $e)
{
$i++;
echo "ex:{$e->getMnsErrorCode()}\n";
echo "ReceiveMessage Failed: {$e}\n";
}
}
}
}
// 调用示例:
header('Content-Type: text/plain; charset=utf-8');
echo "消息接口查阅短信状态报告返回结果:\n";
MsgDemo::receiveMsg(
// 消息类型,SmsReport: 短信状态报告
"SmsReport",
// 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
"Alicom-Queue-xxxxxxxx-SmsReport",
/**
* 回调
* @param stdClass $message 消息数据
* @return bool 返回true,则工具类自动删除已拉取的消息。返回false,消息不删除可以下次获取
*/
function ($message) {
print_r($message);
return false;
}
);
echo "消息接口查阅短信服务上行返回结果:\n";
MsgDemo::receiveMsg(
// 消息类型,SmsUp: 短信服务上行
"SmsUp",
// 在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
"Alicom-Queue-xxxxxxxx-SmsUp",
/**
* 回调
* @param stdClass $message 消息数据
* @return bool 返回true,则工具类自动删除已拉取的消息。返回false,消息不删除可以下次获取
*/
function ($message) {
print_r($message);
return false;
}
);