-- 撤销核销的资金回退。 -- -- 核销会把延迟入账的钱从通道「待确认」确认给商户(钱进商户基本户)。撤销核销必须把钱要回来, -- 靠的是通道的【交易确认退款】接口:把已确认的金额退回商户的延迟户,重新变成不可结算、不可取现。 -- -- 回退期间 funds_confirmation_status 用 'reverting' 占位: -- 'pending' 钱在通道延迟户(从未确认过,或已回退成功) -- 'confirming' 已发出交易确认请求,结果未定 -- 'confirmed' 确认成功,钱在商户基本户 -- 'reverting' 已发出交易确认退款请求,结果未定——既不能当作钱在基本户,也不能当作钱已回到 -- 延迟户,因此撤销核销必须停在「已核销」等它收敛 -- -- 回退失败(例如钱已被 D1 结算划到商户银行卡、基本户余额不足)会把状态退回 'confirmed', -- 并把返回码与描述留在下面这几列里作为证据;回退成功后退回 'pending',商户重新核销时会走一次 -- 全新的交易确认,因此上一轮的确认回执(funds_confirm_*)要保留下来,不要清空。 -- -- 用存储过程按 exists 判断逐列追加,使脚本可以重复执行(本地开发的库常常手工加过列)。 DROP PROCEDURE IF EXISTS add_fund_revert_columns; DELIMITER // CREATE PROCEDURE add_fund_revert_columns() BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'payment_transaction' AND column_name = 'funds_revert_no') THEN ALTER TABLE payment_transaction ADD COLUMN funds_revert_no VARCHAR(64) DEFAULT NULL COMMENT '交易确认退款(撤销核销回退)请求流水号'; END IF; IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'payment_transaction' AND column_name = 'funds_revert_request_date') THEN ALTER TABLE payment_transaction ADD COLUMN funds_revert_request_date CHAR(8) DEFAULT NULL COMMENT '交易确认退款请求日期(yyyyMMdd)'; END IF; IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'payment_transaction' AND column_name = 'funds_revert_code') THEN ALTER TABLE payment_transaction ADD COLUMN funds_revert_code VARCHAR(64) DEFAULT NULL COMMENT '交易确认退款返回码'; END IF; IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'payment_transaction' AND column_name = 'funds_revert_message') THEN ALTER TABLE payment_transaction ADD COLUMN funds_revert_message VARCHAR(512) DEFAULT NULL COMMENT '交易确认退款返回描述'; END IF; IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'payment_transaction' AND column_name = 'funds_reverted_amount') THEN ALTER TABLE payment_transaction ADD COLUMN funds_reverted_amount BIGINT DEFAULT NULL COMMENT '回退的金额(分),取自上一轮确认回执的已确认金额'; END IF; IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'payment_transaction' AND column_name = 'funds_reverted_at') THEN ALTER TABLE payment_transaction ADD COLUMN funds_reverted_at DATETIME DEFAULT NULL COMMENT '资金退回延迟户的时间'; END IF; -- 状态列多了一个 'reverting':注释只在还是旧文案时刷新一次。 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'payment_transaction' AND column_name = 'funds_confirmation_status' AND column_comment LIKE '%confirmed,NULL 表示%') THEN ALTER TABLE payment_transaction MODIFY COLUMN funds_confirmation_status VARCHAR(16) DEFAULT NULL COMMENT '延迟交易的资金确认状态:pending/confirming/confirmed/reverting,NULL 表示未走延迟入账'; END IF; END // DELIMITER ; CALL add_fund_revert_columns(); DROP PROCEDURE add_fund_revert_columns;