首页 文章

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

提问于
浏览
3

我正在尝试将Stripe支付网关集成到Django oscar,这是一个电子商务网站,在网上销售像杂货这样的实体商品 . 我使用python 3.6.3,Django 2.0,Django-oscar 1.6,条带1.82.2 .

Method 1

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

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

我已经注册了一个条带帐户,并使用我的可发布密钥和测试密钥来配置条带 . 问题是,当我尝试使用标签"Pay with Card"提供的按钮付款时,它会收集我的卡信息,然后当我点击按钮时,它在这张图片中显示"Some money will be debited from the card":Image of Preview page

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

虽然我已经用我的卡付了钱 . 我猜奥斯卡似乎不知道付款已经通过条纹完成了吗?但我不知道如何解决这个问题 .

Method 2 :我尝试使用dj-stripe,在这里找到:

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

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

我尝试使用官方的django-oscar repo,链接在这里:https://github.com/django-oscar/django-oscar-stripe,这个存储库就像五年了,我不认为它与我的Django oscar版本兼容 .

Method 3 :我尝试使用stripe.js和elements并创建我的表单来接受卡片:

< 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/")

然后我在条带仪表板中创建了一个webhook,并将其链接到我的本地URL,每次有条带的响应通过web-hook发送,这个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)

截至目前,我可以从我的仪表板跟踪各种事件或日志,以及创建客户,收费以及发送响应的Web挂钩等事件正常工作,但我可以't figure out how can I complete the payment such that Django-oscar can also know that the payment is done and it doesn' t显示"No payment was required":Thank you page

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

2 回答

  • 1

    当您检查条带仪表板("Developer > Logs" section)中的日志时,您是否看到了创建令牌,客户和费用的请求?这些要求是否成功?你看到有什么错误吗?

    关于Django Oscar,我不熟悉它,所以不确定下面的内容是否会有所帮助 .

    但是我查看了Django Oscar code,当订单记录没有添加任何来源(即 order.sources.all 返回空)时,似乎 thank_you 模板显示了"No payment was required"消息:

    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 .

    • 查询源模型并检查是否有任何记录与特定订单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集成的方法,这是一种简单的方法 .

    • 首先从此处创建一个条带帐户:https://stripe.com/,您将获得一个可发布的密钥和一个密钥,您可以在登录到开发人员> API密钥下的条带仪表板后查看它们 .

    • 在你的django oscar代码方面 . 从奥斯卡分出结帐应用程序,将其添加到INSTALLED_APPS = get_core_apps(['checkout']) . 要知道如何分叉应用程序,您可以从文档中关注此链接:https://django-oscar.readthedocs.io/en/latest/topics/customisation.html#fork-oscar-app

    • 在结帐时创建一个名为facade.py的文件,将仪表板中的密钥复制到settings.py文件中并按照此链接中的建议进行其他更改:_j73846_在django oscar组上,它恰好 Headers 错误 . 只是按照这整页完成 .

相关问题