我在Django项目中集成了Paypal IPN支付方式。我正在使用django贝宝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是否可以从外部访问,但我没有看到贝宝调用我的notify_url。
您的宝贵意见将对我们有很大帮助。提前感谢!!!!!
如果你有一个静态的IP/域名,你会更好地使用贝宝字典中的实际url,就像你的服务器位于防火墙或代理后面一样,你的贝宝在发送IPN时将无法找到你的服务器。因此,将所有request.build_absolute_uri(reverse('****')
更改为您在应用程序的urls.py.中指定的实际url
关于测试,django贝宝的文档指出:
如果您试图在开发中使用PayPal沙盒进行测试,而您的机器位于防火墙/路由器后面,因此无法在互联网上公开访问(大多数开发人员机器都是这样),PayPal将无法返回您的视图。您需要使用以下工具https://ngrok.com/以使您的机器可以公开访问,并确保您在notify_URL、return和cancel_return字段中向PayPal发送您的公共URL,而不是localhost。
完成后,您必须将贝宝将向您发送的信号(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将发送的信号。为此,您可以使用Django文档中建议的ready()方法。为此,请将以下方法添加到apps.py文件中:
class YourAppNameConfig(AppConfig):
name = 'Yourappname'
def ready(self):
import yourappname.signals
这样可以确保在加载django项目时建立函数和信号之间的链接。