Django-Oscar 将用户交替发送到“付款详细信息”和“预览”或“感谢”页面
Posted
技术标签:
【中文标题】Django-Oscar 将用户交替发送到“付款详细信息”和“预览”或“感谢”页面【英文标题】:Django-Oscar sends users alternately to 'payment-details' and 'preview' or 'thank-you' page 【发布时间】:2018-09-26 15:32:29 【问题描述】:我正在尝试截断 Django-Oscar 的结帐流程。假设我们从购物篮/购物车开始,默认流程如下所示:
-
用户点击“继续结帐”按钮
PaymentMethodView 被调用
“付款详情”页面加载
用户点击“继续”
Oscar 的“预览”加载。用户点击“下订单”并购买商品
用户被转到 Oscar 的“感谢”页面并收到一封电子邮件确认
我想要这个:
-
“继续结帐”按钮已替换为 PayPal Checkout Express 客户端 checkout.js 按钮
用户点击 PayPal 按钮并付款
用户被转到 Oscar 的“感谢”页面并收到一封电子邮件确认
问题是这样的:PayPal 按钮可以正常工作,并且每次都可以成功付款,但是 Oscar 会在付款后交替将用户发送到“付款详细信息”页面和“感谢”页面。说清楚:
-
用户购买了一件商品,并被发送到“谢谢”页面并收到一封电子邮件
用户购买了另一件商品,被发送到“付款详情”页面,但没有收到电子邮件,即使付款成功,Oscar 也没有注册购买
用户购买第三件商品并在步骤 1 中体验 Oscar 的响应
用户购买第四件商品并在步骤 2 中体验 Oscar 的响应
等等,无穷无尽
到目前为止,所有 url、视图和模型都可以完美运行。此时我唯一要做的就是用 PayPal 的按钮替换“继续结帐”按钮。
然后我删除了 PayPal 按钮,并恢复了“继续结帐”按钮,但只进行了一次编辑。按钮如下所示:<a href="% url 'checkout:index' %" class="...">% trans "Proceed to checkout" %</a>
。
我将'checkout:index'
替换为'checkout:preview'
以查看是否可以跳过“付款详细信息”页面。交替的情况继续。 Oscar 首先将用户引导至“预览”页面,然后在下一回合将用户引导至“付款详情”页面。
我也尝试过覆盖 PaymentMethodView:
from oscar.apps.checkout.views import PaymentMethodView as BasePaymentMethodView
from django.shortcuts import redirect
class PaymentMethodView(BasePaymentMethodView):
def get_success_response(self):
return redirect('thank-you')
“付款详情”和“感谢”页面之间的交替仍然存在。
我没有想法。可能出了什么问题?
【问题讨论】:
所以你已经覆盖了checkout.views.IndexView
对吧?你能展示你的(编辑的)来源吗?此外,您的basket
(其id
用于order_number
)在付款成功/失败后没有得到正确处理(冻结/解冻/重置)可能值得调查。除非您显示您的 PaymentDetailsView
或您的 IndexView
自定义设置,否则不能说任何话。
@AshishNitinPatil 我没有覆盖 IndexView 和 PaymentDetailsView。我确实玩了 PaymentDetailsView 一点点,但我把它恢复为默认值。我会看看篮子,看看情况如何。谢谢!
奇怪,那么我不确定您是如何处理几乎单页的结帐的。无论如何,篮子问题肯定会引发错误,因此,除非您看到错误,否则您不应该真正担心这一点。
【参考方案1】:
结帐视图使用 skip_conditions 和 pre_conditions 属性来确定要显示的视图,并且所有视图都实现了 get_pre_conditions() 和 get_skip_conditions() 方法,您可以使用它们来更改默认行为。因此,购买物品后可能不满足其中一些前提条件。
还有一个 PassedSkipCondition 和 FailedPreCondition 异常可用于重定向。
我会告诉你我是如何处理类似情况的。下面的方法来自我的自定义 PaymentDetailsView,我在其中覆盖了 skip_unless_payment_is_required。我的网上商店有一个手动取货选项,客户可以在其中下订单,但只在取货时付款。所以我提出了一个 PassedSkipCondition 异常来强制客户转到预览页面。
def skip_unless_payment_is_required(self, request):
# Check to see if payment is actually required for this order.
shipping_address = self.get_shipping_address(request.basket)
shipping_method = self.get_shipping_method(request.basket, shipping_address)
if shipping_method:
shipping_charge = shipping_method.calculate(request.basket)
# CUSTOMER WILL MANUALLY PICKUP ITEMS, SO SKIP PAYMENT DETAILS PAGE!
if shipping_method.code == 'MANUAL_PICKUP':
raise exceptions.PassedSkipCondition(url=reverse('checkout:preview'))
else:
...
【讨论】:
以上是关于Django-Oscar 将用户交替发送到“付款详细信息”和“预览”或“感谢”页面的主要内容,如果未能解决你的问题,请参考以下文章