文件
mashangyoujiu/Application/CashierApi/Business/RevokeOrder.class.php

289 行
9.1 KiB
PHP
可执行文件

<?php
namespace CashierApi\Business;
use Common\Business\PaySet;
use Pay\Controller\CloudPayController;
use Pay\Controller\NewAliPayController;
use Pay\Library\Cloud\Cloud;
//[1.9.5]
/**
* 撤销支付订单类
* Class RevokeOrder
* [
* 撤销订单 revokeOrder
* 微信撤销订单 revokeWxOrder
* 支付宝撤销订单 revokeZfbOrder
* 云闪付撤销订单 revokeYunOrder
* 修改流水表 payOrderModify
* 支付设置 getPaySet
* 流水信息 getPayInfo
* 撤销订单的参数验证 revokeOrderVerify
* ]
* @package CashierApi\Business
*/
class RevokeOrder
{
/**
* 撤销订单
* @param $param
* [
* merchant_id
* cashier_id
* pay_channel 支付渠道 1微信 2支付宝 3新大陆 4云闪付
* pay_order_id 流水订单id
* ]
* @return mixed
* @throws \Exception
*/
public function revokeOrder($param)
{
$verifyResult = $this->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'], "验证成功");
}
}