Paypal返回空的QueryDict - Django

时间:2017-08-22 22:14:29

标签: python django paypal

我正在将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),

2 个答案:

答案 0 :(得分:1)

如果您彻底搜索了互联网但没有成功,请确保使用贝宝(Paypal)的PAYPAL_RECEIVER_EMAIL完成了以下操作:

登录到sanbox.paypal.com

设置->网站付款->网站偏好设置->自动返回:http://xxxxxxxx.ngrok.io->保存

设置->网站付款->网站偏好设置->付款数据转移->是

在没有配置这些设置的情况下,您将成功获得一个空查询字典。当您更新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
    }

根据the Paypal documentation

  1. 所有购物车付款都使用GET方法。
  2. 使用GET方法将买方的浏览器重定向到退货URL,但不包括付款变量。
  3. 使用POST方法将买方的浏览器重定向到退货URL,并且包括所有付款变量。