我正在实现一个名为 mercadopago(如 paypal)的支付模块,我需要处理一个 http 请求,该请求在有人使用此类 url 中的信息进行支付(IPN)时发送到我的网站:
POST /notifications?topic=payment&id=identificador-de-notificacion-de-pago
(每次付款影响时,mercadopago 都会向我的站点发送 POST 请求)
但我无法使其与 Django URL 系统相匹配。我尝试了以下网址:
url(r'^notifications$', 'views.notifications', name='notifications'),
我尝试了不同的组合并查阅了 apache 日志文件并向我抛出错误 500
处理 url 的 View 如下:
@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
最佳答案
您在 Django 中错误地编码了 POST 的参数。 POST 请求将其参数编码在请求正文中。请看Request and response objects 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 请求。
关于python - 如何将 url 与 django urlconf 匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24833182/