173 lines
5.6 KiB
PHP
Executable File
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;
|
|
}
|
|
}
|