将 Paypal IPN 与 Django 集成

Posted

技术标签:

【中文标题】将 Paypal IPN 与 Django 集成【英文标题】:Integrate Paypal IPN with Django 【发布时间】:2018-04-12 04:51:57 【问题描述】:

我在我的 Django 项目中集成了 Paypal IPN 付款方式。我正在使用django-paypal django 包。

我可以使用沙盒进行付款,而且一切顺利,但我没有在我的应用程序中获取交易详细信息以供将来参考(即交易 ID、日期、参考详细信息等)。我在开始付款时发送以下参数。

paypal_dict = 
        "business": "xxxxxxxx@mail.com",
        "amount": subscriptions.price,
        "item_name": subscriptions.name,
        "invoice": subscriptions.invoice_no,
        "notify_url": request.build_absolute_uri(reverse('paypal-ipn')),
        "return_url": request.build_absolute_uri(reverse('subscriptions:return_url')),
        "cancel_return": request.build_absolute_uri(reverse('subscriptions:cancel_return')),
        "custom": "premium_plan",  # Custom command to correlate to some function later (optional)
        # "landing_page": "billing",
        "paymentaction": "authorization",
        "first_name": company_profile.company_name,
        "last_name": "",
        "address1": company_profile.address_1,
        "address2": company_profile.address_2,
        "city": company_profile.city,
        "country": company_profile.country,
        "state": company_profile.state,
        "zip": company_profile.zip_code,
        "email": company_profile.email,
        "night_phone_a": company_profile.work_phone
    

我读到 IPN 一直在发送响应,但不确定我是否错过了设置任何参数。

我检查了 notify_url 是否可以从外部访问,但我没有看到 paypal 调用我的 notify_url。

您的宝贵意见将对我们有很大帮助。提前谢谢!!!!!!

【问题讨论】:

documentation 中的第 4 点提到了notify_url。这个url是webhook URL,调用成功和失败的详细信息。 您的notify_url 必须可以从外部访问。请注意,沙盒有时不会发送 IPN 消息,因为它已完全损坏。例如,上周我收到了大部分 IPN 消息(退款通知除外),但今天我没有收到一条消息,浪费了整个开发日。我的代码根本没有改变。 Paypal 就是毒药。 我检查了 notify_url 是否可以从外部访问,但我没有看到 paypal 调用我的 notify_url。 【参考方案1】:

如果您有一个静态 IP/域名,您最好使用您的 paypal 字典中的实际 url,就像您的服务器位于防火墙或代理后面一样,您的 Paypal 将无法找到您的服务器发送 IPN 时。因此,将所有 request.build_absolute_uri(reverse('****') 更改为您在应用的 urls.py 中指定的实际 url。

关于测试,django-paypal's documentation 声明:

如果您尝试使用 PayPal 沙箱在开发中对此进行测试,并且您的计算机位于防火墙/路由器后面,因此无法在 Internet 上公开访问(大多数开发人员计算机都是这种情况),PayPal 将无法发回您的视图。您将需要使用https://ngrok.com/ 之类的工具使您的计算机可公开访问,并确保在 notify_url、return 和 cancel_return 字段中向 PayPal 发送您的公共 URL,而不是 localhost。

完成后,您必须将 paypal 将向您发送的信号(IPN)链接到将处理它的函数。为此,请在您的应用中创建一个名为 signals.py 的文件,其中包含以下内容:

from paypal.standard.models import ST_PP_COMPLETED
from paypal.standard.ipn.signals import valid_ipn_received
from django.dispatch import receiver

@receiver(valid_ipn_received)
def show_me_the_money(sender, **kwargs):
    ipn_obj = sender
    if ipn_obj.payment_status == "Completed":
           #Do something here, payement has been confirmed.

然后您必须将此函数连接到 Paypal 将发送的信号。为此,您可以使用 the Django documentation 建议的 ready() 方法。为此,请将以下方法添加到您的 apps.py 文件中:

class YourAppNameConfig(AppConfig):
    name = 'Yourappname'

    def ready(self):
        import yourappname.signals

这可以确保在加载 django 项目时建立函数和信号之间的链接。

【讨论】:

以上是关于将 Paypal IPN 与 Django 集成的主要内容,如果未能解决你的问题,请参考以下文章

将 Paypal 的 IPN 变量与后端变量匹配

PayPal:IPN/REST/Webhooks 与 Java 程序的集成

与 IPN 集成的 PayPal Express Checkout

Paypal IPN 订阅协议

Paypal Ipn 与 asp.net MVC 的集成

将 PayPal IPN 集成到网站中