文件
xionggeshop/addons/shopro_huifu/library/HuifuRefundService.php

79 行
3.1 KiB
PHP

<?php
namespace addons\shopro_huifu\library;
use addons\shopro\model\split\SplitOrder;
use think\Db;
class HuifuRefundService
{
protected $client;
protected $config;
public function __construct()
{
$this->config = HuifuConfig::getInstance();
$this->client = new HuifuClient();
}
public function refund($order, $refundLog, $refundMoney, $remark = '')
{
$ext = HuifuPayService::getPayExt($order['id']);
if (!$ext) {
throw new \RuntimeException('未找到汇付支付记录');
}
$splitOrder = SplitOrder::where('order_id', $order['id'])->where('channel', 'huifu')->where('status', 2)->find();
if ($splitOrder && !empty($splitOrder['confirm_hf_seq_id'])) {
return $this->confirmRefund($ext, $splitOrder, $refundLog, $refundMoney, $remark);
}
return $this->scanpayRefund($ext, $refundLog, $refundMoney, $remark);
}
protected function scanpayRefund($ext, $refundLog, $refundMoney, $remark)
{
SdkLoader::requireRequest('v4/payment/TradePaymentScanpayRefundRequest.php');
$request = new \BsPaySdk\request\v4\payment\TradePaymentScanpayRefundRequest();
$request->setReqDate(date('Ymd'));
$request->setReqSeqId($refundLog['refund_sn']);
$request->setHuifuId($this->config->get('huifu_id'));
$request->setOrdAmt(number_format((float) $refundMoney, 2, '.', ''));
$request->setOrgReqDate($ext['req_date']);
$request->setOrgReqSeqId($ext['req_seq_id']);
if ($this->config->get('refund_notify_url')) {
$request->setNotifyUrl($this->config->getNotifyUrl('refund'));
}
if ($remark) {
$request->setRemark($remark);
}
$result = $this->client->payment()->refund($request);
$data = $this->client->parseResponse($result);
if (($data['trans_stat'] ?? '') === 'S' || ($data['resp_code'] ?? '') === '00000000') {
return true;
}
throw new \RuntimeException($data['resp_desc'] ?? '汇付退款失败');
}
protected function confirmRefund($ext, $splitOrder, $refundLog, $refundMoney, $remark)
{
SdkLoader::requireRequest('V2TradePaymentDelaytransConfirmrefundRequest.php');
$request = new \BsPaySdk\request\V2TradePaymentDelaytransConfirmrefundRequest();
$request->setReqDate(date('Ymd'));
$request->setReqSeqId($refundLog['refund_sn']);
$request->setHuifuId($this->config->get('huifu_id'));
$request->setExtendInfo([
'org_req_date' => $ext['req_date'],
'org_req_seq_id' => $ext['req_seq_id'],
'confirm_hf_seq_id' => $splitOrder['confirm_hf_seq_id'],
'ord_amt' => number_format((float) $refundMoney, 2, '.', ''),
'remark' => $remark,
]);
$result = $this->client->postRequest($request);
$data = $this->client->parseResponse($result);
if (($data['trans_stat'] ?? '') === 'S' || ($data['resp_code'] ?? '') === '00000000') {
return true;
}
throw new \RuntimeException($data['resp_desc'] ?? '汇付确认退款失败');
}
}