2017-11-20 18 views
0

私はlaravel通知を使用して、アプリケーションの登録ユーザーにテキストメッセージを送信しています。Nexmo API SMS配信通知

私はもともとデフォルトのNexmoチャンネルを使用していましたが、それ以来、問題を除外する独自のチャンネルを作成しました。

各メッセージをデータベースに保存しています。各メッセージには、Nexmoによって送信された各物理メッセージのJSON応答情報を含む 'messages'配列列があります。

例えば、

[{"to":"441122334455","message-id":"0B00000099A49D63","status":"0","remaining-balance":"7.00500000","message-price":"0.03330000","network":"23410"}] 

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メッセージを送信していないと私は細かいことを受け、そこには問題を次のように私のカスタムSMSチャネルです。

私は

を次のように私のルートファイルがある(私は、HTTPを使用している、それがhttpsである必要はない?)正しいURLに

を配信確認のためNexmoコントロールパネル上のウェブフックを設定した

私SmsController方法一言で言えば、PHONE_NUMBERは「から」値に一致するすべてのメッセージを検索

/** 
* 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); 
} 

Route::get('sms/delivery-status', '[email protected]'); 

。その後、各メッセージに対して、messageIdと一致するように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'変数は、データベース行が正しく更新されているので、そのルールを変更します。

長いポストに申し訳ありません。これはおそらく最も雄弁な方法ですが、何が欠けていますか?

+0

私はあなたの質問から何が問題か分かりません。 Nexmoから来たときにwebhookが処理していないのですか? – CUGreen

+0

はい、ウェブフックが送信されないか、コントローラで処理されていません。 – James

+0

まず、Nexmoがエンドポイントにヒットしたかどうかを確認するためにサーバーログを確認できますか?もしそうなら、私はペイロードが何であるかを見るためにコントローラに要求を記​​録するでしょう。 – CUGreen

答えて

0

問題が見つかりました。

リクエストをログに記録する(なぜ私はこのことを知らなかったのですが、それを提案してくれてありがとう)間違った番号のphone_numberを検索していることに気付きました。

私は 'to'を使用していましたが、 'msisdn'を使用する必要がありましたか?

とにかく、コントローラでこれを変更しても問題ありません。 :)

関連する問題