错误提示

今天新版本上线,但微信支付一直返回fail。查看微信返回信息
'err_code'=>'OUT_TRADE_NO_USED','err_code_des'=>'商户订单号重复
微信支付订单号重复

错误分析

百思不得其解。支付订单号,是保存在单独的支付表中。每次发起支付,都是插入支付表,返回一个新的自增ID作为支付订单号。不可能存在重复的问题。
后来思考好久,想到了一种情况。保存订单号然后实时生成一个新的订单

原因是测试环境。测试环境测试过支付,使用的也是自增ID。测试支付比较多,多次支付,表产生的自增ID大于线上的字段ID。这样线上ID每次都是已经使用过的。

解决方案

临时解决方案

手动调大支付记录表的自增ID,这样就不会出现重复
ALTER TABLE order_pay auto_increment=1100 ;

支付表大概结构

1
2
3
4
5
6
7
8
CREATE TABLE `order_pay` (
`pay_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '支付系列号',
`order_id` INT(10) NULL DEFAULT NULL,
PRIMARY KEY (`pay_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=200;

完善解决方案

最终解决方案:支付号随机生成

1
2
3
4
5
6
7
$pay_sn = time() . mt_rand(10, 99);
ALTER TABLE `order_pay`
ADD COLUMN `pay_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
CHANGE COLUMN `pay_sn` `pay_sn` INT(10) UNSIGNED NOT NULL COMMENT '支付系列号' AFTER `pay_id`,
DROP PRIMARY KEY,
ADD INDEX `pay_sn` (`pay_sn`),
ADD PRIMARY KEY (`pay_id`);