【问题标题】:Accept POST requests from external domain? (Google App Engine)接受来自外部域的 POST 请求? (谷歌应用引擎)
【发布时间】:2012-05-07 20:07:41
【问题描述】:

我似乎无法让我的应用接受来自不同域的 POST 请求。我正在尝试在我的应用程序中创建一个 PayPal IPN 处理程序。

当用户点击我页面上的“订阅”按钮时,PayPal 会向我的 IPN 处理程序发送一个 IPN(一个 POST)。

我可以在我的 AppEngine 日志中看到收到了一个 POST 请求,但它是空的(例如,没有参数,我的 logging.debug 消息没有显示在日志中等)

因此,我通过在我的应用程序向它发送 POST 来测试我的处理程序,并且处理程序按预期工作。

我假设不接受来自外部来源的 POST 是一项安全功能?如果是这样,我如何让我的应用接受来自 PayPal 的 POST?

这是我的处理程序目前的样子(仅用于测试):

class BaseHandler(tornadotoad.mixin.RequestHandler, tornado.web.RequestHandler):
    # ...

class IPNHandler(BaseHandler):
    def post(self):
        if is_ajax(self.request):
            logging.info('AJAX')
        logging.info(self.request.arguments)
        self.write("This is the IPN Handler\n'")
        self.write(self.request.arguments)
        return

提前致谢。

附:我正在使用 PayPal 的 Sandbox Test Tool 发送 IPN

【问题讨论】:

  • 据我所知,没有安全问题会阻止这种情况发生。您确定来自 PayPal 的请求中确实包含您想要的数据吗?
  • 不,没有“安全功能”。 is_ajax 是什么?您的处理程序返回什么状态码?您确定您使用的是正确的 URL 并且您的处理程序正在被调用吗?您能否向我们展示一个展示该问题的简单演示应用程序,以及一个演示该问题的命令行 (curl/wget)?
  • 您如何确保该帖子来自 PayPal。另外,您能否说出您正在尝试哪种与 PayPay 的集成模型?
  • @NickJohnson is_ajax 只是一个检查请求标头是否包含“XMLHttpRequest”的函数。我认为我的处理程序正在被调用,因为我在发送 IPN 时在我的日志中得到了这个 2012-04-27 11:13:50.294 /ipn 302 23ms 0kb 173.0.82.126 - - [26/Apr/2012:20:13:50 -0700] "POST /ipn HTTP/1.1" 302 0 - - "myapp.appspot.com" ms=23 cpu_ms=0 api_cpu_ms=0 cpm_usd=0.000108
  • @KarthikAnanth 我正在使用Website Payments Standard 方法。

标签: python google-app-engine tornado paypal-ipn paypal-subscriptions


【解决方案1】:

我发现了我的错误。我将处理程序的 url 与其他 url 放在一起,在app.yaml 中有login: required

我已经解决了这个问题,现在 PayPal 的 IPN 可以通过了。

谢谢大家!

【讨论】:

  • 您可以并且应该接受您自己的答案。它将帮助下一位观众。
【解决方案2】:

这里有一些预感。

  1. 也许“/ipn”没有被路由到 IPNHandler。也许是另一个已弃用的处理程序?

  2. 您在日志中查看的应用程序版本可能与您拥有的不同。也许您可以部署新版本的代码并针对新版本进行测试。

  3. 也许 Paypal 向您发送的 POST 请求没有参数。

附:有关您如何从 Paypal 端执行测试、显示代码的其他相关部分以及任何其他相关信息的更多信息可能会有所帮助。 :)

【讨论】:

  • 我正在使用 PayPal 的IPN test tool 来模拟发送 IPN。 (您需要在developer.paypal.com 注册一个虚拟帐户)。进入工具后,在 IPN 处理程序 URL 中输入 http://wmp-ipn-handler-test.appspot.com/ipn,然后单击“发送”。要测试/ipn 是否正常工作,请转到here,然后会有一个表单也可以发送到/ipn。
  • 您的应用订阅链接给了我一个“服务器错误”。
  • 我刚刚通过发送发布请求测试了您的 /ipn。它似乎工作正常。没有阻止来自 Paypal 的请求的“安全功能”。查看您使用 Paypal 的 IPN 模拟器的方式。那里可能有问题。
【解决方案3】:

只是一种预感,我可能在这里超出我的范围,但对于龙卷风,我似乎无法在 docs 中找到该名称的方法或属性...

至少对于 webapp 我相信arguments 是一个实例方法:

 logging.info(self.request.arguments())

请参阅文档here

【讨论】:

  • 我在 GAE 上使用 Tornado,其中arguments 是一个字典。
  • 请原谅误导。我只是浏览了我的代码(基于 webapp),它完全符合您的要求,并且我确实得到了所有参数(使用 IPN 模拟器......)。因此,回答您的问题是否是安全问题;这是一个确定的数字。
猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 2016-06-04
  • 1970-01-01
  • 2020-03-22
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多