将 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/REST/Webhooks 与 Java 程序的集成