jingcai-php/app/Service/RechargeService.php

173 lines
5.6 KiB
PHP
Executable File

<?php
namespace App\Service;
use App\Enums\BoolEnum;
use App\Enums\PayState;
use App\Enums\PayType;
use App\Enums\RechargeSnType;
use App\Enums\UserType;
use App\Events\PaySuccessEvent;
use App\Exceptions\JingCaiException;
use App\Listeners\RechargeListener;
use App\Model\BaseModel;
use App\Model\Customer\Customer;
use App\Model\Customer\CustomerRecharge;
use App\Model\Order;
use App\Model\Seller\Seller;
use App\Model\Seller\ShopPayChannel;
use App\Model\Seller\ShopRecharge;
use App\Model\Trade;
use App\Providers\Pay\PayException;
use App\Supports\Pay\Pay;
use App\Utils\Result;
use App\Utils\ThrowException;
use Illuminate\Support\Arr;
class RechargeService
{
/**
* 店铺生成充值订单
* @param Seller $seller
* @param $data
* @return CustomerRecharge
*/
public function shopCreateRecharge(Seller $seller, $data)
{
$payType = Arr::get($data, 'pay_type');
$payMoney = Arr::get($data, 'pay_money');
throw_if(!PayType::hasValue($payType), JingCaiException::create('请选择正确的支付方式'));
throw_if(!bc_gt($payMoney, 0), JingCaiException::create('充值金额必须大于0'));
$od = new ShopRecharge();
$od->recharge_sn = ShopRecharge::snowflake(RechargeSnType::SHOP);
$od->seller_id = $seller->id;
$od->shop_id = $seller->shop_id;
$od->pay_type = $payType;
$od->pay_money = $payMoney;
$od->pay_state = PayState::UNPAID;
$od->save();
return $od;
}
public function shopRedirectPay(Seller $seller, $rechargeSn)
{
return 'https:://baidu.com';
}
/**
* 查询充值订单的充值结果
* @param Customer $customer
* @param $rechargeSn
* @throws \Throwable
*/
public function shopRechargeQuery(Customer $customer, $rechargeSn)
{
/** @var CustomerRecharge $recharge */
$recharge = CustomerRecharge::sn($rechargeSn)
->where('customer_id', $customer->id)
->first();
throw_if(!$recharge, JingCaiException::create('充值单号错误'));
// TODO::此处逻辑需要完善
// throw_if($recharge->pay_state == PayState::PENDING, JingCaiException::create('支付成功,订单处理中'));
if ($recharge->trade) {
return;
}
try {
// $pay = Pay::create($recharge->pay_type);
// $tradeInfo = $pay->tradeQuery($recharge->recharge_sn);
// throw_if(!$pay->tradeSuccessed($tradeInfo), JingCaiException::create($pay->tradeUnSuccessMessage($tradeInfo)));
$tradeInfo = [
'trade_no' => BaseModel::snowflake('ALIPAY'),
'trade_status' => 'TRADE_SUCCESS',
'out_trade_no' => $recharge->recharge_sn,
'send_pay_date' => date('Y-m-d H:i:s'),
'receipt_amount' => $recharge->pay_money,
'total_amount' => $recharge->pay_money,
];
$recharge->setPending();
event(new PaySuccessEvent($tradeInfo, Trade::ROLE_CUSTOMER, $recharge->pay_type,$rechargeSn));
} catch (PayException $exception) {
$code = $exception->getCode() > 0 ? $exception->getCode() : Result::FAILED;
JingCaiException::throwJingcai($exception->getMessage(), $code);
}
}
/**
* 生成充值订单
* @param Customer $customer
* @param $data
* @return CustomerRecharge
*/
public function customerCreateRecharge(Customer $customer, $data)
{
$payType = Arr::get($data, 'pay_type');
$payChannel = Arr::get($data, 'pay_channel', 1);
$payMoney = Arr::get($data, 'pay_money');
$orderSn = Arr::get($data, 'order_sn');
throw_if(!PayType::hasValue($payType), JingCaiException::create('请选择正确的支付方式'));
throw_if(!bc_gt($payMoney, 0), JingCaiException::create('充值金额必须大于0'));
ThrowException::isTrue(!Arr::get(ShopPayChannel::payChannels(), $payChannel), '支付渠道有误');
$shopPayChannel = ShopPayChannel::where('pay_type', $payType)
->where('shop_id', $customer->shop_id)
->where('pay_channel', $payChannel)
->where('opened', BoolEnum::YES)
->where('state', ShopPayChannel::STATE_SUCCESS)
->first();
ThrowException::isTrue(!$shopPayChannel, '支付渠道不可用,请重新选择支付渠道');
$orderId = 0;
if ($orderSn) {
$order = Order::sn($orderSn)->first();
throw_if(!$orderSn, JingCaiException::create('订单号有误'));
$orderId = $order->id;
}
$od = new CustomerRecharge();
$od->recharge_sn = CustomerRecharge::snowflake(RechargeSnType::CUSTOMER);
$od->customer_id = $customer->id;
$od->pay_type = $payType;
$od->pay_channel_id = $shopPayChannel->id;
$od->pay_money = $payMoney;
$od->order_id = $orderId;
$od->pay_state = PayState::UNPAID;
$od->save();
return $od;
}
public function customerRedirectPay(Customer $customer, $rechargeSn)
{
return 'https:://baidu.com';
}
/**
* 查询充值订单的充值结果
* @param Customer $customer
* @param $rechargeSn
* @throws \Throwable
*/
public function customerRechargeQuery(Customer $customer, $rechargeSn)
{
/** @var CustomerRecharge $recharge */
$recharge = CustomerRecharge::sn($rechargeSn)
->where('customer_id', $customer->id)
->first();
throw_if(!$recharge, JingCaiException::create('充值单号错误'));
return $recharge;
}
}