https://a.storyblok.com/f/270183/237974/5c6a036efd/sms-delivery-java.png

JavaとSparkでSMS配信の受信を行う

最終更新日 April 30, 2021

所要時間:4 分

あなたは学んだ テキストメッセージの送信方法SMS API を使って Vonage バーチャル番号からテキストメッセージを送信する方法を学びました。アプリケーションにエラーはなく、APIは status: 0を返すので、メッセージが送信されたことを確信しています。

しかし、その番号に関連するデバイスに直接アクセスできない限り、配達されたことをどうやって確認できるのだろうか?

Vonageがメッセージの伝送に使用しているネットワークの多くは、配達受領書を提供しています。あなたはプログラムでその配達受領書にアクセスすることができ、この投稿でその方法を紹介します。

悪い知らせは、すべてのネットワークの配信レシートが、あなたのメッセージが実際に配信されたことを確実に証明するわけではないということだ。

キャリアによっては、メッセージを受信したことは伝えるが、宛先に届いたかどうかは確認しない。偽の領収書を作成するところもある。領収書をまったく送らないところもある。

領収書を信頼する前に、以下のナレッジベースをご覧ください。 ナレッジベースをご覧ください。

配達受領をリクエストするには、一般にアクセス可能な ウェブフックを作成し、それを使用するようにVonageアカウントを設定する必要があります。Javaと スパーク・ウェブ・フレームワークを使用します。このチュートリアルのコードは GitHub.

前提条件

  • JDK JDKまたはそれに相当するオープンソースの オープンJDK.このチュートリアルはOpenJDK 11を使って書かれていますが、バージョン8以上であればどちらでも問題ありません。

  • Gradle(バージョン3.4以降)を使ってプロジェクトをビルドし、依存関係を管理します。

  • ngrokを使用して、公衆インターネット上でウェブフックを利用できるようにします。

プロジェクトの作成

というプロジェクト用のディレクトリを作成する。 get-delivery-receiptというプロジェクト用のディレクトリを作成し、そのディレクトリに移動して gradleを使ってプロジェクトを初期化する:

mkdir get-delivery-receipt cd get-delivery-receipt gradle init --type=java-application

すべてのデフォルトを受け入れ、生成されたプロジェクトをIDEで開く。

依存関係の初期化

ファイルを探し build.gradleファイルを見つけ、依存リポジトリを jcenter()から mavenCentral():

repositories {
    mavenCentral()
}

セクションを dependenciesセクションを以下のように置き換える:

dependencies {
    // Spark framework
    implementation 'com.sparkjava:spark-core:2.8.0'

    // Vonage client library
    implementation 'com.nexmo:client:4.4.0'

    // To display formatted JSON
    implementation 'com.cedarsoftware:json-io:4.10.1'
}

Sparkを使ってWebアプリケーションを作成する

Gradleは Appクラスを src/main/java/get/delivery/receiptフォルダに作成されます。

開く App.javaをIDEで開いてください。メソッドを削除します。 getGreeting()メソッドを削除します。 gradleを削除し、必要な importステートメントを sparkJsonWriterパッケージに必要なステートメントを追加します。

次に、Sparkの portメソッドを呼び出して、アプリケーションがポート3000でリクエストをリッスンしていることを示します。

あなたの App.javaはこのようになるはずだ:

package get.delivery.receipt;

import static spark.Spark.*;
import com.cedarsoftware.util.io.JsonWriter;

public class App {

    public static void main(String[] args) throws Exception {
        
        port(3000);

        // Your code goes here
    }
}

納品書Webhookのコード化

Vonageがキャリアから配達受領書を受け取ると、アカウント設定をチェックし、お客様がWebhookエンドポイントのURLを提供しているかどうかを確認します。もしそうであれば、Vonageはこのエンドポイントに配達受領情報をリクエストします。

デフォルトでは、これは GETリクエストなので、最初にそれをコーディングします。公開するエンドポイントは /webhooks/delivery-receipt.

あなたの mainメソッドに追加する:

get("/webhooks/delivery-receipt", (req, res) -> {
    System.out.println("DLR received via GET");
    for (String param : req.queryParams()) {
        System.out.printf("%s: %s\n", param, req.queryParams(param));
    }
    res.status(204);
    return "";
});

このコードは GETリクエストを傍受し、クエリー文字列から配送受領情報を取り出して stdout.そしてHTTPステータスコード 204を返し、リクエストが成功したことを Vonage の API に伝えます。

WebhookでPOSTリクエストを処理する

また、Vonageアカウントを設定することで、VonageがURLエンコードされたフォームまたはJSONペイロードとして、リクエストによって配信レシートを提供するようにすることもできます。 POSTリクエスト: URLエンコードされたフォームまたはJSONペイロードとして。

アプリケーションがどちらかを受け入れることができるように GETまたは POSTリクエストを受け付けるようにするには、以下のコードを App.java:

post("/webhooks/delivery-receipt", (req, res) -> {
    if (req.contentType().startsWith("application/x-www-form-urlencoded")) {
        System.out.println("DLR received via POST");
        for (String param : req.queryParams()) {
            System.out.printf("%s: %s\n", param, req.queryParams(param));
        }
    } else {
        System.out.println("DLR received via POST-JSON");
        String prettyJson = JsonWriter.formatJson(req.body());
        System.out.println(prettyJson);
    }
    res.status(204);
    return "";
});

VonageがどのHTTPメソッドを使ってレシートを送信しているかに関係なく、レシートをキャプチャするために必要なコードは以上だ。

ウェブフックにアクセスできるようにする

WebhookをVonageのAPIにアクセスできるようにする必要があります。開発中にこれを行う素晴らしい方法は ngrok.詳しくは ブログポスト.

をダウンロードしてインストールする。 ngrokをダウンロードし、以下のコマンドを実行して、ポート3000のアプリケーションを公衆インターネットに公開する:

ngrok http 3000

が提供する公開URLをメモしておいてください。 ngrokが提供する公開URLをメモしておき、このチュートリアルの期間中、実行したままにしておくこと(実行するたびに新しいランダムなURLが表示されるため、有料プランに申し込まない限り)。 有料プラン):

Terminal showing the ngrok URLsTerminal showing the ngrok URLs

Vonageアカウントの設定

WebhookのURLができたので、Vonageにそれを使うように指示する必要があります。

ログイン 開発者ダッシュボード左側のナビゲーションメニューのアカウント名の下にある「設定」を選択します。

そのページの右側、"Default SMS Setting "の下に、ウェブフックの完全なURL (ngrokURLプラス /webhooks/delivery-receipt)を入力し、"変更を保存 "をクリックします。デフォルトのSMSではなく POSTデフォルトの GETHTTPメソッドの代わりに

Setting the delivery receipt webhook URL in the developer dashboardSetting the delivery receipt webhook URL in the developer dashboard

試してみる

これで準備は整った!これでテストできます。

アプリケーション・ディレクトリ内からJavaアプリケーションを実行する:

gradle run

個人の携帯電話番号にテストメッセージを送信する。

Vonageがネットワークから配達受領書を受け取ると、それをお客様のアプリケーションに転送し、表示します:

GET request network-code: 23420 price: 0.03330000 messageId: 1400022045C7C1E0 scts: 1907161527 to: VONAGETEST err-code: 0 msisdn: 447700900005 message-timestamp: 2019-07-16 14:27:43 status: delivered

ダッシュボードの設定ページで ダッシュボード設定ページのいずれかに変更します。 POSTメソッドのいずれかに変更し、別の SMS を送信して、アプリケーションがまだ配信受領情報を取得できることを確認します。例えば POST-JSON:

DLR received via POST-JSON
{
  "msisdn":"447700900005",
  "to":"NEXMOTEST",
  "network-code":"23420",
  "messageId":"140023462904E8",
  "price":"0.03330000",
  "status":"delivered",
  "scts":"1907171217",
  "err-code":"0",
  "message-timestamp":"2019-07-17 11:17:52"
}

結論

このチュートリアルでは、SMS API を使用して Vonage から配送受領書を取得する Java アプリケーションを Spark フレームワークで作成する方法を学びました。あなたがコーディングした Webhook は、どの HTTP メソッドがリクエストに使用されたかに関係なく、配送受領書を取り出すことができました。

さらに読む

シェア:

https://a.storyblok.com/f/270183/384x384/637d0e41eb/marklewin.png
Mark Lewinヴォネージの卒業生

元Vonageのテクニカルライター。APIをいじり、文書化するのが大好き。