4

http経由でAmazonSNSのサブスクリプションを確認するにはどうすればよいですか?現在、アプリケーションにRailsを使用していますが、メールのバウンスの通知を受け取りたいと思っています。そこで、Amazonフォーラムを調べてみたところ、最も近いものはhttps://forums.aws.amazon.com/thread.jspa?threadID=87555でした。これは、request.raw_postを使用してリクエストを取得し、JSONを解析するように指示しています。それ。しかし、そうしようとすると、リクエストが空であるというエラーが表示されます。私はそれを正しい方法でやっていますか?誰かがAmazonSNSからサブスクリプショントークンを取得してサブスクリプションを確認する方法を教えてもらえますか?ありがとう!:)

4

3 に答える 3

5

これは私にとってはうまくいきました。コントローラーで、以下のコードのようなアクションを作成します。トークン ルートが必要だったので、そこに表示されます。しかし、SubscribeURL ルートを選択し、URL に対して GET を実行するだけです。

  def sns
     request_json = JSON.parse(request.raw_post, {symbolize_names: true})
     subscribe_url = request_json[:SubscribeURL]
     token = request_json[:Token]
  end
于 2015-04-07T02:45:36.203 に答える
0

これが私のために働くphpscritです。(ファイルi /tmp/log.txtに書き込むログ行がいくつかあり、何が起こっているかをデバッグするのに役立ちます。まず、https://sns.us-east-1.amazonawsからamazon証明書をダウンロードしました。 .com / SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pemまた、どこでもutf8を使用するようにしてください。

私にとっては、httpでのみ機能します。https URLをサブスクライブすると、サーバーにアクセスが表示されません。

<?php

mLog ("\n\n----------------Start Receive -------------\n");

require_once APP_DIR . 'util/AWSSDKforPHP/sdk.class.php';

$h= fopen("php://input","r");
$X = stream_get_contents($h);


$J = json_decode( $X , true);

mLog("Received body: \n" . json_encode($J). "\n");

function mLog($Msg) {
    file_put_contents(sys_get_temp_dir() .'/log.txt',$Msg,FILE_APPEND);
}


function CheckCall($J) {

    if ($J["Type"]=="Notification") {
        $SB='';
        $SB .= "Message\n";
        $SB .= $J["Message"] . "\n";
        $SB .= "MessageId\n";
        $SB .= $J["MessageId"] . "\n";

        if ($J["Subject"] != null) {
            $SB .= "Subject\n";
            $SB .= $J["Subject"]. "\n";
        }

        $SB .= "Timestamp\n";
        $SB .= $J["Timestamp"] . "\n";

        $SB .="TopicArn\n";
        $SB .= $J["TopicArn"]."\n";
        $SB .="Type\n";
        $SB .=$J["Type"]."\n";

    } else if ($J["Type"]=="SubscriptionConfirmation") {
        $SB='';
        $SB .= "Message\n";
        $SB .= $J["Message"] . "\n";
        $SB .= "MessageId\n";
        $SB .= $J["MessageId"] . "\n";
        $SB .= "SubscribeURL\n";
        $SB .= $J["SubscribeURL"] . "\n";
        $SB .= "Timestamp\n";
        $SB .= $J["Timestamp"] . "\n";

        $SB .= "Token\n";
        $SB .= $J["Token"] ."\n";
        $SB .="TopicArn\n";
        $SB .= $J["TopicArn"]."\n";
        $SB .="Type\n";
        $SB .=$J["Type"]."\n";
    } else {
        $SB='';
    }


    $cert = file_get_contents('SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem');
    $pubkey_id = openssl_get_publickey($cert);

    mLog("Signed string:\n" . $SB . "End Signed string\n");

    $Sig=base64_decode($J["Signature"]);
    if ( openssl_verify($SB, $Sig, $pubkey_id)) {
        return true;
    } else {

        return false;
    }
}

if (!CheckCall($J)) {
    mLog("Authorization failed. \n");
    header('HTTP/1.1 500 Internal Server Error');
    echo "<html><head></head><body>".sys_get_temp_dir()."</body></html>";

    exit(0);
}

$sns = new AmazonSNS();

if ($J["Type"]=="SubscriptionConfirmation") {
    $Res = $sns->confirm_subscription($J["TopicArn"], $J["Token"]);
    mLog("confitm_subscription sended: \n" . json_encode($Res));
} else if ($J["Type"]=="Notification") {
    mLog("-----------Begin Message-----------\n");
    mLog("Subject: ".$J["Subject"]. "\n");
    mLog($J["Message"]);
    mLog("\n-----------End Messagr------------\n\n");

} else {
    mLog("Invalid type \n");
}
echo "<html><head></head><body>Authentication Error</body></html>";
于 2013-02-01T11:44:47.117 に答える