jingcai-php/app/Listeners/RechargeListener.php

178 lines
6.0 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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,
]);
}
}
}