87 lines
2.2 KiB
PHP
87 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Constants\PayWay;
|
|
use App\Exceptions\BizException;
|
|
use App\Models\Order;
|
|
use App\Models\PayLog;
|
|
|
|
class PayService
|
|
{
|
|
/**
|
|
* 支付成功
|
|
*
|
|
* @param string $sn
|
|
* @param array $params
|
|
* @return \App\Models\PayLog
|
|
*
|
|
* @throws \App\Exceptions\BizException
|
|
*/
|
|
public function paySuccess(string $sn, array $params = []): PayLog
|
|
{
|
|
$payLog = PayLog::where('pay_sn', $sn)->firstOrFail();
|
|
|
|
if (! $payLog->isPending()) {
|
|
throw new BizException('支付记录状态异常');
|
|
}
|
|
|
|
$payLog->update([
|
|
'pay_at' => $params['pay_at'] ?? now(),
|
|
'out_trade_no' => $params['out_trade_no'] ?? null,
|
|
'status' => PayLog::STATUS_SUCCESS,
|
|
]);
|
|
|
|
if ($payLog->payable instanceof Order) {
|
|
switch ($payLog->pay_way) {
|
|
case PayWay::WXPAY_APP:
|
|
case PayWay::WXPAY_H5:
|
|
case PayWay::WXPAY_JSAPI:
|
|
case PayWay::WXPAY_MINI:
|
|
case PayWay::WXPAY_NATIVE:
|
|
$payWay = Order::PAY_WAY_WXPAY;
|
|
break;
|
|
|
|
default:
|
|
$payWay = $payLog->pay_way;
|
|
break;
|
|
}
|
|
|
|
(new OrderService())->paySuccess($payLog->payable, [
|
|
'pay_sn' => $payLog->pay_sn,
|
|
'pay_way' => $payWay,
|
|
'pay_at' => $payLog->pay_at,
|
|
'out_trade_no' => $payLog->out_trade_no,
|
|
]);
|
|
}
|
|
|
|
return $payLog;
|
|
}
|
|
|
|
/**
|
|
* 支付失败
|
|
*
|
|
* @param string $sn
|
|
* @param array $params
|
|
* @return \App\Models\PayLog
|
|
*
|
|
* @throws \App\Exceptions\BizException
|
|
*/
|
|
public function payFailed(string $sn, array $params = []): PayLog
|
|
{
|
|
$payLog = PayLog::where('pay_sn', $sn)->firstOrFail();
|
|
|
|
if (! $payLog->isPending()) {
|
|
throw new BizException('支付记录状态异常');
|
|
}
|
|
|
|
$payLog->update([
|
|
'out_trade_no' => $params['out_trade_no'] ?? null,
|
|
'status' => PayLog::STATUS_FAILED,
|
|
'failed_reason' => $params['failed_reason'] ?? null,
|
|
]);
|
|
|
|
return $payLog;
|
|
}
|
|
}
|