1

我已经构建了一个 Web 应用程序,我希望将cardsave 的直接支付 API 集成到应用程序中。我想知道是否有人对最好的方法有任何建议。

Cardsave 提供标准的集成代码:下载网关集成包 ZIP 文件

付款后,我需要将 CrossPaymentsReference 和付款金额存储在我的数据库中,其余的我将留给cardsave 的 api 我已经想到了一些可能可行的解决方案:

1) 对所有代码和成功支付使用 Views,并使用 Ajax 在成功完成时使用 crossPaymentReference 和支付金额更新数据库,因为它涉及对代码的最少编辑,但确实存在轻微的安全风险,因为它发送在客户端参考。

2) 使用支付系统类创建一个库,将预处理支付和处理支付代码放入控制器并将表单复制到视图中,并且只需一个小模型来更新成功支付的数据库。(我猜这是最好的方法。)

3) 编辑所有内容并构建代码的 MVC 版本

4

1 回答 1

4

我最新的项目在 CI 2.0 上运行。我已经成功集成了诸如 Card Save 之类的支付系统(在我的例子中,我使用的是比利时公司 Ogone)。

下面我详细介绍了我是如何实现订单和支付系统的。

我能给你的建议如下。

  • 将您的产品、订单和付款保存在单独的表格中。通过参考表将产品链接到订单(不要在订单的字段中存储例如产品 ID 列表)
  • 允许一个付款只能有一个订单,但一个订单可以有多个付款(但只能支付一个)。这样,当付款失败时(例如,用户在 Card Saves 付款页面上按下取消),您可以在您身边创建一个新的付款并让用户重试(除非 Card Save 接受您使用相同的付款 ID 进行 2 次付款请求)。
  • 创建一个单独的库(不是控制器)来处理成功支付的订单。例如,该库将激活用户购买的订阅,或为某人发出工作订单以运送产品。通过将其保存在单独的库中,您可以扩展其功能(例如,如果对于特定产品,您需要做一些新的事情)而无需触及您的支付逻辑(从而防止大量重新测试)。
  • 在发布数据时生成哈希,或将用户重定向到结帐页面、准备付款的页面并每次重新计算哈希以防止有人篡改您发布的数据或 URL 中的数据。
  • 确保在没有 AJAX 的情况下一切正常,然后添加 AJAX。

基本上我想出的订购流程分为如下:

  1. 用户将服务(我不销售实体产品)添加到购物篮(使用 CI 购物车的修改版本)
  2. 完成后,用户单击“订购产品”,向控制器 Place_order 发送 POST。控制器 Place_order 执行以下操作:
    • 检查用户是否仍然登录(在我的情况下,每个人都需要先注册)
    • 获取购物车中的产品并检查它们是否真的存在于数据库中(你永远不知道)
    • 在数据库中创建一个新订单并将产品添加到数据库中的订单中
  3. Place_order 不输出任何内容,但在成功时将用户重定向到控制器 Checkout。这里我不使用 POST。这样您可以重复使用 URL(例如,如果用户决定停止,他可以稍后继续付款)。URL 包含订单 ID 和哈希。
  4. Checkout 控制器执行以下操作
    • 重新计算hash,看看是否没有人篡改URL
    • 检查订单是否存在且尚未付款
    • 检查订单是否属于登录用户
    • 如果付款尚不存在,请创建付款
    • 显示带有“取消订单”和“支付订单”按钮的视图。这实际上是一个在隐藏字段中包含支付 ID 和支付 ID 哈希的表单。
  5. 单击“支付订单”时,会对控制器 Pay_order 进行 POST。我不使用 GET,因为我希望用户仅通过发布由 Checkout 控制器设置的数据来访问此页面。如果他们使用 GET 进入页面,则会引发错误。该控制器执行以下操作:
    • 重新计算哈希以查看没有人篡改发布的数据
    • 检查付款是否存在且尚未付款
    • 如果一切正常,则编写包含要发布到支付服务的必要信息的视图
    • 显示视图。
    • 当用户按下“转到支付服务”时,所有数据都会发布到用户执行支付的 Ogone
  6. 当支付完成(正确与否)时,Ogone 将用户重定向回我到控制器 Payment_successfull 或 Payment_other(用于错误等)。在 Payment_succesfull 中,我调用了一个以支付 ID 作为输入的库 Purchase_activator。这个查找订单并激活用户刚刚支付的服务。在另一种情况下(出错时),用户会看到一个带有正确错误消息的视图以及重试或取消的选项。
于 2012-10-05T13:49:51.237 回答