最近客户说要添加微信支付,在玩微信支付的时候遇到一个非常坑爹的问题叫做 “time_expire时间过短” ,最后找到了问题所在并解决了。

正文

在使用 NATIVE 统一下单模式的时候,用了 JS API 一样的参数,导致返回了这个错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$unifiedOrder = new WxPayUnifiedOrder(); //统一支付接口中,trade_type为JSAPI时,openid为必填参数!
$unifiedOrder->SetAppid(WxPayConfig::APPID);
$unifiedOrder->SetMch_id(WxPayConfig::MCHID);
$unifiedOrder->SetDevice_info('WEB');
$unifiedOrder->SetNonce_str();
$unifiedOrder->SetOpenid();//用户标识
$unifiedOrder->SetBody();//商品简要描述
$unifiedOrder->SetDetail();//商品描述
$unifiedOrder->SetOut_trade_no();//商品订单编号
$unifiedOrder->SetFee_type('CNY');//商品支付类型
$unifiedOrder->SetTotal_fee();//商品总金额,交易金额默认为人民币交易,接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。
$unifiedOrder->SetSpbill_create_ip();//用户创建订单的IP
$unifiedOrder->SetTime_start(date('YmdHis',$time));//交易起始时间
$unifiedOrder->SetTime_expire(date('YmdHis',$time + 30*60));//交易结束时间
$unifiedOrder->SetNotify_url();//接收微信支付异步通知回调地址
$unifiedOrder->SetTrade_type('NATIVE');//交易类型,取值如下:JSAPI,NATIVE,APP

time_expire时间过短,刷卡至少1分钟,其他5分钟

网上查找了一下,关键问题在下面两行代码。

1
2
$unifiedOrder->SetTime_start(date('YmdHis',$time));//交易起始时间
$unifiedOrder->SetTime_expire(date('YmdHis',$time + 30*60));//交易结束时间

这个设置在 NATIVE 模式下选填的,我的解决方法就是删去,之后就恢复正常了。

还有一个解决方案是缩短 expire 的时间。

后记

微信文档真的是坑人,学习的过程中总能发现一些不成文的规定。

参考

time_expire时间过短