php - 调用外部 API 的 SQL 事务

标签 php mysql transactions

我想知道您对这种情况有何看法。我正在代表客户调用外部 API 休息服务,我需要保存该操作的记录,并且我想确保仅在外部 API 操作成功时才​​保存(或更新)记录但是如果API 成功,必须保存记录。虽然我没有使用它,但我知道 SQL 事务的概念中有一个解决方案,可以确保整个事务被保存或不保存。但是,如果部分交易调用外部 API(例如信用卡 API 或银行帐户)怎么办?您能给我推荐一些相关文档吗?

实际上,我与创建 API 的人员有着密切的联系,可以要求他们更改响应或在需要时做一些特殊的事情。

这是一个用例(鞋店):

我们网站上的用户想要购买鞋子。他在表格中写下了他的信用卡号码,然后单击“提交”。我们正在采取两项行动:

  1. 对信用卡提供商的 API 调用

  2. 在 API 调用后在数据库中插入一行以及信用卡提供商的响应

这两个操作都有失败的可能性。我不确定应该如何排序这些操作。如果仅在 API 调用之后插入行,我如何确保至少我知道插入行时出现了问题?因为我不希望出现用户因信用卡中的某些内容而被收取费用的情况,而我没有这方面的记录

最佳答案

这是我的临时解决方案,请告诉我您的想法。 它由六个步骤组成,每个步骤都依赖于前一个步骤。它基于名为 payment_successful 的额外列,值为 0 或 1。插入行时,它设置为 0,并且在信用卡提供商 API 返回成功的交易响应后,它会更新为 1。为了确保所有数据库调用都成功每次更改后我都会用 select 检查它。我将以我用信用卡购买鞋子的例子来演示这一点。假设用户点击确认显示购买按钮:

  1. 在购买表中插入一行(catalogue_id=132,price=500$,cerdit_card_number=8988123456, payment_successful=0)并获取purchase_id PK

  2. 按(之前插入的)purchase_id 从表中选择行。这可确保该行已成功插入。否则(通过电子邮件)提醒出现问题

  3. 调用信用卡 API 提供商(结果 =curl( http://api.american-express.com/?credit_card_number=8988123456 ))

  4. 检查信用卡 API 的结果,检查是否成功 (if(result===1)),否则发出错误提示

  5. 通过 buy_id 设置 payment_successful = 1 更新行

  6. 通过purchase_id从表中选择行并检查row. payment_successful == 1。否则发出错误提示

当然,上面的所有 URL 都不是真实的

关于php - 调用外部 API 的 SQL 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220494/

相关文章:

php - Zend 3 传递给 Application\Controller\IndexController::__construct() 的参数 1 必须是 的实例,没有给出,

php - 如何应对本土化?有没有我应该遵循的标准?

php - DQL查询表获取上周创建的记录

php - 在 while 循环中使用 php 函数来获取同一列中的值和值的计数

Android开发-Unknown Host异常问题

java - Web 中 OpenJPA 错误的原因 - 使用托管事务时无法访问 EntityTransaction

java - Apache 点燃。 QueryCursor 无需事务模式即可工作,即使直接声明事务也是如此。为什么?

php - 使用 PHP Curl 登录到远程 SSL 站点失败

SQL 服务器 : how transactions work

mysql - 如何使用 Chive 添加外键?