关于支付宝支付TRADE_SUCCESS和TRADE_FINISHED

极E 发表于 2017-3-9 12:10:18 | 只看该作者 [复制链接] 打印
8 835
支付宝中担保交易和即时到账交易对其的描述为:
  • TRADE_SUCCESS??交易成功(或支付成功)
  • TRADE_FINISHED? ? 交易完成
一头雾水。。。。。。OK,找例子来说明吧:
例子一:
  • 即时到账普通版。? ?普通版不支持支付完成后的退款操作,即用户充值完成后,该交易就算是完成了,这笔交易就不能再做任何操作了。
  • 即时到账高级版。? ?这个版本在用户充值完成后,卖家可以执行退款操作进行退款,即该交易还没有彻底完成,卖家还可以修改这笔交易。
OK,开测。当用户在支付宝网站上充值完成后,这个时候支付宝的通知消息中,如果是即时到账普通版,那么这时的交易状态值为:??TRADE_FINISHED;如果是即时到账高级版,此时的交易状态值就为:TRADE_SUCCESS。
我第一次接入的时候在我网站中判断用或来做,即如果是交易成功或者交易完成则发货。这时就错大了。。。。。。因为作为即时到账高级版,在TRADE_SUCCESS完成后过了三个月,支付宝又会主动再推送一个消息为TRADE_FINISHED。所以如果我用以上的逻辑来做发货,那么我接入即时到账高级版的话,就会发货2次。或者说本来已经退货退钱的商品,有可能再被改成已经支付的,再次给客户发货。
所以解决方案
支付是生产支付日志 pay_log
pay_log? ? 字段
id??pay_id(支付方式id)??is_paid(支付状态)
判断 zhifpay_status==1
  1. if ($_GET['trade_status'] == 'WAIT_SELLER_SEND_GOODS')
  2. ? ?? ???{
  3. ? ?? ?? ?? ?/* 改变订单状态 */
  4. ? ?? ?? ?? ?order_paid($order_sn, 2);

  5. ? ?? ?? ?? ?return true;
  6. ? ?? ???}
  7. ? ?? ???elseif ($_GET['trade_status'] == 'TRADE_FINISHED')
  8. ? ?? ???{
  9. ? ?? ?? ?? ?/* 改变订单状态 */
  10. ? ?? ?? ?? ?order_paid($order_sn);

  11. ? ?? ?? ?? ?return true;
  12. ? ?? ???}
  13. ? ?? ???elseif ($_GET['trade_status'] == 'TRADE_SUCCESS')
  14. ? ?? ???{
  15. ? ?? ?? ?? ?/* 改变订单状态 */
  16. ? ?? ?? ?? ?order_paid($order_sn, 2);

  17. ? ?? ?? ?? ?return true;
  18. ? ?? ???}
复制代码
function order_paid($log_id, $pay_status = 2, $note = '')
{
? ? /* 取得支付编号 */
? ? $log_id = intval($log_id);
? ? if ($log_id > 0)
? ? {
? ?? ???/* 取得要修改的支付记录信息 */
? ?? ???$sql = "SELECT * FROM " . $GLOBALS['ecs']->table('pay_log') .
? ?? ?? ?? ?? ? " WHERE log_id = '$log_id'";
? ?? ???$pay_log = $GLOBALS['db']->getRow($sql);
? ?? ???if ($pay_log && $pay_log['is_paid'] == 0)
? ?? ???{
? ?? ?? ?? ?//修改
? ?? ???}
? ?? ???else
? ?? ???{
? ?? ?? ?? ?//is_paid等于1 的时候表示支付成功一次 不要再改订单状态 为已经支付。否则退货的又变成付款的
? ?? ???}
? ? }
}
这个问题是因为我没有彻底理解清楚这2种关系造成的。
仔细琢磨了一下,发现了它们两者最本质的差别。TRADE_SUCCESS状态代表了充值成功,也就是说钱已经进了支付宝(担保交易)或卖家(即时到账);这时候,这笔交易应该还可以进行后续的操作(比如三个月后交易状态自动变成TRADE_FINISHED),因为整笔交易还没有关闭掉,也就是说一定还有主动通知过来。而TRADE_FINISHED代表了这笔订单彻底完成了,不会再有任何主动通知过来了。
综上所述,收到TRADE_FINISHED请求后,这笔订单就结束了,支付宝不会再主动请求商户网站了;收到TRADE_SUCCESS请求后,后续一定还有至少一条通知记录,即TRADE_FINISHED。所以,在做通知接口时,切记使用判断订单状态用或的关系

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

沙发
发表于 2017-1-17 12:15:44 | 只看该作者
在撸一遍。。。
板凳
发表于 2017-1-18 13:40:03 | 只看该作者
不错 支持下
地板
发表于 2017-1-18 13:45:57 | 只看该作者
酱油党莅临的地方,不仅仅是挽尊,不仅仅是消灭零回复,酱油所过暖意无边
5#
发表于 2017-3-2 22:17:50 | 只看该作者
楼主你好。。新人。混眼熟。顺便骗点经验。到手~拍拍屁股走人~
6#
发表于 2017-3-3 13:47:51 | 只看该作者
你身材很好,好的连孙悟空看见你,都会给你三棍子了。
7#
发表于 2017-3-6 11:24:39 | 只看该作者
有钱,就是任性,没钱,认命!
8#
发表于 2017-3-6 21:30:38 | 只看该作者
顶贴是一种态度!
9#
发表于 2017-3-9 12:10:18 | 只看该作者
无论是不是沙发都得回复下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入我们,

发现科技可以让生活更美好...

立即注册

如果您已拥有本站账户,则可

推荐阅读

Archiver|小黑屋|

Just easy to share

Powered by je2s.com

返回顶部 返回列表