在 django-oscar 中集成包含重定向的付款方式

2024-04-06

我正在使用 django-oscar 框架开发一个购物网站,实际上我正在使用他们的沙箱网站。我想在结帐流程中添加付款功能,但问题是,我完全困惑了!

我已阅读此链接:“奥斯卡的支付集成文档” http://django-oscar.readthedocs.org/en/latest/howto/how_to_integrate_payment.html

我得到了大局的信息。我还在结账应用程序中阅读了文件views.py,但我有一些在网上找不到的问题。

我的问题是我应该重写或创建哪些方法/类来处理以下过程:

用户请求付款后,我应该向银行发送请求并向他们提供所需的参数(代码中的 pay_request_parameters )

然后,他们会发送一个 ID,确认我的访问权限,然后我应该将该 ID 发布到一个地址并将用户重定向到银行的网页。

用户成功向银行付款后,他们会通过我在第一步中提供的回调网址来通知我。

有了这些信息,我应该验证付款是否成功,如果成功,我应该要求银行结算,然后将钱汇给我。

现在我的代码执行了前两个步骤,但我不知道如何在沙箱中重定向后处理该过程。这是我的代码:

from oscar.apps.checkout import views
from oscar.apps.payment import models
from oscar.apps.payment.exceptions import *
import requests
import datetime

mellat_services_url = 'https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl'
start_pay_url = 'https://bpm.shaparak.ir/pgwchannel/startpay.mellat'
terminal_id = 'xxx'
username = 'xxx'
password = 'xxx'

# Subclass the core Oscar view so we can customise
class PaymentDetailsView(views.PaymentDetailsView):

    def handle_payment(self, order_number, total, **kwargs):
        # Talk to payment gateway.  If unsuccessful/error, raise a
        # PaymentError exception which we allow to percolate up to be caught
        # and handled by the core PaymentDetailsView.

        # mellat cycle start 
        local_date = str(datetime.date.today())[0:4] + str(datetime.date.today())[5:7] + str(datetime.date.today())[8:10]
        local_time = str(datetime.datetime.now().time())[0:2] + str(datetime.datetime.now().time())[3:5] + str(datetime.datetime.now().time())[6:8]
        # call bpPayRequest and get refId
        pay_request_parameters = {'terminalId': terminal_id, 'userName': username, 
                                'userPassword': password, 'orderId': order_number, 
                                'amount': total.incl_tax, 'localDate': local_date,
                                'localTime': local_time, 'additionalData': ""
                                'callBackUrl': 'mysite.com/checkout/preview/'} 

        pay_request_answer = requests.post(mellat_services_url, pay_request_parameters)

        if not pay_request_answer.split(",")[0] == 0:
            response_code = pay_request_answer.split(",")[0]
            if response_code[0] == '1':
                raise UnableToTakePayment()
            else: 
                raise PaymentError()

        requests.post(start_pay_url, pay_request_answer.split(",")[1])
        raise RedirectRequired(start_pay_url)

        # post the refId to bank and then redirect customer to the bank
        # apparently wait for the bank ( like for 10 mins ) to get the payment status
        # if the bank responded with success, the you verify the payment with a post to the bank
        # if everything was verified, tell the bank for a settlement

        # mellat cycle end

#The rest should be implemented but I dont know where I should put this
#All I know is that it should be done after the verification with the data
#sent from the bank. 

        reference = gateway.pre_auth(order_number, total.incl_tax, kwargs['bankcard'])

        # Payment successful! Record payment source
        source_type, __ = models.SourceType.objects.get_or_create(
            name="SomeGateway")
        source = models.Source(
            source_type=source_type,
            amount_allocated=total.incl_tax,
            reference=reference)
        self.add_payment_source(source)

        # Record payment event
        self.add_payment_event('pre-auth', total.incl_tax)

提前致谢。


我遇到了类似的问题,我所做的是将 callBackUrl 从银行重定向到一个视图,该视图的实现如下:

class CustomCheckoutDone(OrderPlacementMixin, RedirectView):
"""
here we verify payment was done and place the actual order
then redirect to thank you page
"""
permanent = False

def get_redirect_url(self, pk):
    basket = Basket.objects.get(pk=self.checkout_session.get_submitted_basket_id())
    basket.strategy = CustomStrategy()
    order_number = self.checkout_session.get_order_number()
    shipping_address = self.get_shipping_address(basket)
    shipping_method = self.get_shipping_method(basket, shipping_address)
    shipping_charge = shipping_method.calculate(basket)
    billing_address = self.get_billing_address(shipping_address)
    order_total = self.get_order_totals(basket, shipping_charge=shipping_charge)
    order_kwargs = {}
    # make sure payment was actually paid
    CustomPayment.objects.get(order_number=order_number, payed_sum=str(float(order_total.incl_tax)))
    user = self.request.user
    if not user.is_authenticated():
        order_kwargs['guest_email'] = self.checkout_session.get_guest_email()
    self.handle_order_placement(
        order_number, user, basket, shipping_address, shipping_method,
        shipping_charge, billing_address, order_total, **order_kwargs
    )
    return '/checkout/thank-you/'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 django-oscar 中集成包含重定向的付款方式 的相关文章

随机推荐

  • 为什么说微软堆栈成本高? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 SQLite 上连接表时如何进行更新?

    我试过 UPDATE closure JOIN item ON item id id SET checked 0 WHERE ancestor id 1 And UPDATE closure item SET checked 0 WHERE
  • 穷人的 SQL 枢轴。将每个用户的问题和答案列在一行中

    当前查询 SELECT order id AS OrderNumber ordName ordLastName question answer FROM cart survey JOIN orders ON cart survey orde
  • ASP.NET MVC 2.0 Prev 1 和 SPARK?

    我正在尝试将 ASP NET MVC 1 0 应用程序升级到 2 0 预览版 1 我使用 Spark 作为视图引擎 问题 Spark 使用 System Web MVC 1 0 0 0 因此我获取了源代码并使用 2 0 0 0 重新编译并使
  • 无法解析 ACRA 4.7.0 中的方法“formKey”

    我今天尝试为我的 Android 项目设置 acra 但没有成功 我按照说明操作 在 gradle 中导入了 acra lib 编译 ch acra acra 4 7 0 然后我添加了这个 ReportsCrashes formKey ma
  • 告诉 urllib2 使用自定义 DNS

    我想告诉urllib2 urlopen or a 定制开瓶器 使用127 0 0 1 or 1 来解析地址 我不会改变我的 etc resolv conf 然而 一种可能的解决方案是使用类似的工具dnspython查询地址和httplib构
  • 在 Kotlin 中制作函数块

    我很高兴这可能已经得到解答 但我无法找到适合我的解决方案 Tl dr 如何制作功能块 我有以下用 Kotlin 为 Android API 28 编写的 BLE 相关代码 override fun onServicesDiscovered
  • 如何解决 SceneKit double notsupported 错误?

    过去几天我一直在研究 iOS 版 SceneKit 我在尝试创建自定义几何图形时遇到了一个问题 每当我尝试显示几何图形时 它都不会绘制 并在运行时向我显示此错误 SceneKit 错误 C3DRendererContextSetupResi
  • C# 无法从应用程序成功启动中打开串行端口

    因此 我正在打开这个端口并将端口名称保存在我的应用程序设置中 当我加载表单时 它尝试打开端口 但失败了 仅在单击我的 开放端口 按钮后EXACT端口打开时使用相同的代码 然后 如果我单击 关闭端口 按钮并重新打开表单 它就可以工作了 它会自
  • System.Windows.Forms.HtmlDocument 不包含 GetElementByID 的定义

    您能解释一下为什么我会收到此错误吗 private void startButton Click object sender EventArgs e HtmlElement mainNav webBrowser1 Document GetE
  • Perl 中的列表运算符优先级

    我正在读 Beginning Perl 一书 它给出了以下两条语句 print Test one 6 gt 3 3 gt 4 n print Test two 6 gt 3 and 3 gt 4 n 第一行不打印任何内容并换行 第二行打印
  • 创建向量空间

    我有一个问题 我有很多文档 每一行都是由某种模式构建的 当然 我有这一系列的图案 我想创建一些向量空间 然后通过某种规则来向量这个模式 我还不知道这个规则是什么 即使这个模式像我的向量空间的 质心 然后向量当前文档的每一行 再次按照此规则
  • 如何在 .NET Core 应用程序 Docker 映像中包含依赖项?

    我正在尝试构建 NET Core 应用程序 Docker 映像 但我不知道如何将项目的 NuGet 依赖项获取到图像中 为简单起见 我创建了一个 NET Core 控制台应用程序 using System using Newtonsoft
  • 使用 C# 生成随机数

    我正在考虑生成 1 到 500 万之间的随机数 这个过程不必很快 尽管如果快的话就好了 但它必须尽可能随机 我知道没有什么是随机的 我有多种种子数据源 我不确定是否 NET http en wikipedia org wiki NET Fr
  • 在 Javascript 中将变量名转换为字符串?

    我在 Stack Overflow 上看到过一些关于此问题的其他帖子 但答案似乎总是创建一个带有键 值对的对象 这似乎不是我目前的情况所需要的 我想要做什么 我有不同的数组 其中可能包含用户名 我想检查每个数组 看看用户名是否作为其中的值存
  • 哪些错误适用于不同的 FindBugs 报告级别?

    根据 Ant 任务 报告级别是低 中 高设置 用于查找不同严重程度级别的错误 然而 我找不到任何东西可以解释哪些错误适用于这些不同的报告级别 是否有某个地方可以提供此功能 即使我需要在源代码中查看它 不幸的是 错误类型和优先级之间的关联存在
  • SwiftUI UIViewRepresentable UITextView 绑定

    目前 SwiftUI 本身不支持多行文本输入 希望很快就会添加此功能 所以我一直在尝试使用组合框架来实现 UIKit 中的 UITextView 它支持多行输入 但是我得到的结果好坏参半 这是我创建的用于制作文本视图的代码 struct M
  • 使用默认值初始化方法的参数

    如果未将显式值传递到方法中 我想用一些默认值初始化方法的参数 如下所示 class Example def init self data self default data self data data def default data r
  • Safari 上使用 React 的日期选择器

    我的应用程序使用 Form Input 来自语义 UI 反应 https react semantic ui com collections form 库插入日期 它在 Chrome 和 Firefox 上显示日期选择器 但在 Safari
  • 在 django-oscar 中集成包含重定向的付款方式

    我正在使用 django oscar 框架开发一个购物网站 实际上我正在使用他们的沙箱网站 我想在结帐流程中添加付款功能 但问题是 我完全困惑了 我已阅读此链接 奥斯卡的支付集成文档 http django oscar readthedoc