revokeOrderVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } $payOrderResult = $this->getPayInfo($param); //流水信息 if ($payOrderResult['status'] != 1) { return $payOrderResult; } $pay_order = $payOrderResult['data']; if ($pay_order['order_state'] == 'SUCCESS' && !empty($pay_order['pay_type']) && $pay_order['scene_type'] == 1) { return [ 'status' => 0, 'message' => '已支付成功,禁止撤销订单' ]; } if (($pay_order['add_time'] + 60) > time()) { return [ 'status' => 0, 'message' => '支付时间未到1分钟,禁止撤销订单' ]; } $param['pay_type'] = $pay_order['pay_type']; //支付方式1微信 2支付宝 $configResult = $this->getPaySet($param); //支付设置 if ($configResult['status'] != 1) { return $configResult; } $config = $configResult['data']['config']; $pay_channel = $param['pay_channel']; switch ($pay_channel) { case 1: //微信需要查询订单状态 $result = $this->revokeWxOrder($pay_order, $config); break; case 2: //支付宝不需要查询订单状态 $result = $this->revokeZfbOrder($pay_order, $config); break; case 3: //新大陆不需要查询订单状态 $result = [ 'status' => 1, 'message' => '撤销成功' ]; break; case 4: //云闪付不需要查询订单状态 $result = $this->revokeYunOrder($pay_order, $config); break; case 5: //乐返,没有撤销订单接口 $result = [ 'status' => 1, 'message' => '撤销成功' ]; break; case 6: //拉卡拉 $result = $this->LaKaLaQrReverseInfo($pay_order, $config); break; case 7: //钱客云,没有撤销订单接口 $result = [ 'status' => 1, 'message' => '撤销成功' ]; break; } if ($result['status'] == 1) { //撤销成功 $modifyResult = $this->payOrderModify($pay_order['id'], $result['data']); if ($modifyResult['status'] != 1) { return callBack(statusCode()['success'], "订单撤销成功,流水修改失败"); } else { return callBack(statusCode()['success'], "订单撤销成功,流水修改成功"); } } else { return $result; } } /** * 微信撤销订单 * @param $pay_order 流水信息 * @param $config 支付设置 * @return mixed */ public function revokeWxOrder($pay_order, $config) { $cancelResult = A('Pay/NewWxPay')->cancelWxOrder($pay_order, $config); if ($cancelResult['result_code'] == 'SUCCESS' && $cancelResult['return_code'] == 'SUCCESS') { return callBack(statusCode()['success'], "撤销订单请求成功", $cancelResult); } else { return callBack(statusCode()['error'], "订单超时,但撤销失败,请用户不要支付"); } } /** * 支付宝撤销订单 * @param $pay_order * @param $config * @return mixed * @throws \Exception */ public function revokeZfbOrder($pay_order, $config) { $NewAliPayClass = new NewAliPayController(); $result = $NewAliPayClass->revocation_v3($pay_order, $config); if (!empty($result['resultCode']) && $result['resultCode'] == 10000) { return callBack(statusCode()['success'], "订单撤销成功", $result['result']); } else { return callBack(statusCode()['error'], "订单超时,但撤销失败,请用户不要支付"); } } /** * 云闪付撤销订单 * @param $pay_order * @param $config * @return mixed */ public function revokeYunOrder($pay_order, $config) { switch ($pay_order['pay_type']) { case 1: $wechat = 'wechat'; break; case 2: $wechat = 'alipay'; break; } $CloudPayController = new CloudPayController(); $data = $CloudPayController->retailPayConfigToCloudPayConfig($config); $yunClass = new Cloud($data); $result = $yunClass->cancelOrder($pay_order['out_trade_no'], $wechat); if ($result['respCode'] == 00) { return callBack(statusCode()['success'], "撤销成功", $result); } else { return callBack(statusCode()['error'], $result['respMsg']); } } /** * 拉卡拉撤销订单 * @param $pay_order * @param $config * @return mixed */ public function LaKaLaQrReverseInfo($pay_order, $config) { $param = [ 'shopNo' => $pay_order['mer_id'],//商户号 'termId' => $config['systemConfig']['lakala_termid'],//终端号 'tradeNo' => $pay_order['trade_no'],//下单返回的平台交易单号 'appid' => $config['systemConfig']['lakala_appid'],//APPID 'token' => $config['systemConfig']['lakala_token'],//TOKEN 'secretKey' => $config['systemConfig']['lakala_secret_key'],//支付秘钥 ]; $laKaLaMis = new \Common\Lib\LaKaLaMis($param); $result = $laKaLaMis->LaKaLaQrReverse($param); if ($result['retCode'] == "000000") { return callBack(statusCode()['success'], "撤销成功", $result); } else { return callBack(statusCode()['error'], $result['retMsg']); } } /** * 修改流水表 * @param $pay_order_id * @param $payInfo * @return mixed */ public function payOrderModify($pay_order_id, $payInfo) { $data = [ 'order_state' => 'REVOKED', 'revoke_date' => time(), 'extend_content' => json_encode($payInfo) ]; $PayOrderClass = new \Common\Business\PayOrder(); $result = $PayOrderClass->basisIdModify($pay_order_id, $data); return $result; } /** * 支付设置 * @param $param * @return mixed */ public function getPaySet($param) { $paySetClass = new PaySet(); $result = $paySetClass->basisMerchantIdGetInfo($param['merchant_id'], $param['pay_type']); return $result; } /** * 流水信息 * @param $param * [ * pay_order_id 流水订单id * ] * @return mixed */ public function getPayInfo($param) { $payOrderClass = new \Common\Business\PayOrder(); $result = $payOrderClass->basisIdGetInfo($param['pay_order_id']); return $result; } /** * 撤销订单的参数验证 * @param $param * [ * merchant_id * cashier_id * pay_channel 支付渠道 1微信 2支付宝 3新大陆 4云闪付,5:乐返,6:拉卡拉 * pay_order_id 流水订单id * ] * @return mixed */ public function revokeOrderVerify($param) { if (empty($param['merchant_id']) || empty($param['cashier_id'])) { return callBack(statusCode()['error'], "缺少用户唯一标识"); } if (!in_array($param['pay_channel'], ['1', '2', '3', '4', '5', '6', '7'])) { return callBack(statusCode()['error'], "未知支付渠道"); } if (empty($param['pay_order_id'])) { return callBack(statusCode()['error'], "缺少流水订单标识"); } return callBack(statusCode()['success'], "验证成功"); } }