/** * 经销商采购订单--返回通知结果 * * @author Garbin * @param array $order_info * @param bool $strict * @return array */ function dealer_notify($order_info, $strict = false) { if (empty($order_info)) { $this->_error('order_info_empty'); return false; } /* 初始化所需数据 */ $notify = $this->_get_notify(); $alipayNotify = new AlipayNotify($this->alipay_config); /* 验证来路是否可信 */ if ($strict) { /* 严格验证 */ $verify_result = $alipayNotify->queryNotify($notify['notify_id']); if (!$verify_result) { /* 来路不可信 */ $this->_error('notify_unauthentic'); return false; } } /* 验证通知是否可信 */ $sign_result = $alipayNotify->verifySign($notify); if (!$sign_result) { /* 若本地签名与网关签名不一致,说明签名不可信 */ $this->_error('sign_inconsistent'); return false; } /* ----------通知验证结束---------- */ /* ----------本地验证开始---------- */ /* 验证与本地信息是否匹配 */ /* 这里不只是付款通知,有可能是发货通知,确认收货通知 */ if ($order_info['ship_bill_no'] != $notify['out_trade_no']) { /* 通知中的订单与欲改变的订单不一致 */ $this->_error('order_inconsistent'); return false; } if ($order_info['amount'] != $notify['total_fee']) { /* 支付的金额与实际金额不一致 */ $this->_error('price_inconsistent'); return false; } //至此,说明通知是可信的,订单也是对应的,可信的 /* 按通知结果返回相应的结果 */ $order_no = ''; switch ($notify['trade_status']) { case 'WAIT_BUYER_PAY': //等待买家付款 // $order_status = DORDER_PENDING; // 10 $order_status = DORDER_READY; // 0 break; case 'WAIT_SELLER_SEND_GOODS': //买家已付款,等待卖家发货 // $order_status = DORDER_ACCEPTED; // $order_status = DORDER_PENDING; // 订单改为付款状态 10 $trade_no = $notify['trade_no']; break; case 'WAIT_BUYER_CONFIRM_GOODS': //卖家已发货,等待买家确认 // $order_status = DORDER_SHIPPED; $order_status = DORDER_ACCEPTED; // 订单状态改为 已发货 20 , 发货状态:DORDER_SELLED 改为10 break; case 'TRADE_FINISHED': //交易结束 /* 说明是第三方担保交易,交易结束 */ $order_status = DORDER_SHIPPED; // 订单买家确认收货,订单状态完成。 status =30 ,take_status = 30, abn_status = 30 break; case 'TRADE_CLOSED': //交易关闭 $order_status = DORDER_CANCLED; // 废弃订单 status =30 ,take_status = 30,,abn_status = 40 break; default: $this->_error('undefined_status'); return false; break; } switch ($notify['refund_status']) { case 'REFUND_SUCCESS': //退款成功,取消订单 $order_status = DORDER_CANCLED; break; } /* 记录日志 */ $this->put_log(); return array('target' => $order_status, 'trade_status' => $notify['trade_status'], 'trade_no' => $trade_no); }