如何将 Stripe 支付网关与 Django Oscar 集成?

Posted

技术标签:

【中文标题】如何将 Stripe 支付网关与 Django Oscar 集成?【英文标题】:How to integrate Stripe payments gateway with Django Oscar? 【发布时间】:2018-12-17 00:21:19 【问题描述】:

我正在尝试将 Stripe 支付网关集成到 Django oscar 的电子商务网站,该网站在线销售杂货等实物商品。我使用 python 3.6.3、Django 2.0、Django-oscar 1.6、stripe 1.82.2。

方法一

所以我在 django-oscar 组中关注了这个链接:

https://groups.google.com/forum/#!searchin/django-oscar/handle_payment$20override%7Csort:date/django-oscar/Cr8sBI0GBu0/PHRdXX2uFQAJ

我已经注册了一个 stripe 帐户并使用我的可发布密钥和测试密钥来配置 stripe。问题是,当我尝试使用带有标签“用卡支付”的按钮进行支付时,它会收集我的卡信息并然后当我单击按钮时,它显示“将从卡中扣除一些钱”,如下图所示: Image of Preview page

然后在我点击下订单按钮后,它会显示: Image of confirmation page

虽然我已经用我的卡付款了。 我猜oscar似乎不知道付款已经通过stripe完成了?但我不知道如何解决这个问题。

方法二: 我尝试使用 dj-stripe,在这里找到:

https://github.com/dj-stripe/dj-stripe

但我阅读了 https://dj-stripe.readthedocs.io/en/stable-1.0/ 上的整个文档,似乎我只能将它用于需要订阅的产品,我的不需要订阅,并且 dj-stripe 的文档不完整。

我尝试了官方的 django-oscar repo,链接在这里: https://github.com/django-oscar/django-oscar-stripe ,这个存储库已经有 5 年历史了,我认为它与我的 Django oscar 版本不兼容。

方法三: 我尝试使用 stripe.js 和元素并创建我的表单来接受卡片:

< script src = "https://js.stripe.com/v3/" > < /script> <
  script >
  var stripe = Stripe('your_stripe_publishable_key');
var elements = stripe.elements();
// Custom styling can be passed to options when creating an Element.
var style = 
  base: 
    color: '#32325d',
    lineHeight: '18px',
    fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
    fontSmoothing: 'antialiased',
    fontSize: '20px',
    '::placeholder': 
      color: '#aab7c4'
    
  ,
  invalid: 
    color: '#fa755a',
    iconColor: '#fa755a'
  
;

// Create an instance of the card Element.
var card = elements.create('card', 
  style: style
);

// Add an instance of the card Element into the `card-element` <div>.
card.mount('#card-element');
card.addEventListener('change', function(event) 
  var displayError = document.getElementById('card-errors');
  if (event.error) 
    displayError.textContent = event.error.message;
   else 
    displayError.textContent = '';
  
);

// Create a source or display an error when the form is submitted.
var form = document.getElementById('payment-form');

form.addEventListener('submit', function(event) 
  event.preventDefault();

  stripe.createSource(card).then(function(result) 
    if (result.error) 
      // Inform the user if there was an error
      var errorElement = document.getElementById('card-errors');
      errorElement.textContent = result.error.message;
     else 
      // Send the source to your server
      stripeSourceHandler(result.source);
    
  );
);

function stripeSourceHandler(source) 
  // Insert the source ID into the form so it gets submitted to the server
  var form = document.getElementById('payment-form');
  var hiddenInput = document.createElement('input');
  var hiddenAmount = document.createElement('input');

  hiddenInput.setAttribute('type', 'hidden');
  hiddenInput.setAttribute('name', 'stripeSource');
  hiddenInput.setAttribute('value', source.id);
  form.appendChild(hiddenInput);

  hiddenAmount.setAttribute('type', 'hidden');
  hiddenAmount.setAttribute('name', 'amt');
  hiddenAmount.setAttribute('value', ' order_total.incl_tax|safe ');
  form.appendChild(hiddenAmount);

  // Submit the form
  form.submit();


<
/script>
<form action="/charge/" method="post" id="payment-form">
  % csrf_token % 
  <div class="form-row">
    <label for="card-element">
                Credit or debit card
            </label>
    <div id="card-element">
      <!-- A Stripe Element will be inserted here. -->
    </div>

    <!-- Used to display Element errors. -->
    <div id="card-errors" role="alert"></div>
  </div>
  <br>
  <!--<hr>-->
  <button class="btn btn-primary">Pay Now</button>
</form>

在我的 python views.py 文件中,我创建了一个条带电荷和来源。

@csrf_exempt
def stripe_payment(request):
    user = request.user
    source_id = request.POST.get("stripeSource", None)

    amount = request.POST.get("amt", None)
    stripe.api_key = "your_test_key"
    customer = stripe.Customer.create(
        email=email,
        source=source_id,
    )
    # print("Customer ID: ", customer['id'])
    amt = float(amount) * 100
    # print("Amount:", int(amt))
    int_amt = int(amt)
    charge = stripe.Charge.create(
        amount=int_amt,
        currency='cad',
        customer=customer['id'],
        source=source_id,
    ) 

    return HttpResponseRedirect("/checkout/preview/")

然后我在 stripe 仪表板中创建了一个 webhook 并将其链接到我的本地 url ,每次通过 web-hook 发送来自 stripe 的响应时,都会点击此 url。

@csrf_exempt
def demo_checkout(request):

    # Retrieve the request's body and parse it as JSON:
    event_json = json.dumps(json.loads(request.body), indent=4)
    # event_json = json.loads(request.body)

    # Do something with event_json
    print("Json event:", event_json)

    return HttpResponse(status=200)

到目前为止,我可以从我的仪表板跟踪各种事件或日志,以及创建客户、收费和发送响应的网络挂钩等事件工作正常,但我不知道如何我完成了付款,这样 Django-oscar 也可以知道付款已完成并且它不显示“不需要付款”: Thank you page

我已经尝试了所有这些方法,但它仍然不起作用。我愿意使用建议的任何其他方法或对我在迄今为止解释的任何方法中所做的改进。我是新手django-oscar 和一些代码和一些解释的答案会很有帮助。

【问题讨论】:

相关***.com/questions/33238655/… 【参考方案1】:

当您检查 Stripe 仪表板中的日志(“开发人员 > 日志”section)时,您是否看到创建令牌、客户和费用的请求?这些请求成功了吗?有没有发现任何错误?

关于 Django Oscar,我不熟悉,因此不确定以下内容是否有帮助。

但是我查看了Django Oscar code,当订单记录没有添加任何来源时,thank_you 模板似乎显示了“不需要付款”消息(即@987654328 @返回空):

https://github.com/django-oscar/django-oscar/blob/master/src/oscar/templates/oscar/checkout/thank_you.html#L94

因此,在您的handle_payment 代码中,您可能没有按照建议的in this recipe 或您列出的email thread 正确地将源记录添加到当前订单记录中。

为了进一步调试,我建议:

检查您的 Stripe 仪表板中的日志,看看您是否正确创建了 Charge。

查询 Source 模型并检查是否有任何记录与特定订单 ID 相关联

handle_payment 中的代码中添加一些额外的调试(日志/打印)语句,以检查它是否被调用以及它是否创建了应有的源记录:

http://django-oscar.readthedocs.io/en/releases-1.1/howto/how_to_integrate_payment.html#integration-into-checkout

【讨论】:

【参考方案2】:

我找到了一种将 Stripe 与 Django Oscar 集成的方法,这是一种简单的方法。

    首先从这里创建一个stripe账户:https://stripe.com/,你会得到一个可发布的key和一个secret key,你可以在登录到striped仪表板后在Developers > API keys下查看。

    在您的 django oscar 代码端。从 oscar 分叉结帐应用,将其添加到 INSTALLED_APPS+=get_core_apps(['checkout'])。要了解如何分叉应用,您可以点击文档中的此链接:https://django-oscar.readthedocs.io/en/latest/topics/customisation.html#fork-oscar-app

    在结帐下创建一个名为 facade.py 的文件,将仪表板中的密钥复制到 settings.py 文件中,并按照以下链接中的建议进行其他更改:Stripe payment gateway integration 在 django oscar 组上,它只是恰好标题错了。只需关注整个页面即可。

【讨论】:

以上是关于如何将 Stripe 支付网关与 Django Oscar 集成?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 worldpay 支付网关与 django 应用程序集成?

如何将新的支付网关与 django-payments 集成?

使用 ASP.Net 实现 Stripe 支付网关 [关闭]

WooCommerce Stripe 支付网关自定义 javascript 冲突

如何在条带支付网关中生成令牌

Stripe 支付网关如何为 WP 购物车工作?