【问题标题】:Processing Payments Via Paypal in Django-Oscar在 Django-Oscar 中通过 Paypal 处理付款
【发布时间】:2018-11-07 15:07:48
【问题描述】:

我正在尝试使用 Django Oscar 建立一个基本的电子商务网站,但遇到了困难。大部分问题与缺乏有关如何连接有意义(想想 Paypal、Stripe、Braintree)支付方式的示例以及存在我以前从未听说过的晦涩的方式有关。

无论哪种方式,我都在尝试使用 django-oscar-paypal 并遵循其文档。 Paypal Express 部分似乎可以正常工作,因为按钮会显示出来,并且会发生类似于结帐和处理的事情。

但是,如果我选择以常规方式进行结帐(希望用卡付款),我将被带到下一页(括号中的消息是我的)

这是以下模板的产物:

{% extends "checkout/checkout.html" %}
{% load i18n %}

{% block title %}
    {% trans "Payment details" %} | {{ block.super }}
{% endblock %}

{% block checkout_nav %}
    {% include 'checkout/nav.html' with step=3 %}
{% endblock %}

{% block checkout_title %}{% trans "Enter payment details" %}{% endblock %}

{% block order_contents %}{% endblock %}
{% block shipping_address %}{% endblock %}
{% block shipping_method %}{% endblock %}
{% block payment_method %}{% endblock %}

{% block payment_details %}
    {% block payment_details_content %}
        <p>{% trans "(*** Message from ./templates/tshirt-theme/ ***) This page needs implementing within your project.  You may want to use one of Oscar's payment gateway libraries:" %}</p>
        <ul>
            <li><a href="https://github.com/django-oscar/django-oscar-paypal">django-oscar-paypal</a></li>
            <li><a href="https://github.com/django-oscar/django-oscar-datacash">django-oscar-datacash</a></li>
            <li><a href="https://github.com/django-oscar/django-oscar-gocardless">django-oscar-gocardless</a></li>
            <li><a href="https://github.com/django-oscar/django-oscar-paymentexpress">django-oscar-paymentexpress</a></li>
            <li><a href="https://github.com/django-oscar/django-oscar-accounts">django-oscar-accounts</a></li>
        </ul>
        <a id="view_preview" href="{% url 'checkout:preview' %}" class="btn btn-primary btn-lg">{% trans "Continue" %}</a>
    {% endblock payment_details_content %}
{% endblock payment_details %}

当我点击“继续”时,我被带到一个类似于预订页面的页面,其中付款方式为空。当我点击它的“更改”时,它会带我回到屏幕截图上的页面。

我的问题是如何让信用卡与此设置一起使用?有没有更好的方法来做这件事?我对 Django 有点熟悉,但是这个看似简单的任务似乎需要大量的知识和/或大量的重新发明轮子。后者肯定是这样,因为没有任何关于这方面的文档或教程,但据称许多网站使用 Django-Oscar。

感谢任何帮助或建议。

【问题讨论】:

  • 我假设通过常规结帐您想要“Paypal Payflow Pro”,为此您需要一些比更简单的“Paypal Express”选项更复杂的自定义。 Docs on required customization
  • 一般来说,我建议您参考多个实现 django-oscar 支付的库,并根据您的业务需求合并类似的代码(因为缺乏文档/示例)
  • @shad0w_wa1k3r 是的,正如我所说,这方面的文档几乎没有。
  • 这可能没有意义。如果创建者希望您花时间学习和理解他们的代码以使用这些库,那么您不妨自己从头开始编写。这是一种困扰许多开源项目的疾病。
  • 我们不要忘记,好的文档很难编写,而且需要时间和精力。此外,支付集成总是很困难是有原因的,因为有很多不同地区的提供商,而且业务需求可能会影响各种需求的流程。 Oscar 使权衡尽可能灵活,这意味着您必须熟悉它的内部工作原理。

标签: python django paypal braintree django-oscar


【解决方案1】:

从 django-paypal 存储库查看 sandbox 代码,特别是 templates 文件夹、settings.pyurls.py .我按照说明将必要的贝宝密钥添加到 settings.py 以及 urls.py 但未能复制模板,因为记录得不够仔​​细。

对我来说,只需添加至少与沙盒相同的模板,就可以将您正在查看的屏幕替换为有效的 paypal 按钮。特别是,sandbox/templates/checkout/payment_details.html 似乎是代替您看到的提醒消息而呈现的内容 - 请注意,该模板同时具有 Express 和 Flow 选项,因此请仅使用您的网站设置使用的内容。

【讨论】:

    【解决方案2】:

    将以下代码添加到oscar/checkout/preview.html,同时更改客户端ID#

    <body>
    <div class="col-sm-5 col-sm-offset-7">
    
            <!-- Set up a container element for the button -->
         <div id="paypal-button-container" ></div>
    
        <!-- Include the PayPal JavaScript SDK -->
        <script src="https://www.paypal.com/sdk/js?client-id={{'Askdlsfhslfkdlfkdsflskd-wkJzFrkfldfkjhdlkfrW3-5U-RW0-ZsZskflsfu_YT-85r'}}&currency=PLN&locale=pl_PL"></script>
    
        <script>
             // Render the PayPal button into #paypal-button-container
            paypal.Buttons({
                            style: {
                                layout: 'horizontal',
                                size: 'small',
                                color:  'blue',
                                shape:  'rect',
                                label:  'pay',
                                height: 44,
                                tagline: 'true'
                            },
                                 enableStandardCardFields: false, 
                // Set up the transaction
                createOrder: function(data, actions) {
                    return actions.order.create({
                        purchase_units: [{
                            amount: {
                                    value: JSON.parse({{ order_total.incl_tax }}) // pass variable with amount to script
                               // <!-- value: '0.01', -->
                            }
                        }]
                    });
                },
    
                // Finalize the transaction
                onApprove: function(data, actions) {
                    return actions.order.capture().then(function(details) {
                        // Show a success message to the buyer
                        alert('Transaction completed by ' + details.payer.name.given_name + '!');
                    });
                }
    
    
            }).render('#paypal-button-container');
        </script>
    
    </div> 
    </body>
    
    

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 2013-08-22
      • 2013-12-10
      • 1970-01-01
      • 2021-09-15
      • 2014-06-22
      • 2016-12-16
      • 2011-11-24
      • 2019-07-15
      相关资源
      最近更新 更多