Квитанция о доставке SMS через Nexmo API

Я использую уведомления laravel для отправки текстового сообщения зарегистрированным пользователям моего приложения.

Первоначально я использовал канал Nexmo по умолчанию, но с тех пор создал свой собственный канал, чтобы исключить любые проблемы.

Я храню каждое сообщение в своей базе данных, причем каждое сообщение имеет столбец массива «сообщения», который содержит информацию об ответе JSON для каждого физического сообщения, отправленного Nexmo.

eg.

[{"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
        ]);

    }
}

Это отправляет сообщение OK, и я получаю его нормально, никаких проблем.

Я установил веб-перехватчик на панели управления 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 найден, он заменяет 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» в запросе, строка базы данных обновляется нормально, поэтому это исключается.

Извините за длинный пост, и это, вероятно, не самый красноречивый способ сделать это, но чего мне не хватает?!


person James    schedule 20.11.2017    source источник
comment
Я не вижу из вашего вопроса, в чем проблема. Дело в том, что веб-хук не обрабатывается при поступлении из Nexmo?   -  person CUGreen    schedule 20.11.2017
comment
Да, веб-хук либо не отправляет, либо не обрабатывается в контроллере.   -  person James    schedule 20.11.2017
comment
Во-первых, можете ли вы проверить журналы сервера, чтобы узнать, попал ли Nexmo в вашу конечную точку? Если да, то я бы зарегистрировал запрос в вашем контроллере, чтобы увидеть, что такое полезная нагрузка.   -  person CUGreen    schedule 20.11.2017
comment
Но если я запускаю запрос GET вручную через свой браузер, он работает нормально, поэтому я не вижу, что это проблема с кодом?   -  person James    schedule 20.11.2017
comment
Мне интересно, зачем нужен этот цикл, а что если напрямую написать что-то вроде ``$entries = SmsHistory::where('message-id', $request-› messageId)-›update(['messages'=›'new message ']); ```   -  person Furquan    schedule 02.09.2020


Ответы (1)


Я нашел проблему.

Зарегистрировав запрос (почему я этого не сделал, я не знаю, но спасибо за предложение), я понял, что ищу соответствующий phone_number для неправильного номера.

Здравый смысл подсказывал, что я использовал «to», но мне нужно было использовать «msisdn»?!

Во всяком случае, изменил это в контроллере, и он не работает нормально! :)

person James    schedule 20.11.2017