Exemple #1
0
 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;
 }
Exemple #2
0
 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;
 }