我想知道您对这种情况有何看法。我正在代表客户调用外部 API 休息服务,我需要保存该操作的记录,并且我想确保仅在外部 API 操作成功时才保存(或更新)记录但是如果API 成功,必须保存记录。虽然我没有使用它,但我知道 SQL 事务的概念中有一个解决方案,可以确保整个事务被保存或不保存。但是,如果部分交易调用外部 API(例如信用卡 API 或银行帐户)怎么办?您能给我推荐一些相关文档吗?
实际上,我与创建 API 的人员有着密切的联系,可以要求他们更改响应或在需要时做一些特殊的事情。
这是一个用例(鞋店):
我们网站上的用户想要购买鞋子。他在表格中写下了他的信用卡号码,然后单击“提交”。我们正在采取两项行动:
对信用卡提供商的 API 调用
在 API 调用后在数据库中插入一行以及信用卡提供商的响应
这两个操作都有失败的可能性。我不确定应该如何排序这些操作。如果仅在 API 调用之后插入行,我如何确保至少我知道插入行时出现了问题?因为我不希望出现用户因信用卡中的某些内容而被收取费用的情况,而我没有这方面的记录
最佳答案
这是我的临时解决方案,请告诉我您的想法。 它由六个步骤组成,每个步骤都依赖于前一个步骤。它基于名为 payment_successful 的额外列,值为 0 或 1。插入行时,它设置为 0,并且在信用卡提供商 API 返回成功的交易响应后,它会更新为 1。为了确保所有数据库调用都成功每次更改后我都会用 select 检查它。我将以我用信用卡购买鞋子的例子来演示这一点。假设用户点击确认显示购买按钮:
在购买表中插入一行(catalogue_id=132,price=500$,cerdit_card_number=8988123456, payment_successful=0)并获取purchase_id PK
按(之前插入的)purchase_id 从表中选择行。这可确保该行已成功插入。否则(通过电子邮件)提醒出现问题
调用信用卡 API 提供商(结果 =curl( http://api.american-express.com/?credit_card_number=8988123456 ))
检查信用卡 API 的结果,检查是否成功 (if(result===1)),否则发出错误提示
通过 buy_id 设置 payment_successful = 1 更新行
通过purchase_id从表中选择行并检查row. payment_successful == 1。否则发出错误提示
当然,上面的所有 URL 都不是真实的
关于php - 调用外部 API 的 SQL 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220494/