[英]How to implement PayPal IPN listener (controller) in Play Framework Scala
[英]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.