【发布时间】:2012-09-24 13:42:24
【问题描述】:
我正在使用 Play Framework 2.0 实现一个 PayPal IPN 控制器(目前使用 Java),它从 PayPal 服务器接收表单编码的 POST 请求。我正在调整来自 blog post by Guillame Leone 的 Play 1.x 控制器以使用 Play 2.0。由于“params”现在没有了,这个任务似乎有点棘手。
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 发送验证请求,当他们回复“已验证”响应时,我想解码表单编码的请求正文并将其作为地图访问。但是由于我已经使用注释将请求正文解析为文本,因此以下返回 null 而不是映射:
Map<String,String[]> data = request().body().asFormUrlEncoded() //returns null
两次解析此请求的最佳方式是什么,一次作为文本(忽略表单编码的 MIME 类型),第二次作为表单编码的数据?
(看来我可能想摆脱注释并直接调用 TolerantText 和 FormEncoded 解析器,但我不知道该怎么做!)
【问题讨论】:
-
我也对 Scala 解决方案感兴趣,如果它更容易的话,因为我的大部分应用程序都是在 Scala 中构建的,一旦我更好地了解 Body Parsers,我计划将其移植到 Scala。跨度>
-
如果您曾经迁移到 Scala API,您可以尝试将 toleranceText 与 play.core.parsers.FormUrlEncodedParser.parse(body) 一起获取请求映射。
-
嘿,谢谢,我认为这会奏效。在将控制器迁移到 Scala 之前,我正在编写一个小的 Scala 实用函数来将请求正文作为字符串并将 parse(body) Map 转换为 Java 集合。可以说没有直接的方法可以使用纯 Java 做到这一点吗?
标签: scala playframework playframework-2.0 paypal-ipn