Nexmo API квитанция о доставке СМС
Я использую уведомления Laravel, чтобы отправить текстовое сообщение зарегистрированным пользователям моего приложения.
Первоначально я использовал канал Nexmo по умолчанию, но с тех пор создал свой собственный канал, чтобы исключить любые проблемы.
Я храню каждое сообщение в своей базе данных, причем каждое сообщение имеет столбец массива "messages", который содержит информацию об ответах JSON для каждого физического сообщения, отправленного Nexmo.
например.
[{"to":"441122334455","message-id":"0B00000099A49D63","status":"0","remaining-balance":"7.00500000","message-price":"0.03330000","network":"23410"}]
Мой пользовательский канал SMS выглядит следующим образом
namespace App\Notifications\Channels;
use Illuminate\Notifications\Notification;
use Nexmo\Laravel\Facade\Nexmo;
class CustomSmsChannel
{
/**
* Send the given notification.
*
* @param mixed $notifiable
* @param \Illuminate\Notifications\Notification $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 для получения уведомлений о доставке на правильный URL-адрес (я использую http, должен ли он быть https?)
Мой файл маршрутов выглядит следующим образом
Route::get('sms/delivery-status', 'SmsController@deliveryStatus');
С моим методом SmsController
/**
* The webhook for Nexmo to receive delivery statuses.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
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' в запросе, строка базы данных корректно обновляется, чтобы исключить это.
Извините за длинный пост, и это, вероятно, не самый красноречивый способ сделать это, но что я пропускаю?!
1 ответ
Я нашел проблему.
Записав запрос (почему я этого не сделал, не знаю, но спасибо, что предложили), я понял, что искал соответствующий номер телефона для неправильного номера.
Здравый смысл утверждал, что я использовал 'to', но мне нужно было использовать 'msisdn'?!
Во всяком случае, изменил это в контроллере, и он не работает нормально!:)