289 行
9.1 KiB
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'], "验证成功");
|
|
}
|
|
|
|
|
|
} |