支付宝接口可以支付成功,但有时会重复写入支付成功数据,我想通过判断订单号是否重复来解决,应该怎么写?代码如下:if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
//写入支付数据
$paylog=M("alipaylog"); //实例化数据表
$datapaylog['userid']=$_SESSION ['USER_KEY_ID']; //用户ID
$datapaylog['fee']=$_GET['total_fee']; //充值金额
$datapaylog['dingdanhao']=$_GET['out_trade_no']; //交易订单号
$datapaylog['is_time']=$_GET['notify_time']; //支付时间
$datapaylog['liushuihao']=$_GET['trade_no']; //交易流水号
$paylog->add($datapaylog);
$tot=M("member");
$total_fee=$_GET['total_fee'];
$tot->where('member_id='.$_SESSION ['USER_KEY_ID'])->setInc('rmb',$total_fee);
}
4 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
支付宝异步通知过来一切以订单号为基准,根据其他参数,去你的数据库检查订单是否已经处理,未处理更新订单状态已处理则忽略异步通知,直接输出success告诉支付宝异步通知数据已处理。
拉风的咖菲猫
TA贡献1995条经验 获得超2个赞
你的思路错了,并不是一接收回调success的时候就进行处理.
1.在发起请求的时候判断支付状态,先杜绝重复发起支付的问题.
2.在支付回调页面中收到支付成功时先判断订单付款状态,一旦收到支付成功则对InnoDB表进行订单状态更改为已支付并通知支付宝success且在前台页面转向成功页.即可杜绝因回调处理不当引起的重复支付.
这样,不管是用户不慎重复请求,还是你回调重复都不会影响订单状态了.
简要的流程;
发起(判断状态)=支付=回调(收到支付成功时,先判断订单状态)=更改订单状态(一般订单表应该为事务表)=通知回调结果给支付宝与用户付款页=支付结束.
你的问题出在了你收到回调时就进行了写入而不先订单状态.这样是不明智的做法.
- 4 回答
- 0 关注
- 668 浏览
添加回答
举报
0/150
提交
取消