public function doNotifyUrl($f3) { // 记录所有的参数,方便调试查找 printLog($this->getGatewayType() . ' Notify Paramters : ' . print_r($_REQUEST, true), 'PAYMENT', Base::INFO); //计算得出通知验证结果 $notifyArray = array("service" => $_POST['service'], "v" => $_POST['v'], "sec_id" => $_POST['sec_id'], "notify_data" => $_POST['notify_data']); $calcSign = build_mysign($notifyArray, $this->partnerKey, $this->configSecId); // 如果签名验证失败则直接退出 if ($calcSign != $_POST["sign"]) { printLog($this->getGatewayType() . ' sign error calcSign[' . $calcSign . '] sign[' . $_POST["sign"] . ']', 'PAYMENT', Base::ERROR); goto out_fail; } //交易状态 $trade_status = getDataForXML($_POST['notify_data'], '/notify/trade_status'); if ($trade_status != 'TRADE_FINISHED' && $trade_status != 'TRADE_SUCCESS') { printLog($this->getGatewayType() . ' trade_status Error [' . $trade_status . ']', 'PAYMENT', Base::ERROR); goto out_fail; } //商户订单号 $out_trade_no = getDataForXML($_POST['notify_data'], '/notify/out_trade_no'); //支付宝交易号 $trade_no = getDataForXML($_POST['notify_data'], '/notify/trade_no'); //总金额 $total_fee = getDataForXML($_POST['notify_data'], '/notify/total_fee'); //$_POST['trade_status'] == 'TRADE_FINISHED' //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在两种情况下出现 //1、开通了普通即时到账,买家付款成功后。 //2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。 //$_POST['trade_status'] == 'TRADE_SUCCESS' //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。 //------------------------------ //处理业务开始 //------------------------------ if (empty($out_trade_no)) { goto out_bad_trade_no; } $paramArray = explode('_', $out_trade_no); if (empty($paramArray) || count($paramArray) < 2 || !ctype_digit($paramArray[count($paramArray) - 1])) { goto out_bad_trade_no; } // 最后一个应该是订单 ID 号 $orderId = intval($paramArray[count($paramArray) - 1]); if (empty($orderId)) { goto out_bad_trade_no; } // 设置订单 ID $this->orderId = $orderId; $orderBasicService = new OrderBasicService(); $orderInfo = $orderBasicService->loadOrderInfoById($orderId); //判断金额是否一致,我们用 分 做单位比较 if ($orderInfo->isEmpty() || Money::storageToCent($orderInfo['order_amount']) != Money::displayToCent($total_fee)) { printLog('Alipay total_fee error, order_amount :{' . Money::storageToCent($orderInfo['order_amount']) . '} total_fee : {' . Money::displayToCent($total_fee) . '}', 'PAYMENT', Base::ERROR); goto out_fail; } //检查订单状态 if (OrderBasicService::OS_UNCONFIRMED != $orderInfo['order_status']) { printLog($this->getGatewayType() . ' order_status is not OS_UNCONFIRMED, order_status[' . $orderInfo['order_status'] . '] orderId[' . $orderId . ']', 'PAYMENT', Base::WARN); goto out_succ; } // 把订单设置为已付款状态 $orderPaymentService = new OrderPaymentService(); $orderPaymentService->markOrderInfoPay($orderId, $this->payId, $this->getGatewayType(), $trade_no); printLog($this->getGatewayType() . ' orderId[' . $orderId . '] notifyUrl success', 'PAYMENT', Base::INFO); //------------------------------ //处理业务完毕 //------------------------------ out_succ: echo "success"; //成功返回 return true; out_bad_trade_no: printLog($this->getGatewayType() . ' bad out_trade_no', 'PAYMENT', Base::ERROR); out_fail: // 失败从这里返回 echo "fail"; return false; }
public function doNotifyUrl($f3) { // 记录所有的参数,方便调试查找 printLog('Alipay Notify Paramters : ' . print_r($_REQUEST, true), 'PAYMENT', Base::INFO); //计算得出通知验证结果 $alipayNotify = new AlipayNotify($this->alipayConfig); $verifyResult = $alipayNotify->verifyNotify(); if (!$verifyResult) { printLog('Alipay verifyNotify Error ', 'PAYMENT', Base::ERROR); goto out_fail; } //验证成功 //商户订单号 $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; //总金额 $total_fee = $_POST['total_fee']; if ($_POST['trade_status'] != 'TRADE_FINISHED' && $_POST['trade_status'] != 'TRADE_SUCCESS') { printLog('Alipay trade_status Error', 'PAYMENT', Base::ERROR); goto out_fail; } //$_POST['trade_status'] == 'TRADE_FINISHED' //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在两种情况下出现 //1、开通了普通即时到账,买家付款成功后。 //2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。 //$_POST['trade_status'] == 'TRADE_SUCCESS' //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。 //------------------------------ //处理业务开始 //------------------------------ if (empty($out_trade_no)) { goto out_bad_trade_no; } $paramArray = explode('_', $out_trade_no); if (empty($paramArray) || count($paramArray) < 2 || !ctype_digit($paramArray[count($paramArray) - 1])) { goto out_bad_trade_no; } // 最后一个应该是订单 ID 号 $orderId = intval($paramArray[count($paramArray) - 1]); if (empty($orderId)) { goto out_bad_trade_no; } // 设置订单 ID $this->orderId = $orderId; $orderBasicService = new OrderBasicService(); $orderInfo = $orderBasicService->loadOrderInfoById($orderId); //判断金额是否一致,我们用 分 做单位来比较 if ($orderInfo->isEmpty() || Money::storageToCent($orderInfo['order_amount']) != Money::displayToCent($total_fee)) { printLog('Alipay total_fee error, order_amount :{' . Money::storageToCent($orderInfo['order_amount']) . '} total_fee : {' . Money::displayToCent($total_fee) . '}', 'PAYMENT', Base::ERROR); goto out_fail; } //检查订单状态 if (OrderBasicService::OS_UNCONFIRMED != $orderInfo['order_status']) { printLog('Alipay order_status is not OS_UNCONFIRMED, order_status[' . $orderInfo['order_status'] . '] orderId[' . $orderId . ']', 'PAYMENT', Base::WARN); goto out_succ; } // 把订单设置为已付款状态 $orderPaymentService = new OrderPaymentService(); $orderPaymentService->markOrderInfoPay($orderId, $this->payId, $this->getGatewayType(), $trade_no); printLog('Alipay orderId[' . $orderId . '] notifyUrl success', 'PAYMENT', Base::INFO); //------------------------------ //处理业务完毕 //------------------------------ out_succ: echo "success"; //成功返回 return true; out_bad_trade_no: printLog('Alipay bad out_trade_no', 'PAYMENT', Base::ERROR); out_fail: // 失败从这里返回 echo "fail"; return false; }