2

Play Framework 2.0 を使用して PayPal IPN コントローラー (現在は Java) を実装しています。このコントローラーは、PayPal サーバーからフォーム エンコードされた POST 要求を受け取ります。Guillame Leone によるブログ投稿の Play 1.x コントローラーを Play 2.0 で動作するように調整しています。「params」がなくなったので、このタスクは少しトリッキーに思えます。

PayPal IPN プロセスには 2 つのステップがあります。

1) 要求本文をテキストとして解析し、PayPal が必要とする正確な応答を送信できるようにします。彼らが私に提出するのと同じ順序の同じ文字列でなければなりません。これは現在動作します:

 @BodyParser.Of(BodyParser.TolerantText.class)
 public static Result validation() throws Exception {
   Logger.info("Received IPN request");
    String str = "cmd=_notify-validate&" + request().body().asText();
    Logger.info("Validation string: " + str);

2)検証リクエストをPayPalに送信し、「VERIFIED」応答で応答すると、フォームでエンコードされたリクエスト本文をデコードし、マップとしてアクセスしたいと考えています。しかし、アノテーションを使用してリクエスト本文をテキストとして解析済みであるため、以下はマップではなく null を返します。

Map<String,String[]> data = request().body().asFormUrlEncoded() //returns null

このリクエストを 2 回解析する最善の方法は何ですか?

(注釈を取り除き、TolerantText および FormEncoded パーサーを直接呼び出したいと思うかもしれませんが、その方法がわかりません!)

4

1 に答える 1

1

Java と Scala コレクション間の相互運用性の問題により、Play Java API を使用してこれを行う直接的な方法はないようです。

Java コレクションを使用してフォーム データにアクセスするには、Scala ヘルパーを作成する必要がありました。

object BodyParserUtils {
  def parseTextAsFormUrlEncodedForJava(textBody: String) = {
    import collection.JavaConverters._
    val scalaMap = FormUrlEncodedParser.parse(textBody)
    scalaMap.mapValues(_.asJava).asJava
  }
}

そして、データ変数を設定できます:

Map<String, List<String>> data = BodyParserUtils.
     parseTextAsFormUrlEncodedForJava(request().body().asText());

また、ベア (まだ完全な) Play 2.0 Java コントローラーで PayPal IPN リクエストの受信を開始する場合は、次のようにします。

public class PaypalController extends Controller {

@BodyParser.Of(BodyParser.TolerantText.class)
public static Result validation() throws Exception {
    Logger.debug("Received IPN request");

    String str = "cmd=_notify-validate&" + request().body().asText();
    Logger.debug("Validation string: " + str);

    URL url = new URL("https://www.sandbox.paypal.com/cgi-bin/webscr");
    URLConnection connection = url.openConnection();
    connection.setDoOutput(true);
    connection.setRequestProperty("Content-Type",
            "application/x-www-form-urlencoded");

    PrintWriter out = new PrintWriter(connection.getOutputStream());
    out.println(str);
    out.close();

    BufferedReader in = new BufferedReader(new InputStreamReader(
            connection.getInputStream()));
    String result = in.readLine();
    in.close();

    Logger.debug("IPN result: " + result);

    Map<String, List<String>> data = BodyParserUtils
            .parseTextAsFormUrlEncodedForJava(request().body().asText());
    Logger.debug("Form data: " + data);

    if (StringUtils.equals(result, "VERIFIED")) {
        return ok();
    } else {
        return badRequest();
    }

}

}
于 2012-10-05T14:35:37.267 に答える