4

我实现了一个名为 mercadopago 的支付模块(如 paypal),当有人在这种类型的 url 中使用信息进行支付(IPN)时,我需要处理发送到我的网站的 http 请求:

POST /notifications?topic=payment&id=identificador-de-notificacion-de-pago

(mercadopago 每次付款影响时都会向我的网站发送一个 POST 请求)

但我无法使其与 django url 系统匹配。我尝试了以下网址:

    url(r'^notifications$', 'views.notifications', name='notifications'),

我尝试了不同的组合并查阅了 apache 日志文件并抛出了错误 500

处理 url 的视图如下:

    @csrf_exempt
    def IpnProxy(request, **kwargs):
        mp = mercadopago.MP("*********", "*********") 
        paymentInfo = mp.get_payment_info(kwargs["id"])
        if paymentInfo["status"] == 200:
            return paymentInfo["response"]
        else:
            return None

我不知道是否必须配置信号或其他东西。

也许我弄错了,但 mercadopago 向我的服务器发出了发布请求,我无法改变它。这是他们的文档 http://developers.mercadopago.com/documentation/instant-payment-notifications?lang=en_US 这是他们在 python 中的示例项目: https ://github.com/mercadopago/sdk-python/blob/ master/examples/instant-payment-notifications/receive-ipn.py

4

2 回答 2

2

?标记之后的所有内容都是带有请求 GET 参数的查询字符串。它们不包含在 url 模式中urls.py

url(r'^notifications/$', view_notifications)

从视图中获取GET参数:request.GET QueryDict

def view_notifications(request):
    topic = request.GET.get('topic')
    print topic

也可以看看:

于 2014-07-18T20:31:15.810 回答
2

您在 Django 中为 POST 错误地编码了参数。POST 请求将其参数编码在请求正文中。请查看 Django 的请求和响应对象文档。如果您真的想使用您提供的 URL,则需要使用 GET 而不是 POST。

- - 编辑 - -

尝试以下方法:在您导入通知后的 urls.py 文件中。

url(r'^notification$', notification, name='notification')

在您的 settings.py 中:

APPEND_SLASH=False

您几乎肯定还需要关闭 CSRF 保护,因为您不会有 CSRF cookie。

您将能够按如下方式检索参数:

def notification(request, **kwargs):
    body = "topic = '{0}'\nid = '{1}'\n".format(request.GET.get('topic'), request.GET.get('id'))
    response = HttpResponse(body, content_type="text/plain")
    return response

测试然后给我们:

hackworth:~$ curl -X POST "http://127.0.0.1:8000/notification?topic=payment&id=identificador-de-notificacion-de-pago"
topic = 'payment'
id = 'identificador-de-notificacion-de-pago'

以上所有都是一个坏主意,因为 POST 请求通常有一个主体,而 Django 真的不希望 POST url 上有查询参数。此外,现在存在一个安全漏洞,因为必须关闭 CSRF 保护才能使其正常工作。

按照文档的阅读方式,您将收到来自 mercadopago 的 URL,您可以通过 get 请求检索该 URL。目前尚不清楚他们是否会向您发送带有查询参数的 POST 请求。

于 2014-07-22T21:35:14.510 回答