将Paypal IPN与Django集成

时间:2017-10-31 05:14:05

标签: python django paypal paypal-sandbox paypal-ipn

我在我的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。

您的宝贵意见将对我们有所帮助。在此先感谢!!!!!

1 个答案:

答案 0 :(得分:1)

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

关于测试,django-paypal's documentation指出:

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

完成此操作后,您必须将Paypal发送的信号链接到(IPN),该信号将处理该函数。为此,请在您的应用中创建一个名为signal.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项目时在函数和信号之间建立了链接。