This commit is contained in:
parent
e1e599a4cb
commit
0bba4e2aa6
|
@ -2,9 +2,12 @@
|
||||||
|
|
||||||
namespace app\api\controller;
|
namespace app\api\controller;
|
||||||
|
|
||||||
|
use app\common\enum\PayOrderEnum;
|
||||||
use app\common\enum\user\UserTerminalEnum;
|
use app\common\enum\user\UserTerminalEnum;
|
||||||
use app\common\logic\PaymentLogic;
|
use app\common\logic\PaymentLogic;
|
||||||
use app\common\logic\WechatPayServiceMerchantPaymentLogic;
|
use app\common\logic\WechatPayServiceMerchantPaymentLogic;
|
||||||
|
use app\common\model\pay\PayOrder;
|
||||||
|
use app\common\model\pay\RefundOrder;
|
||||||
use app\common\service\pay\WeChatPayMerchantService;
|
use app\common\service\pay\WeChatPayMerchantService;
|
||||||
use app\common\service\pay\WeChatPayService;
|
use app\common\service\pay\WeChatPayService;
|
||||||
use think\Log;
|
use think\Log;
|
||||||
|
@ -36,19 +39,37 @@ class WechatPayServiceMerchantPayController extends BaseApiController
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 申请退款
|
* 申请退款
|
||||||
|
* 先查询有没有支付订单
|
||||||
|
* 在查询微信支付有没有支付记录
|
||||||
|
* 最后再发起退款申请
|
||||||
*/
|
*/
|
||||||
public function refund()
|
public function refund()
|
||||||
{
|
{
|
||||||
$params = $this->request->param(); // business_order_no order_type
|
$params = $this->request->param(); // business_order_no business_callback_url
|
||||||
|
|
||||||
|
$payOrder = PayOrder::where(['business_order_no' => $params['business_order_no'], 'pay_status'=>PayOrderEnum::PAY_STATUS_ISPAID])->find();
|
||||||
|
if (empty($payOrder)) {
|
||||||
|
return $this->fail('系统未找到该订单的支付记录');
|
||||||
|
}
|
||||||
|
|
||||||
|
$wechatPayOrder = (new WeChatPayMerchantService())->queryPayOrder($payOrder);
|
||||||
|
if ($wechatPayOrder['trade_state'] === 'REFUND') {
|
||||||
|
return $this->fail('该订单已申请退款,请勿重复申请');
|
||||||
|
}
|
||||||
|
if ($wechatPayOrder['trade_state'] !== 'SUCCESS') {
|
||||||
|
return $this->fail('交易平台查询到该笔订单未支付成功,无法发起退款');
|
||||||
|
}
|
||||||
$refundOrder = WechatPayServiceMerchantPaymentLogic::createRefundOrder($params);
|
$refundOrder = WechatPayServiceMerchantPaymentLogic::createRefundOrder($params);
|
||||||
|
|
||||||
if (false === $refundOrder) {
|
if (false === $refundOrder) {
|
||||||
return $this->fail('退款订单创建失败', $params);
|
return $this->fail('退款订单创建失败', $params);
|
||||||
}
|
}
|
||||||
//支付流程
|
// 发起退款申请
|
||||||
$result = (new WeChatPayMerchantService())->refund($refundOrder);
|
$result = (new WeChatPayMerchantService())->refund($refundOrder);
|
||||||
if (false === $result) {
|
if (false === $result) {
|
||||||
return $this->fail((new WeChatPayMerchantService())->getError(), $params);
|
return $this->fail((new WeChatPayMerchantService())->getError(), $params);
|
||||||
}
|
}
|
||||||
|
return $this->success('成功', $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -69,12 +69,13 @@ class WechatPayServiceMerchantPaymentLogic extends BaseLogic
|
||||||
$data = [
|
$data = [
|
||||||
'refund_sn' => 'refund'.generate_sn(RefundOrder::class, 'refund_sn'),
|
'refund_sn' => 'refund'.generate_sn(RefundOrder::class, 'refund_sn'),
|
||||||
'order_sn' => $payOrder['order_no'],
|
'order_sn' => $payOrder['order_no'],
|
||||||
'business_order_sn' => $payOrder['business_order_sn'],
|
'business_order_sn' => $payOrder['business_order_no'],
|
||||||
'order_from' => $payOrder['order_from'],
|
'order_from' => $payOrder['order_from'],
|
||||||
'order_amount' => $payOrder['total_fee'],
|
'order_amount' => $payOrder['total_fee'],
|
||||||
'refund_amount' => $payOrder['total_fee'],
|
'refund_amount' => $payOrder['total_fee'],
|
||||||
'refund_type' => 1,
|
'refund_type' => 1,
|
||||||
'refund_status' => 0,
|
'refund_status' => 0,
|
||||||
|
'business_callback_url' => $params['business_callback_url'],
|
||||||
'create_time' => time(),
|
'create_time' => time(),
|
||||||
'update_time' => time(),
|
'update_time' => time(),
|
||||||
];
|
];
|
||||||
|
|
|
@ -119,12 +119,13 @@ class WeChatPayMerchantService extends BasePayService
|
||||||
*/
|
*/
|
||||||
public function refund($refundOrder)
|
public function refund($refundOrder)
|
||||||
{
|
{
|
||||||
|
|
||||||
$payOrder = PayOrder::where(['order_no' => $refundOrder['order_sn'], 'pay_status'=>PayOrderEnum::PAY_STATUS_ISPAID])->find();
|
$payOrder = PayOrder::where(['order_no' => $refundOrder['order_sn'], 'pay_status'=>PayOrderEnum::PAY_STATUS_ISPAID])->find();
|
||||||
|
|
||||||
$response = $this->app->getClient()->postJson('/v3/refund/domestic/refunds', [
|
$response = $this->app->getClient()->postJson('/v3/refund/domestic/refunds', [
|
||||||
'sub_mchid' => $payOrder['collection_account'],
|
'sub_mchid' => $payOrder['collection_account'],
|
||||||
'out_refund_no' => $payOrder['order_no'],
|
'out_trade_no' => $payOrder['order_no'],
|
||||||
'notify_url' => (string)url('wechat_pay_service_merchant_pay/notifyApp', [], false, true),
|
'out_refund_no' => $refundOrder['refund_sn'],
|
||||||
|
'notify_url' => (string)url('wechat_pay_service_merchant_pay/refundNotify', [], false, true),
|
||||||
'amount' => [
|
'amount' => [
|
||||||
'refund' => $refundOrder['refund_amount'],
|
'refund' => $refundOrder['refund_amount'],
|
||||||
'total' => $refundOrder['refund_amount'],
|
'total' => $refundOrder['refund_amount'],
|
||||||
|
@ -136,6 +137,26 @@ class WeChatPayMerchantService extends BasePayService
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @notes 查询退款
|
||||||
|
* @param $refundSn
|
||||||
|
* @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
|
||||||
|
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
|
||||||
|
* @author 段誉
|
||||||
|
* @date 2023/3/1 11:16
|
||||||
|
*/
|
||||||
|
public function queryPayOrder($order)
|
||||||
|
{
|
||||||
|
$response = $this->app->getClient()->get("/v3/pay/partner/transactions/out-trade-no/{$order['order_no']}", [
|
||||||
|
'query' => [
|
||||||
|
'sp_mchid' => $this->config['mch_id'],
|
||||||
|
'sub_mchid' => $order['collection_account']
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
$result = $response->toArray(false);
|
||||||
|
$this->checkResultFail($result);
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @notes 查询退款
|
* @notes 查询退款
|
||||||
|
@ -148,7 +169,9 @@ class WeChatPayMerchantService extends BasePayService
|
||||||
public function queryRefund($refundSn)
|
public function queryRefund($refundSn)
|
||||||
{
|
{
|
||||||
$response = $this->app->getClient()->get("v3/refund/domestic/refunds/{$refundSn}");
|
$response = $this->app->getClient()->get("v3/refund/domestic/refunds/{$refundSn}");
|
||||||
return $response->toArray(false);
|
$result = $response->toArray(false);
|
||||||
|
$this->checkResultFail($result);
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -203,7 +226,7 @@ class WeChatPayMerchantService extends BasePayService
|
||||||
if ($message['trade_state'] === 'SUCCESS') {
|
if ($message['trade_state'] === 'SUCCESS') {
|
||||||
return $this->handlePaid($message);
|
return $this->handlePaid($message);
|
||||||
} else {
|
} else {
|
||||||
\think\facade\Log::info('支付失败', $message);
|
\think\facade\Log::info('支付失败', (array)$message);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
@ -241,6 +264,15 @@ class WeChatPayMerchantService extends BasePayService
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Psr\Http\Message\ResponseInterface
|
||||||
|
* @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
|
||||||
|
* @throws \EasyWeChat\Kernel\Exceptions\RuntimeException
|
||||||
|
* @throws \ReflectionException
|
||||||
|
* @throws \Throwable
|
||||||
|
* 修改状态,回写信息
|
||||||
|
* 通知业务系统
|
||||||
|
*/
|
||||||
public function refundNotify()
|
public function refundNotify()
|
||||||
{
|
{
|
||||||
$server = $this->app->getServer();
|
$server = $this->app->getServer();
|
||||||
|
|
Loading…
Reference in New Issue