Nexmo API短信发送收据
我正在使用laravel Notifications向我的应用程序的注册用户发送文本消息。
我最初使用默认的Nexmo频道,但自此创建了我自己的频道以排除任何问题。
我将每条消息存储在数据库中,每条消息都有一个'messages'数组列,其中包含Nexmo发送的每条物理消息的JSON响应信息。
例如。
[{"to":"441122334455","message-id":"0B00000099A49D63","status":"0","remaining-balance":"7.00500000","message-price":"0.03330000","network":"23410"}]
我的自定义SMS通道如下
namespace AppNotificationsChannels;
use IlluminateNotificationsNotification;
use NexmoLaravelFacadeNexmo;
class CustomSmsChannel
{
/**
* Send the given notification.
*
* @param mixed $notifiable
* @param IlluminateNotificationsNotification $notification
* @return void
*/
public function send($notifiable, Notification $notification)
{
$message = $notification->toCustomSms($notifiable);
return Nexmo::message()->send([
'to' => $notifiable->phone_number,
'from' => env('NEXMO_FROM'),
'text' => $message->content,
'status-report-req' => 1
]);
}
}
这发送消息确定,我收到罚款,没有问题。
我已将Nexmo控制面板上的Web钩子设置为正确的URL(我使用的是http,是否需要https)?
我的路线文件如下
Route::get('sms/delivery-status', 'SmsController@deliveryStatus');
用我的SmsController方法
/**
* The webhook for Nexmo to receive delivery statuses.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
*/
public function deliveryStatus(Request $request)
{
if (!isset($request->messageId) OR !isset($request->status)) {
Log::error('Not a valid delivery receipt');
return;
}
// Loop for all main SMS messages with the given phone number.
$entries = SmsHistory::where('phone_number', $request->to)->get();
// Loop through each of the SMS message to that number.
foreach ($entries as $item) {
// Loop through each of the rsent messages for the main message.
foreach ($item->messages as $key => $message) {
// Check whether the given messageID matches the one stored in the messages array field.
if ($message['message-id'] == $request->messageId) {
$messages = $item->messages;
// Remove the current message
array_pull($messages, $key);
// Add the new message
$messages = array_add($messages, $key, $request->input());
$item->messages = $messages;
$item->save();
}
}
}
return response('OK', 200);
}
简而言之,搜索phone_number与'to'值匹配的所有消息。 然后,对于每条消息,它会遍历由Nexmo发送的每个消息部分(存储在JSON列中)以匹配messageId。
一旦找到messageId,它将用收据上提供的JSON替换JSON,例如。
[{"msisdn":"441122334455","to":"441122334455","network-code":"23410","messageId":"0B000000999B5FCB","price":"0.02000000","status":"delivered","scts":"1208121359","err-code":"0","message-timestamp":"2020-01-01 12:00:00"}]
然后这用于确认邮件已在我的视图中传送(通过确保所有部分都显示为已交付等)
如果我手动执行GET请求并在请求中设置正确的'to'和'messageId'变量,那么数据库行会更新得很好,以至于出现规则。
很抱歉,这篇文章很长,可能不是这样做的最有说服力的方式,但是我错过了什么?
我发现了这个问题。
记录请求(为什么我没有这样做,我不知道,但谢谢你提出的建议)我意识到我正在寻找一个匹配的phone_number为错误的号码。
常识说我用'来',但我需要使用'msisdn'?!
无论如何,在控制器中改变了这一点,它不能正常工作! :)
链接地址: http://www.djcxy.com/p/33101.html上一篇: Nexmo API SMS delivery receipt
下一篇: Laravel Nexmo, bad credentials when using notifications