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



我正在尝试将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

我已经注册了一个条带帐户,并使用我的可发布密钥和测试密钥来配置条带。问题是,当我尝试使用标签"用卡支付"提供的按钮付款时,它会收集我的卡信息,然后当我单击该按钮时,它显示"一些钱将从卡中扣除",如下图所示: 预览页面的图像

然后在我单击下订单按钮后,它向我显示以下内容: 确认页面的图像

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

方法2: 我尝试使用dj条纹,在这里找到:

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 ,这个存储库就像五年前一样,我认为它与我的 Django 奥斯卡版本不兼容。

方法3: 我尝试使用条纹.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/")

然后我在条纹仪表板中创建了一个 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)

截至目前,我可以从我的仪表板跟踪各种事件或日志,以及创建客户、收费和发送响应的网络钩子等事件工作正常,但我无法弄清楚如何完成付款,以便 Django-oscar 也可以知道付款已完成并且它没有显示"不需要付款": 谢谢页面

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

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

  1. 首先从这里创建一个 stripe 帐户:https://stripe.com/,您将获得一个可发布的密钥和一个私有密钥,您可以在登录 Stripe 仪表板的开发者> API 密钥下查看它们。

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

  3. 在结帐下创建一个名为 façade.py 的文件,将仪表板中的密钥复制到 settings.py 文件中,然后按照以下链接中的建议进行其他更改: Stripe 支付网关集成在 django 奥斯卡组上,它恰好标题错误。只需按照整个页面进行操作即可完成。

当您在 Stripe 管理平台("开发者>日志"部分)中查看日志时,您是否看到创建令牌、客户和费用的请求?这些请求是否成功?你看到任何错误吗?

关于姜戈奥斯卡,我不熟悉它,所以不确定以下内容是否会有所帮助。

但是我看了一下 Django 奥斯卡代码,当订单记录没有添加任何来源时(即返回空order.sources.allthank_you模板似乎会显示"无需付款"消息:

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

因此,可能是在您的handle_payment代码中,您可能没有按照此食谱或您列出的电子邮件线程中的建议将源记录正确添加到当前订单记录中。

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

  • 检查 Stripe 控制面板中的日志,看看您是否正确创建了费用。

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

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

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

最新更新