searchPayOrder($param['pay_order_id']); if ($payOrderResult['status'] != 1) { return $payOrderResult; } $pay_order = $payOrderResult['data']; //流水信息 if ($pay_order['order_state'] == 'SUCCESS') { $res = [ 'status' => 1, 'result_code' => 1, 'return_code' => 1, 'payment_status' => 1, ]; return callBack(statusCode()['error'], '支付成功', $res); } if (!in_array($pay_order['pay_type'], ['1', '2'])) { return callBack(statusCode()['error'], "未知的支付类型"); } $paySetResult = $this->getPayConfig($param['merchant_id'], $pay_order['pay_type']); if ($paySetResult['status'] != 1) { return $paySetResult; } $config = $paySetResult['data']['config']; //支付设置 $result = $this->getThirdPayState([ 'pay_order' => $pay_order, 'config' => $config ]); //返回的支付状态信息 return $result; } /** * 会员充值支付订单状态并之心回调 * @param $param * [ * merchant_id * store_id * cashier_id * pay_order_id 流水id * recharge_id 活动id * ] * @return mixed * [ * pay_channel 支付渠道 1微信 2支付宝 3新大陆 4云闪付 * status 0发出请求失败 1 发出请求成功 * return_code 0未收到第三方返回信息 1返回成功 2返回未知状态 3查询失败 * result_code 0支付失败|撤销支付失败 1 支付成功 2支付中 3撤销中 4撤销支付成功 6转入退款 * payment_status 0回调失败 1回调完成 2请继续支付 * data 返回的前端所需的信息 * ] */ public function rechargeQueryOrder($param) { $verify = $this->rechargeVerify($param); //参数验证 if ($verify['status'] != 1) { return $verify; } $payOrderResult = $this->searchPayOrder($param['pay_order_id']); if ($payOrderResult['status'] != 1) { return $payOrderResult; } $pay_order = $payOrderResult['data']; //流水信息 if ($pay_order['order_state'] == 'SUCCESS') { $res = [ 'status' => 1, 'result_code' => 1, 'return_code' => 1, 'payment_status' => 1, ]; return callBack(statusCode()['success'], '支付成功', $res); } $paySetResult = $this->getPayConfig($param['merchant_id'], $pay_order['pay_type']); if ($paySetResult['status'] != 1) { return $paySetResult; } $config = $paySetResult['data']['config']; //支付设置 $result = $this->getThirdPayState([ 'merchant_id' => $param['merchant_id'], 'store_id' => $param['store_id'], 'recharge_id' => $param['recharge_id'], 'pay_order' => $pay_order, 'config' => $config ]); //返回的支付状态信息 return $result; } /** * 会员充值支付订单状态并之心回调的参数验证 * @param $param * [ * merchant_id * store_id * cashier_id * pay_order_id 流水id * ] * @return mixed */ public function rechargeVerify($param) { if (empty($param['merchant_id']) || empty($param['store_id']) || empty($param['cashier_id'])) { return callBack(statusCode()['error'], "未知的收银员"); } if (empty($param['pay_order_id'])) { return callBack(statusCode()['error'], "缺少订单必要参数"); } return callBack(statusCode()['success'], "验证成功"); } /** * 购买商品支付订单状态并执行回调 * @param $param * [ * merchant_id * store_id * cashier_id * bill_id 订单id * pay_order_id 流水id * pay_money 支付金额 * amount_received 实收金额 * ] * @return mixed * [ * pay_channel 支付渠道 1微信 2支付宝 3新大陆 4云闪付 * status 0发出请求失败 1 发出请求成功 * return_code 0未收到第三方返回信息 1返回成功 2返回未知状态 3查询失败 * result_code 0支付失败|撤销支付失败 1 支付成功 2支付中 3撤销中 4撤销支付成功 6转入退款 * payment_status 0回调失败 1回调完成 2请继续支付 * data 返回的前端所需的信息 * ] */ public function queryOrder($param) { $verifyResult = $this->queryOrderVerify($param); //验证参数 if ($verifyResult['status'] != 1) { return $verifyResult; } $infoResult = $this->searchInfo($param); //查询流水信息订单信息支付配置 if ($infoResult['status'] != 1) { return $infoResult; } if (!in_array($infoResult['data']['pay_order']['pay_type'], ['1', '2'])) { return callBack(statusCode()['error'], "未知的支付类型"); } $pay_order = $infoResult['data']['pay_order']; //流水信息 $billOrder = $infoResult['data']['bill_order']; //订单信息 $config = $infoResult['data']['config']; //支付配置 $pay_money = $param['pay_money']; $amount_received = $param['amount_received']; if ($pay_order['order_state'] == 'SUCCESS' && $billOrder['pay_state'] == 1) { $res = [ 'status' => 1, 'result_code' => 1, 'return_code' => 1, 'payment_status' => 1, ]; return callBack(statusCode()['error'], "支付成功", $res); } $result = $this->getThirdPayState([ 'pay_order' => $pay_order, 'config' => $config, 'pay_money' => $pay_money, 'amount_received' => $amount_received, 'billOrder' => $billOrder ]); //返回信息 return $result; } /** * 查询微信支付订单 * @param $pay_order 流水信息 * @param $config 支付配置 * @return mixed * [ * status 0发出请求失败 1 发出请求成功 * return_code 0未收到微信返回信息 1返回成功 2返回未知状态 3查询失败 * result_code 0支付失败|撤销支付失败 1 支付成功 2支付中 3撤销中 4撤销支付成功 6转入退款 * payInfo 微信返回的信息 * ] */ public function wxQueryOrder($pay_order, $config) { $status = 1; $return_code = 0; $wxResult = A('Pay/NewWxPay')->searchWxOrder_v3($pay_order, $config); if (!empty($wxResult)) { if ($wxResult['return_code'] == 'SUCCESS' && $wxResult['result_code'] == "SUCCESS") { $return_code = 1; if (!empty($pay_order['face_token'])) { //刷脸 switch ($wxResult['trade_state']) { case "SUCCESS": $result_code = 1; break; case "REVOKED": $result_code = 4; break; case "REFUND": $result_code = 6; break; case "PAYERROR": $result_code = 0; break; case "TRADE_PAYING": $result_code = 2; break; default: $return_code = 2; break; } } else { //码支付 switch ($wxResult['trade_state']) { case "USERPAYING": $result_code = 2; break; case "SUCCESS": $result_code = 1; break; case "PAYERROR": $result_code = 0; break; case "REVOKED": $result_code = 4; break; case "REFUND": $result_code = 6; break; default: $return_code = 2; break; } } } else { $return_code = 3; } } $result['status'] = $status; $result['return_code'] = $return_code; $result['result_code'] = $result_code ? $result_code : 0; $result['payInfo'] = $wxResult; return $result; } /** * 查询支付宝订单 * @param $pay_order * @param $config * @return mixed * [ * status 0发出请求失败 1 发出请求成功 * return_code 0未收到支付平台返回信息 1返回成功 2返回未知状态 3查询失败 * result_code 0支付失败|撤销支付失败 1 支付成功 2支付中 3撤销中 4撤销支付成功 6转入退款 * payInfo 微信返回的信息 * ] */ public function zfbQueryOrder($pay_order, $config) { $status = 1; $return_code = 0; $zfbResult = A('Pay/NewAliPay')->inquireOrder_v3($pay_order, $config); if (!empty($zfbResult)) { if ($zfbResult['status'] == 1) { $return_code = 1; switch ($zfbResult['trade_status']) { case 'WAIT_BUYER_PAY': $result_code = 2; break; case 'TRADE_SUCCESS': $result_code = 1; break; case 'TRADE_CLOSED': case 'TRADE_FINISHED': if ($pay_order['order_state'] == 'REVOKED') { $result_code = 4; } else { $result_code = 0; } break; default: $return_code = 2; break; } } else { $return_code = 3; } } else { $return_code = 0; } $result['status'] = $status; $result['return_code'] = $return_code; $result['result_code'] = $result_code ? $result_code : 0; $result['payInfo'] = $zfbResult; return $result; } /** * 查询新大陆支付订单 * @param $out_trade_no 订单内部流水号 * @param $merchant_id * @param $add_time * @return mixed * [ * status 0发出请求失败 1 发出请求成功 * return_code 0未收到返回信息 1返回成功 2返回未知状态 3查询失败 * result_code 0支付失败|撤销支付失败 1 支付成功 2支付中 3撤销中 4撤销支付成功 6转入退款 * dlInfo 返回的支付信息 * ] */ public function xDLQueryOrder($out_trade_no, $merchant_id, $add_time) { $status = 1; $return_code = 0; $daLuResult = A('Pay/PayContinent')->QryBarcode($out_trade_no, $merchant_id, $add_time); file_put_contents('./xdlLinePay.txt', date('Y-m-d H:i:s') . json_encode($daLuResult), FILE_APPEND); if ($daLuResult['returnCode'] == '000000') { $return_code = 1; switch ($daLuResult['result']) { case 'A': $result_code = 2; break; case 'S': $result_code = 1; break; default: $result_code = 0; break; } } else if ($daLuResult['returnCode'] == '000035') { $return_code = 1; } else { $return_code = 3; } $result['status'] = $status; $result['return_code'] = $return_code; $result['result_code'] = $result_code ? $result_code : 0; $result['payInfo'] = $daLuResult; return $result; } /** * 查询云闪付订单 * @param $out_trade_no * @param $pay_type * @param $config * @return mixed * [ * status 0发出请求失败 1 发出请求成功 * return_code 0未收到返回信息 1返回成功 2返回未知状态 3查询失败 * result_code 0支付失败|撤销支付失败 1 支付成功 2支付中 3撤销中 4撤销支付成功 6转入退款 * dlInfo 返回的支付信息 * ] */ public function yunQueryOrder($out_trade_no, $pay_type, $config) { $status = 1; $return_code = 0; switch ($pay_type) { case 1: $wechat = 'wechat'; break; case 2: $wechat = 'alipay'; break; } $CloudPayController = new CloudPayController(); $data = $CloudPayController->retailPayConfigToCloudPayConfig($config); $yun = new CloudObj($data); $yunResult = $yun->queryOrder_v1($out_trade_no, $wechat); if (!empty($yunResult)) { if ($yunResult['respCode'] == '00') { $return_code = 1; switch ($yunResult['origRespCode']) { case '00': $result_code = 1; break; case '01': $result_code = 6; break; case '02': case '05': $result_code = 2; break; case '03': case '06': $result_code = 0; break; case '04': $result_code = 4; break; default: $return_code = 2; break; } } else { $return_code = 3; } } else { $return_code = 0; } $result['status'] = $status; $result['return_code'] = $return_code; $result['result_code'] = $result_code ? $result_code : 0; $result['payInfo'] = $yunResult; return $result; } /** * 支付成功回调处理分润 * @param $pay_channel 支付渠道 1微信 2支付宝 3新大陆 4云闪付 * @param $payInfo 支付成功返回的信息 * @param $pay_order 流水信息 * @param $config 支付配置 * @return array */ public function payPaymentBack($pay_channel, $payInfo, $pay_order, $config = []) { switch ($pay_channel) { case 1: $upData = $this->wxPaymentBack($pay_order, $config, $payInfo); break; case 2: $upData = $this->zfbPaymentBack($pay_order, $config, $payInfo); break; case 3: $upData = $this->xDLPayPaymentBack($pay_order, $payInfo); break; case 4: $upData = $this->yunPaymentBack($config, $payInfo, $pay_order); break; case 5: //乐返 $upData = $this->happyPaymentBack($config, $payInfo, $pay_order); break; case 6: //拉卡拉 $upData = $this->laKaLaPaymentBack($config, $payInfo, $pay_order); break; case 7: //钱客云 $upData = $this->moneyGuestPaymentBack($config, $payInfo, $pay_order); break; } return $upData; } /** * 微信支付成功回调处理分润 * @param $pay_order * @param $config * @param $payInfo * @return array */ public function wxPaymentBack($pay_order, $config, $payInfo) { if ($pay_order['m_pay_type'] == 1) { $mch_id = $config['wx_mch_id']; } else { //子商户号 $mch_id = $config['wx_sub_mchid']; } $upData = [ 'trade_no' => $payInfo['transaction_id'], 'order_state' => 'SUCCESS', 'trade_date' => time(), 'extend_content' => json_encode($payInfo), 'mer_id' => $mch_id, ]; if ($payInfo['coupon_count'] > 0) { //使用了代金券 $PayCouponClass = new PayCoupon(); $result = $PayCouponClass->couponVerification_v1(json_encode([ 'pay_info' => $payInfo, 'use_type' => $pay_order['order_type'], 'order_id' => $pay_order['bill_id'] ? $pay_order['bill_id'] : $pay_order['id'], 'store_id' => $pay_order['store_id'], 'use_scene' => 2, 'merchant_id' => $pay_order['merchant_id'], 'coupon_way'=>1 //核销 ]));//修改代金券使用状态 if ($result['status'] == 1) { $upData['pay_coupon_id_str'] = $result['data']['pay_coupon_id_str']; //代金券id拼接 $upData['pay_coupon_fee'] = $result['data']['pay_coupon_fee'];//代金券优惠总金额 } } if ($pay_order['m_pay_type'] == 2) { A('Pay/Base')->doAddRate($payInfo['transaction_id'], $pay_order, 2);//分润 } return $upData; } /** * 支付宝支付成功回调处理分润 * @param $pay_order * @param $config * @param $payInfo * @return array */ public function zfbPaymentBack($pay_order, $config, $payInfo) { if ($pay_order['m_pay_type'] == 1) { $mch_id = $config['alipay_appid']; } else { if (!empty($config['alipay_sellerid'])) { $mch_id = $config['alipay_sellerid']; } else { $mch_id = $config['alipay_token']; } } $upData = array( 'trade_no' => $payInfo['trade_no'], 'order_state' => 'SUCCESS', 'trade_date' => time(), 'extend_content' => json_encode($payInfo), 'mer_id' => $mch_id ); if ($pay_order['m_pay_type'] == 2) { A('Pay/Base')->doAddRate($payInfo['trade_no'], $pay_order, 1);//分润 } return $upData; } /** * 新大陆支付成功回调处理分润 * @param $pay_order * @param $payInfo * @return mixed */ public function xDLPayPaymentBack($pay_order, $payInfo) { $upData['trade_no'] = $payInfo['orderNo']; $upData['order_state'] = 'SUCCESS'; $upData['trade_date'] = time(); $upData['extend_content'] = json_encode($payInfo); A('Pay/PayContinent')->doAddRate($payInfo['orderNo'], $pay_order, 3); return $upData; } /** * 云闪付支付成功回调处理分润 * @param $config * @param $payInfo * @param $pay_order * @return array */ public function yunPaymentBack($config, $payInfo, $pay_order) { A('Pay/PayContinent')->doAddRate($payInfo['transIndex'], $pay_order, 4); $upData = [ 'trade_no' => $payInfo['transIndex'], 'order_state' => 'SUCCESS', 'trade_date' => time(), 'extend_content' => json_encode($payInfo), 'mer_id' => $config['cloud_mer_id'] ]; return $upData; } /** * 乐返支付成功回调处理分润 * @param $config * @param $payInfo * @param $pay_order * @return array */ public function happyPaymentBack($config, $payInfo, $pay_order) { A('Pay/PayContinent')->doAddRate($payInfo['data']['batch'], $pay_order, 5); $upData = [ 'trade_no' => $payInfo['data']['batch'], 'order_state' => 'SUCCESS', 'trade_date' => time(), 'extend_content' => json_encode($payInfo), 'mer_id' => $config['happy_pay_num'],//乐返商户编号 ]; return $upData; } /** * 拉卡拉支付成功回调处理分润 * @param $config * @param $payInfo * @param $pay_order * @return array */ public function laKaLaPaymentBack($config, $payInfo, $pay_order) { A('Pay/PayContinent')->doAddRate($payInfo['respData']['tradeNo'], $pay_order, 6); $upData = [ 'trade_no' => $payInfo['respData']['tradeNo'], 'order_state' => 'SUCCESS', 'trade_date' => time(), 'extend_content' => json_encode($payInfo), 'mer_id' => $config['lakala_pay_num'],//拉卡拉商户编号 ]; return $upData; } /** * 钱客云支付成功回调处理分润 * @param $config * @param $payInfo * @param $pay_order * @return array */ public function moneyGuestPaymentBack($config, $payInfo, $pay_order) { A('Pay/PayContinent')->doAddRate($payInfo['obj']['orderNumber'], $pay_order, 7); $upData = [ 'trade_no' => $payInfo['obj']['orderNumber'], 'order_state' => 'SUCCESS', 'trade_date' => time(), 'extend_content' => json_encode($payInfo), 'mer_id' => $config['qian_ke_mid'],//钱客云商户编号 ]; return $upData; } /** * 查询订单信息流水信息支付设置 * @param $param * [ * merchant_id * store_id * bill_id 订单id * pay_order_id 流水id * pay_money 支付金额 * amount_received 实收金额 * ] * @return mixed */ public function searchInfo($param) { $payOrderResult = $this->searchPayOrder($param['pay_order_id']); if ($payOrderResult['status'] != 1) { return $payOrderResult; } $pay_order = $payOrderResult['data']; //流水信息 $billOrderResult = $this->searchBillOrder($param['bill_id']); if ($billOrderResult['status'] != 1) { return $billOrderResult; } $bill_order = $billOrderResult['data']; //订单信息 $paySetResult = $this->getPayConfig($param['merchant_id'], $pay_order['pay_type']); if ($paySetResult['status'] != 1) { return $paySetResult; } $config = $paySetResult['data']['config']; //支付设置 $result = [ 'pay_order' => $pay_order, 'bill_order' => $bill_order, 'config' => $config ]; return callBack(statusCode()['success'], "查询成功", $result); } /** * 第三方查询支付订单结果 * @param $param * [ * [ * 公共参数 * pay_order 流水信息 * config 支付配置 * ] * [ * 次卡 * ] * [ * 会员充值 * merchant_id * store_id * recharge_id 活动id * ] * [ * pay_money 支付金额 * amount_received 实收金额 * billOrder 订单信息 * ] * @return string */ public function getThirdPayState($param) { if (!in_array($param['pay_order']['pay_type'], ['1', '2'])) { return callBack(statusCode()['error'], "未知的支付类型"); } if ($param['pay_order']['m_pay_type'] == 3 || $param['pay_order']['m_pay_type'] == 4 || $param['pay_order']['m_pay_type'] == 5 || $param['pay_order']['m_pay_type'] == 6 || $param['pay_order']['m_pay_type'] == 7) { $pay_channel = $param['pay_order']['m_pay_type']; } else { $pay_channel = $param['pay_order']['pay_type']; } switch ($pay_channel) { case 1: //微信 $payResult = $this->wxQueryOrder($param['pay_order'], $param['config']); break; case 2: //支付宝 $payResult = $this->zfbQueryOrder($param['pay_order'], $param['config']); break; case 3: //新大陆 $payResult = $this->xDLQueryOrder($param['pay_order']['out_trade_no'], $param['pay_order']['merchant_id'], $param['pay_order']['add_time']); break; case 4: //云闪付 $payResult = $this->yunQueryOrder($param['pay_order']['out_trade_no'], $param['pay_order']['pay_type'], $param['config']); break; case 5: //乐返 $happyPay = new \HappyPay\Business\HappyPay(); $payResult = $happyPay->happyPayQueryOrder($param); break; case 6: //拉卡拉 $laKaLaPay = new \LaKaLaPay\Business\LaKaLaMis(); $payResult = $laKaLaPay->laKaLaPayQueryOrder($param); break; case 7: //钱客云 $moneyGuest = new \MoneyGuestPay\Business\MoneyGuest(); $payResult = $moneyGuest->moneyGuestQueryOrder($param); break; } $status = $payResult['status']; $return_code = $payResult['return_code']; $result_code = $payResult['result_code']; //支付成功各渠道处理分润并返回流水表修改的信息 if ($status == 1 && $return_code == 1 && $result_code == 1) { $payInfo = $payResult['payInfo']; $upData = $this->payPaymentBack($pay_channel, $payInfo, $param['pay_order'], $param['config']); $param['upData'] = $upData; } //返回信息 if ($status == 1) { switch ($return_code) { case 0: $message = '未收到第三方支付返回信息'; break; case 1: switch ($result_code) { case 0: $message = '支付失败'; break; case 1: //支付成功回调 $callResult = $this->paymentCallBack($param); $message = $callResult['data']['message']; $result['payment_status'] = $callResult['data']['payment_status']; $result['data'] = $callResult['data']['data']; $result['data']['pay_coupon_fee'] = $upData['pay_coupon_fee']?$upData['pay_coupon_fee']:0; break; case 2: $message = '支付中'; break; case 3: $message = '撤销中'; break; case 4: $message = '撤销支付成功'; break; case 5: $message = '撤销支付失败'; break; case 6: $message = '转入退款'; break; } break; case 2: $message = '返回未知状态'; break; case 3: $message = '查询失败'; break; } } else { $message = '发出请求失败'; } $result['status'] = $status; $result['return_code'] = $return_code; $result['result_code'] = $result_code; $result['pay_channel'] = $pay_channel; $result['message'] = $message; return $result; } /** * 支付成功回调 * @param $param * [ * 修改的信息 upData * 流水信息 pay_order * ] * @return mixed */ public function paymentCallBack($param) { $upData = $param['upData']; switch ($param['pay_order']['order_type']) { case 1: //购买商品 $PaymentCallBackClass = new PaymentCallBack(); $callResult = $PaymentCallBackClass->callBackHandle([ 'pay_order' => $param['pay_order'], 'pay_type' => $param['pay_order']['pay_type'], 'upData' => $upData, 'pay_money' => $param['pay_money'], 'amount_received' => $param['amount_received'], 'billOrder' => $param['billOrder'], ]); $payment_status = $callResult['status']; $message = $callResult['message']; break; case 2: //会员充值 $PaymentCallBackClass = new PaymentCallBack(); $callResult = $PaymentCallBackClass->rechargeCallBackHandle([ 'merchant_id' => $param['merchant_id'], 'store_id' => $param['store_id'], 'pay_order' => $param['pay_order'], 'recharge_id' => $param['recharge_id'] ? $param['recharge_id'] : 0, 'upData' => $upData ]); $payment_status = $callResult['status']; $data = $callResult['data']; $message = $callResult['message']; break; case 7: //购买次卡 $PaymentCallBackClass = new PaymentCallBack(); $callResult = $PaymentCallBackClass->cardCallBackHandle([ 'pay_order' => $param['pay_order'], 'upData' => $upData ]); $payment_status = $callResult['status']; $message = $callResult['message']; break; } return callBack(statusCode()['success'], "回调执行", [ 'message' => $message ? $message : '', 'data' => $data ? $data : [], 'payment_status' => $payment_status ]); } /** * 查询流水信息 * @param $pay_order_id 流水id * @return mixed */ public function searchPayOrder($pay_order_id) { $payOrderClass = new \Common\Business\PayOrder(); $result = $payOrderClass->basisIdGetInfo($pay_order_id); return $result; } /** * 查询订单信息 * @param $bill_id 订单id * @return mixed */ public function searchBillOrder($bill_id) { $billOrderClass = new BillOrder(); $result = $billOrderClass->basisIdGetInfo($bill_id); return $result; } /** * 获取商户支付模式及权限 * @param $merchant_id * @param $pay_type 支付类型 1微信 2支付宝 3现金 5其他 6余额 7赊账 * @return mixed * [ * data => config 支付配置 * ] */ public function getPayConfig($merchant_id, $pay_type) { $paySetClass = new PaySet(); $result = $paySetClass->basisMerchantIdGetInfo($merchant_id, $pay_type); return $result; } /** * 查询支付订单状态的参数验证 * @param $param * [ * cashier_id * bill_id 订单id * pay_order_id 流水id * pay_money 支付金额 * amount_received 实收金额 * ] * @return mixed */ public function queryOrderVerify($param) { if (empty($param['merchant_id']) || empty($param['store_id']) || empty($param['cashier_id'])) { return callBack(statusCode()['error'], "未知的收银员"); } if (empty($param['bill_id']) || empty($param['pay_order_id'])) { return callBack(statusCode()['error'], "缺少订单必要参数"); } if (!verifyPrice($param['pay_money']) || !verifyPrice($param['amount_received']) || floatval($param['amount_received']) < floatval($param['pay_money'])) { return callBack(statusCode()['error'], "支付金额有误"); } return callBack(statusCode()['success'], "验证成功"); } }