178 lines
6.0 KiB
PHP
Executable File
178 lines
6.0 KiB
PHP
Executable File
<?php
|
||
|
||
namespace App\Listeners;
|
||
|
||
use App\Enums\UserType;
|
||
use App\Events\PaySuccessEvent;
|
||
use App\Exceptions\JingCaiException;
|
||
use App\Model\Customer\Customer;
|
||
use App\Model\Customer\CustomerBill;
|
||
use App\Model\Customer\CustomerRecharge;
|
||
use App\Model\Order;
|
||
use App\Model\Seller\Shop;
|
||
use App\Model\Seller\ShopBill;
|
||
use App\Model\Seller\ShopRecharge;
|
||
use App\Model\Trade;
|
||
use App\Service\CustomerWalletService;
|
||
use App\Service\OrderService;
|
||
use App\Service\SellerWalletService;
|
||
use App\Supports\Pay\Pay;
|
||
use Illuminate\Bus\Queueable;
|
||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||
use Illuminate\Foundation\Bus\Dispatchable;
|
||
use Illuminate\Queue\InteractsWithQueue;
|
||
use Illuminate\Queue\SerializesModels;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Illuminate\Support\Facades\Log;
|
||
|
||
class RechargeListener implements ShouldQueue
|
||
{
|
||
|
||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||
/**
|
||
* Create the event listener.
|
||
*
|
||
* @return void
|
||
*/
|
||
public function __construct()
|
||
{
|
||
// 设置队列
|
||
$this->queue = config('queue.names.recharge');
|
||
}
|
||
|
||
public function handle(PaySuccessEvent $event)
|
||
{
|
||
switch ($event->userType) {
|
||
case UserType::CUSTOMER:
|
||
$this->customerRechargeSuccess($event);
|
||
break;
|
||
case UserType::SELLER:
|
||
$this->sellerRechargeSuccess($event);
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function sellerRechargeSuccess(PaySuccessEvent $event)
|
||
{
|
||
/** @var ShopRecharge $recharge */
|
||
$recharge = ShopRecharge::sn($event->rechargeSn)->first();
|
||
if ($recharge->isCompleted()) {
|
||
return;
|
||
}
|
||
|
||
DB::beginTransaction();
|
||
try {
|
||
$recharge->setCompleted();
|
||
// 如果订单没有充值成功,则退出
|
||
if (!$recharge->isSuccess()) {
|
||
Log::error('RechargeListener店主充值没有成功', [
|
||
'recharge_sn' => $event->rechargeSn
|
||
]);
|
||
DB::commit();
|
||
return;
|
||
}
|
||
SellerWalletService::recharge($recharge);
|
||
DB::commit();
|
||
} catch (JingCaiException $e) {
|
||
DB::rollBack();
|
||
Log::error('RechargeListener店主充值失败(JingCaiException):', [
|
||
'error' => $e->getMessage(),
|
||
'tradeInfo' => $event->tradeInfo,
|
||
'recharge_id' => $recharge->id,
|
||
'payType' => $event->payType,
|
||
'tradeRole' => $event->userType,
|
||
]);
|
||
} catch (\Exception $e) {
|
||
DB::rollBack();
|
||
Log::error('RechargeListener店主充值失败(Exception):', [
|
||
'error' => $e->getMessage(),
|
||
'tradeInfo' => $event->tradeInfo,
|
||
'recharge_id' => $recharge->id,
|
||
'payType' => $event->payType,
|
||
'tradeRole' => $event->userType,
|
||
]);
|
||
}
|
||
}
|
||
|
||
public function customerRechargeSuccess(PaySuccessEvent $event)
|
||
{
|
||
$pay = Pay::create($event->payType);
|
||
if (!$pay->tradeSuccessed($event->tradeInfo)) {
|
||
Log::error('RechargeListener彩民交易未成功,不予处理', [
|
||
'tradeInfo' => $event->tradeInfo,
|
||
'payType' => $event->payType,
|
||
'tradeRole' => $event->userType,
|
||
]);
|
||
return;
|
||
|
||
}
|
||
Log::info('customerRechargeSuccess', [
|
||
'tradeInfo' => $event->tradeInfo,
|
||
'rechargeSn' => $event->rechargeSn,
|
||
'payType' => $event->payType,
|
||
'tradeRole' => $event->userType,
|
||
]);
|
||
$rechargeSn = $event->tradeInfo['out_trade_no'];
|
||
/** @var CustomerRecharge $recharge */
|
||
$recharge = CustomerRecharge::sn($rechargeSn)->first();
|
||
if ($recharge->isCompleted()) {
|
||
return;
|
||
}
|
||
|
||
DB::beginTransaction();
|
||
try {
|
||
// 保存第三方交易信息
|
||
$trade = Trade::saveCustomerTrade($recharge, $event->tradeInfo);
|
||
if ($trade->id < 1) {
|
||
Log::error('RechargeListener彩民保存第三方交易数据失败', [
|
||
'tradeInfo' => $event->tradeInfo,
|
||
'recharge_id' => $recharge->id,
|
||
'payType' => $event->payType,
|
||
'tradeRole' => $event->userType,
|
||
]);
|
||
DB::commit();
|
||
return;
|
||
}
|
||
|
||
$recharge->setCompleted();
|
||
// 如果订单没有充值成功,则退出
|
||
if (!$recharge->isSuccess()) {
|
||
Log::error('RechargeListener彩民充值没有成功111', [
|
||
'recharge_sn' => $event->rechargeSn
|
||
]);
|
||
DB::commit();
|
||
return;
|
||
}
|
||
|
||
CustomerWalletService::recharge($recharge);
|
||
|
||
// 如果有订单,则处理订单支付状态
|
||
if ($recharge->order_id > 0) {
|
||
/** @var OrderService $orderService */
|
||
$orderService = app(OrderService::class);
|
||
$orderService->setOrderPaySuccess($recharge->order);
|
||
}
|
||
DB::commit();
|
||
} catch (JingCaiException $e) {
|
||
DB::rollBack();
|
||
Log::error('RechargeListener彩民充值失败(JingCaiException):', [
|
||
'error' => $e->getMessage(),
|
||
'tradeInfo' => $event->tradeInfo,
|
||
'recharge_id' => $recharge->id,
|
||
'payType' => $event->payType,
|
||
'tradeRole' => $event->userType,
|
||
]);
|
||
} catch (\Exception $e) {
|
||
DB::rollBack();
|
||
Log::error('RechargeListener彩民充值失败(Exception):', [
|
||
'error' => $e->getMessage(),
|
||
'tradeInfo' => $event->tradeInfo,
|
||
'recharge_id' => $recharge->id,
|
||
'payType' => $event->payType,
|
||
'tradeRole' => $event->userType,
|
||
]);
|
||
}
|
||
}
|
||
|
||
}
|