我在我的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。
您的宝贵意见将对我们有所帮助。在此先感谢!!!!!
答案 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项目时在函数和信号之间建立了链接。