簡體   English   中英

如何使用Play 2.0在Java中實現PayPal IPN控制器

[英]How to implement a PayPal IPN Controller in Java using Play 2.0

我正在使用Play Framework 2.0實現PayPal IPN控制器(當前在Java中),該控制器從PayPal服務器接收表單編碼的POST請求。 我正在改寫Guillame Leone博客文章中的Play 1.x控制器,以與Play 2.0一起使用。 由於“參數”現已消失,因此此任務似乎有些棘手。

PayPal IPN流程有兩個步驟:

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

兩次解析此請求的最佳方法是什么,一次解析為文本(忽略表單編碼的MIME類型),第二次解析為表單編碼的數據?

(似乎我可能想擺脫注釋,直接調用TolerantText和FormEncoded解析器,但是我不知道該怎么做!)

由於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();
    }

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM