将卡支付与Codeigniter集成



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

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

当付款时,我需要将CrossPaymentsReference和付款金额存储在我的数据库中,其余的我将留给cardsave的api。我已经想到了几个可能有效的解决方案:

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

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

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

我的最新项目运行在CI 2.0上。我已经成功地集成了像Card Save这样的支付系统(在我的案例中,我使用的是比利时公司Ogone)。

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

我能给你的建议如下。

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

基本上,我提出的订购流程划分如下:

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

最新更新