我正在将PayPal添加到我的项目网站。我正在使用IPN,目前它似乎工作得很好,除了当我回到商家的页面(paypal_return或paypal_cancel)它没有回发交易信息,我只能看到一个空的“”在我的{{post}}和{{get}}中。 没有错误或任何东西,只是在页面中。
这是我在GitHub上的代码。 https://github.com/IreneG5/spss_online
知道为什么信息不会发回我的模板?
提前致谢!
PayPal返回页面
{% extends "base.html" %}
{% block content %}
<p>Your transaction has been completed, and a receipt for your purchase has been emailed to you. You may log into your account at www.paypal.com to view details of this transaction.</p>
<h2>POST</h2>
{{ post }}
<h2>GET</h2>
{{ get }}
{% endblock %}
Products.php (显示PayPal按钮的位置)
{% for product in products %}
<tr>
<td ><b>{{ product.name }}</b>
</td>
...
<td>
{% if user.is_authenticated %}
{{ product.paypal_form.sandbox }} <!-- .render for production-->
{% else %}
-
{% endif %}
</td>
</tr>
{% endfor %}
设置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_forms_bootstrap',
'paypal.standard.ipn',
'home',
'accounts',
'paypal_store',
'products',
]
SITE_URL = 'http://127.0.0.1:8000'
PAYPAL_NOTIFY_URL = 'http://127.0.0.1/a-very-hard-to-guess-url/'
PAYPAL_RECEIVER_EMAIL = 'irene.g5555-facilitator@gmail.com'
模型
class Product(models.Model):
code = models.CharField(max_length=20, default="")
name = models.CharField(max_length=100, default="")
osystem = models.CharField(max_length=10, default="")
description = models.TextField()
price = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)
license_type = models.CharField(max_length=50, choices=license_types, default="1 year")
# Passes the info needed for the PaypalPaymentForm to create
# the button and required HTML when we render the template
@property
def paypal_form(self):
paypal_dict = {
"business": settings.PAYPAL_RECEIVER_EMAIL,
"amount": self.price,
"currency": "EUR",
"item_name": "%s-%s" % (self.pk, uuid.uuid4()),
"notify_url": settings.PAYPAL_NOTIFY_URL,
"return_url": "%s/paypal-return/" % settings.SITE_URL,
"cancel_return": "%s/paypal-cancel/" % settings.SITE_URL
}
return PayPalPaymentsForm(initial=paypal_dict)
def __unicode__(self):
return self.name
视图
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render
@csrf_exempt
def paypal_return(request):
args = {'post': request.POST, 'get': request.GET}
return render(request, 'paypal/paypal_return.html', args)
def paypal_cancel(request):
args = {'post': request.POST, 'get': request.GET}
return render(request, 'paypal/paypal_cancel.html', args)
paypal的网址
url(r'^a-very-hard-to-guess-url/', include(paypal_urls)),
url(r'^paypal-return', paypal_views.paypal_return),
url(r'^paypal-cancel', paypal_views.paypal_cancel),
答案 0 :(得分:1)
如果您彻底搜索了互联网但没有成功,请确保使用贝宝(Paypal)的PAYPAL_RECEIVER_EMAIL完成了以下操作:
在没有配置这些设置的情况下,您将成功获得一个空查询字典。当您更新PAYPAL_RECEIVER_EMAIL帐户的这些设置时,您现在应该得到的是pay_pal_dict :)
答案 1 :(得分:0)
根据django-paypal documentation,
如果您尝试使用PayPal沙箱在开发中进行测试,并且您的计算机位于防火墙/路由器之后,因此不能在Internet上公开访问(大多数开发人员的计算机就是这种情况),PayPal会无法发布回您的视图。您将需要使用https://ngrok.com/之类的工具来使您的计算机可以公开访问,并确保在notify_url,return和cancel_return字段中向PayPal发送您的公共URL(而不是localhost)。
但是,我发现如果您使用常规的Paypal帐户(而不是商业帐户)作为PAYPAL_RECEIVER_EMAIL
,则会得到一个空的查询字典。要强制贝宝向您发送查询字典中的数据,您必须像这样(在您的情况下)将"rm": 2,
添加到贝宝字典中:
def paypal_form(self):
paypal_dict = {
"business": settings.PAYPAL_RECEIVER_EMAIL,
"amount": self.price,
"currency": "EUR",
"item_name": "%s-%s" % (self.pk, uuid.uuid4()),
"notify_url": settings.PAYPAL_NOTIFY_URL,
"return_url": "%s/paypal-return/" % settings.SITE_URL,
"cancel_return": "%s/paypal-cancel/" % settings.SITE_URL,
"rm": 2
}
- 所有购物车付款都使用GET方法。
- 使用GET方法将买方的浏览器重定向到退货URL,但不包括付款变量。
- 使用POST方法将买方的浏览器重定向到退货URL,并且包括所有付款变量。