将卡支付与Codeigniter集成

时间:2012-10-04 12:57:58

标签: php e-commerce codeigniter-2

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

Cardsave为集成提供标准代码:Download Gateway Integration Pack ZIP file

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

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

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

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

1 个答案:

答案 0 :(得分:4)

我的最新项目在CI 2.0上运行。我已经集成了一个支付系统,如Card Save成功(在我的情况下,我使用Ogone,这是一家比利时公司)。

下面我详细介绍了我如何实施订单和付款系统。

我可以给你的建议如下。

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

基本上我提出的订购流程分为以下几个部分:

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