Tigshop开源电商系统对接ERP:支付成功只推队列,回调里别硬刚

举报
电商系统程序猿 发表于 2026/08/07 16:55:11 2026/08/07
【摘要】 支付回调里 curl ERP?停。现在就停。慢了微信重试。重了订单状态乱。Tigshop开源电商系统那套支付幂等,会被你亲手拆掉。我见过同步打仓库,回调超时,订单卡在「支付中」——仓库那边货已经开始拣了。你说邪门不邪门。ERP 对接不是 Tigshop 标配,是二开。但姿势要对:支付成功只推队列,别在回调里硬刚 HTTP。 正确姿势就一个PaymentService::paySuccess(...

支付回调里 curl ERP?停。现在就停。慢了微信重试。重了订单状态乱。Tigshop开源电商系统那套支付幂等,会被你亲手拆掉。我见过同步打仓库,回调超时,订单卡在「支付中」——仓库那边货已经开始拣了。你说邪门不邪门。

ERP 对接不是 Tigshop 标配,是二开。但姿势要对:支付成功只推队列,别在回调里硬刚 HTTP。

正确姿势就一个

PaymentService::paySuccess() 里只丢队列:

<?php
use app\job\ErpPushJob;
use think\facade\Queue;

Queue::push(ErpPushJob::class, [
    'order_id' => $orderId,
    'event'    => 'paid',
]);

别在这儿写 HTTP。手别痒。

Job 里再说话

<?php
namespace app\job;

class ErpPushJob
{
    public function fire($job, $data)
    {
        $order = Order::find($data['order_id']);
        if (!$order || $order['erp_pushed']) {
            $job->delete();
            return;
        }
        $resp = ErpClient::pushPaidOrder($order);
        if ($resp['ok']) {
            Order::where('order_id', $order['order_id'])->update(['erp_pushed' => 1]);
            $job->delete();
        } else {
            $job->release(60);
        }
    }
}

签名、推送、日志、重试、补偿表。order_sn 去重。对方也要幂等。测试环境单独 ERP_BASE_URL。别推生产。

回写同理

验签,改状态,写运单。重复通知不能插两行物流。插两行,仓管会来找你喝茶。

白板比 IDE 重要

取消通不通知?部分退款怎么办?先画再写。代码漂亮、状态糊,一样翻车。补偿表加重推按钮。比手改状态香一百倍。第一周盯队列失败次数。别手改状态。手一改,债往后推。

对接方常犯的错

他们也在回调里同步打你们。两边互等,死锁。约定:你们推队列,他们异步消费。消费失败他们重试,别回调你们支付接口。文档写清楚。写不清楚,联调能拖一个月。一个月够你写十遍 Job 了。

监控

队列堆积、失败率、平均延迟。Admin 加一页「ERP 推送记录」,失败的一键重推。仓管催发货的时候,你能告诉他是 ERP 卡了还是商城卡了。能告诉,你就不是背锅侠。不能告诉,你就是背锅侠。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。