【问题标题】:Implementing Django-oscar COD实现 Django-oscar COD
【发布时间】:2017-09-10 12:56:47
【问题描述】:

现在已经 1 周了,我无法弄清楚在 django-oscar 中实现 COD 的方法。如果有人至少可以让我领先一步来完成这项任务,我将非常感激。我尝试使用少数Github 存储库,但它们要么已过时,要么不够清晰,无法与项目一起使用。一个良好的开端足以让我从头开始。 谢谢

【问题讨论】:

    标签: python django django-oscar


    【解决方案1】:

    我最近在 django-oscar 上实现了 COD。这是您需要做的。

    您应该了解 oscar 的结帐流程是如何运作的。 让我向你展示一下。 oscar 中有一个“结帐”应用程序,它处理所有付款,下订单之类的东西。所以,首先你需要用下面的命令 fork 那个应用程序。

    ./manage.py oscar_fork_app checkout apps/shop
    

    然后将其添加到INSTALLED_APPS的设置中。

    现在,如果您仔细查看结帐应用程序的 views.py,就会发现这个类 PaymentDetailsView 处理下订单和付款。

    现在,在您的 preview.html 页面上,您可以将网关选项添加为“cod”。当用户选择此“cod”选项并提交“下订单”时,您可以在分支类PaymentDetailsViewhandle_payment 方法中检查提交的网关代码。

    CorePaymentDetailsView = get_class('checkout.views', 'PaymentDetailsView')
    
    class PaymentDetailsView(CorePaymentDetailsView):
        """
        currently used to redirect to preview page
        Handles the payment and cod.
        """
        def handle_payment(self, order_number, total, **kwargs):
            self.amount = float(total.excl_tax)
            gateway_code = self.request.POST.get('gateway_code', None)
            if gateway_code and gateway_code == 'cash-on-delivery':
                # Record payment source and event
                source_type, is_created = SourceType.objects.get_or_create(
                    name='cash-on-delivery')
                source = source_type.sources.model(
                    source_type=source_type,
                    amount_allocated=total.excl_tax)
                self.add_payment_source(source)
                self.add_payment_event('CREATED', total.excl_tax)
                return
    

    当你从handle_payment方法返回时,它会继续执行同一个类的submit方法并下单。

    之后,您可以在仪表板上提及,该产品具有cash-on-delivery 选项。交付后,您可以将另一个付款事件捕获为'CASH-RECEIVED'

    询问是否有其他疑问。

    【讨论】:

    • 让我试试,我会告诉你的。感谢您的帮助,我真的对它失去了希望。
    • 是的。不用担心。慢慢来。
    【解决方案2】:

    我还没有为 Oscar 实现 COD,但我已经在 oscar 源代码中挖掘了数周来寻找另一个非标准的支付集成。困难的部分是支付涉及结账、购物篮、合作伙伴、订单和支付应用程序。保留原始 checkout views.py 文件的源代码,并经常参考。

    那么关键步骤是什么:

    1. 所有付款处理都发生在结账应用的 PaymentDetailsView 中,因此您需要一个分叉的结账应用开始创建自定义 PaymentDetailsView 子类。
    2. 您需要覆盖创建订单号的 submit() 方法,冻结购物篮,将其保存在会话中并发送 pre_payment 信号(只需复制/粘贴源代码)。因为这里不会进行付款,所以此时您需要从自定义 submit() 实现中删除该部分。
    3. 然后您必须继续,就像付款已经发生一样,并调用 handle_order_placement(),这将调用 handle_successful_order()
    4. 之后,当您的产品到货时已付款时,您需要对相关订单号执行 handle_payment(),并触发 post_payment 信号。

    简而言之就是这样,但显然还需要一些异常处理。希望这能让你开始!

    【讨论】:

    • 感谢您的帮助,我会实施的。
    • 你不应该重写 submit() 方法。只需要实现handle_payment()方法即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多