阶段更新

This commit is contained in:
2023-01-12 14:47:38 +08:00
parent 088dd64b2f
commit 5b8901281c
626 changed files with 39326 additions and 12 deletions

View File

@@ -0,0 +1,73 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Illuminate\Http\Request;
use Modules\Payment\Models\Alipay;
class AlipayController extends AdminController
{
protected $title = '支付宝';
public function grid(): Grid
{
$grid = new Grid(new Alipay());
$grid->disableFilter();
$grid->column('id', '#ID#');
$grid->column('name', '支付名称');
$grid->column('app_id', '应用APPID');
$grid->column('created_at', '创建时间');
return $grid;
}
public function form(): Form
{
$form = new Form(new Alipay());
$form->text('name', '支付名称')->required();
$form->text('app_id', '应用APPID')->required();
$form->url('notify_url', '通知地址');
$form->url('return_url', '返回地址');
$form->textarea('ali_public_key', '支付公钥');
$form->textarea('private_key', '私钥');
$form->text('app_cert_path', '应用公钥证书')->help('相对/storage/app下的路径如certs/XXX.crt');
$form->text('alipay_cert_path', '支付宝公钥证书')->help('相对/storage/app下的路径如certs/XXX.crt');
$form->text('alipay_root_cert_path', '支付宝根证书文件')->help('相对/storage/app下的路径如certs/XXX.crt');
$form->embeds('log', '日志配置', function (Form\EmbeddedForm $form) {
$form->text('file', '日志文件名');
$form->select('level')->options([
'info' => 'info',
'debug' => 'debug',
])->default('info');
$form->select('type', '记录方式')->options([
'daily' => '按日期',
'single' => '单文件',
])->default('daily');
$form->number('max_file')
->default(30)
->help('当 【记录方式】 为 【按日期】 时有效');
});
return $form;
}
public function ajax(Request $request)
{
$q = $request->q;
return Alipay::where('name', 'like', "%$q%")
->orWhere('app_id', 'like', "%$q%")
->paginate(null, ['id', 'name as text']);
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Modules\Payment\Models\Bill;
class BillController extends AdminController
{
protected $title = '日账单';
public function grid(): Grid
{
$grid = new Grid(new Bill());
$grid->column('date', '账单日期');
$grid->column('total', '累计收款');
$grid->column('refund', '累计退款');
$grid->column('created_at', '统计时间');
return $grid;
}
}

View File

@@ -0,0 +1,60 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Modules\Payment\Models\Payment;
class IndexController extends AdminController
{
protected $title = '支付订单';
public function grid(): Grid
{
$grid = new Grid(new Payment());
$grid->disableCreateButton();
$grid->disableActions();
$grid->quickSearch('trade_id')->placeholder('交易单号');
$grid->filter(function (Grid\Filter $filter) {
$filter->column(1 / 2, function (Grid\Filter $filter) {
$filter->like('trade_id', '交易单号');
$filter->like('transaction_id', '交易单号');
$filter->like('user.username', '下单用户');
$filter->between('created_at', '下单时间')->datetime();
});
$filter->column(1 / 2, function (Grid\Filter $filter) {
$filter->equal('driver', '支付通道')->select(Payment::DRIVER_MAP);
$filter->equal('state', '支付状态')->select(Payment::STATUS_MAP);
$filter->between('paid_at', '支付时间')->datetime();
});
});
$grid->column('trade_id', '交易单号');
$grid->column('transaction_id', '支付单号');
$grid->column('user.username', '下单用户');
$grid->column('driver', '支付通道')
->using(Payment::DRIVER_MAP)
->label(Payment::DRIVER_LABEL_MAP);
$grid->column('gateway', '支付渠道');
$grid->column('state', '支付状态')
->using(Payment::STATUS_MAP)
->label(Payment::STATUS_LABEL_MAP);
$grid->column('total', '应付金额');
$grid->column('paid_at', '支付时间');
$grid->column('退款状态')->display(function () {
return $this->refund_status_text;
})->link(function () {
return route('admin.payment.refunds.index', ['payment[trade_id]' => $this->trade_id]);
}, '_self');
$grid->column('created_at', '创建时间');
return $grid;
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Modules\Payment\Models\Payment;
use Modules\Payment\Models\Redpack;
class RedpackController extends AdminController
{
protected $title = '红包管理';
public function grid(): Grid
{
$grid = new Grid(new Redpack());
$grid->disableActions();
$grid->disableCreateButton();
$grid->quickSearch('redpack_no')->placeholder('红包编号');
$grid->filter(function (Grid\Filter $filter) {
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->like('redpack_no', '红包编号');
});
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->equal('driver', '发送渠道')->select(Payment::DRIVER_MAP);
});
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->equal('type', '红包类型')->select(Redpack::TYPE_MAP);
});
});
$grid->column('redpack_no', '红包编号');
$grid->column('driver', '发送渠道')
->using(Payment::DRIVER_MAP)
->label(Payment::DRIVER_LABEL_MAP);
$grid->column('type', '红包类型')
->using(Redpack::TYPE_MAP);
$grid->column('amount', '红包金额');
$grid->column('to', '发送对象');
$grid->column('status', '发送状态');
$grid->column('created_at', '创建时间');
return $grid;
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Modules\Payment\Models\Refund;
class RefundController extends AdminController
{
protected $title = '退款订单';
public function grid(): Grid
{
$grid = new Grid(new Refund());
$grid->disableCreateButton();
$grid->disableActions();
$grid->quickSearch('refund_no')->placeholder('退款单号');
$grid->filter(function (Grid\Filter $filter) {
$filter->column(1 / 2, function (Grid\Filter $filter) {
$filter->like('payment.trade_id', '订单编号');
});
$filter->column(1 / 2, function (Grid\Filter $filter) {
$filter->like('refund_no', '退款单号');
});
});
$grid->column('payment.trade_id', '订单编号')
->link(function () {
return route('admin.payment.index', ['trade_id' => $this->payment->trade_id]);
}, '_self');
$grid->column('payment.total', '订单金额');
$grid->column('refund_no', '退款单号');
$grid->column('total', '退款金额');
$grid->column('退款类型')->display(function () {
return $this->total === $this->payment->total ? '全额退款' : '部分退款';
});
$grid->column('refund_at', '退款时间');
$grid->column('created_at', '创建时间');
return $grid;
}
}

View File

@@ -0,0 +1,73 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Modules\Payment\Models\Alipay;
use Modules\Payment\Models\Setting;
use Modules\Payment\Models\Wechat;
class SettingController extends AdminController
{
protected $title = '支付配置';
public function grid(): Grid
{
$grid = new Grid(new Setting());
$grid->disableFilter();
$grid->model()->orderByDesc('in_use');
$grid->column('name', '配置名称');
$grid->column('trade_id_counter_length', '计数器位数');
$grid->column('in_use', '使用中')->bool();
$grid->column('wechat.name', '微信支付');
$grid->column('alipay.name', '支付宝');
$grid->column('created_at', '创建时间');
return $grid;
}
public function form(): Form
{
$form = new Form(new Setting());
$form->text('name', '配置名称')
->required();
$form->number('trade_id_counter_length', '计数器位数')
->required()
->default(4)
->rules('integer|max:16', [
'max' => '计数器最大不能超过16',
]);
$form->switch('in_use', '当前配置');
$form->select('wechat_id', '微信支付')
->options(function ($wechatId) {
if ($wechatId) {
$wechat = Wechat::find($wechatId);
if ($wechat) {
return [$wechat->id => $wechat->name];
}
}
})
->ajax(route('admin.payment.wechats.ajax'));
$form->select('alipay_id', '支付宝')
->options(function ($alipayId) {
if ($alipayId) {
$alipay = Alipay::find($alipayId);
if ($alipay) {
return [$alipay->id => $alipay->name];
}
}
})
->ajax(route('admin.payment.alipays.ajax'));
return $form;
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Modules\Payment\Models\Payment;
use Modules\Payment\Models\Transfer;
class TransferController extends AdminController
{
protected $title = '转账管理';
public function grid(): Grid
{
$grid = new Grid(new Transfer());
$grid->disableActions();
$grid->disableCreateButton();
$grid->quickSearch('transfer_no')->placeholder('转账单号');
$grid->filter(function (Grid\Filter $filter) {
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->like('transfer_no', '转账单号');
});
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->equal('driver', '转账渠道')->select(Payment::DRIVER_MAP);
});
$filter->column(1 / 3, function (Grid\Filter $filter) {
$filter->like('user_name', '收款人姓名');
});
});
$grid->column('transfer_no', '转账单号');
$grid->column('driver', '转账渠道')
->using(Payment::DRIVER_MAP)
->label(Payment::DRIVER_LABEL_MAP);;
$grid->column('to', '收款用户');
$grid->column('check', '实名校验')->bool();
$grid->column('user_name', '收款人姓名');
$grid->column('desc', '转账附言');
$grid->column('status', '转账状态');
$grid->column('created_at', '创建时间');
return $grid;
}
}

View File

@@ -0,0 +1,96 @@
<?php
namespace Modules\Payment\Http\Controllers\Admin;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Illuminate\Http\Request;
use Modules\Payment\Models\Wechat;
class WechatController extends AdminController
{
protected $title = '微信支付';
public function grid(): Grid
{
$grid = new Grid(new Wechat());
$grid->disableFilter();
$grid->column('id', '#ID#');
$grid->column('name', '支付名称');
$grid->column('appid', 'APP APPID');
$grid->column('app_id', '公众号 APPID');
$grid->column('miniapp_id', '小程序 APPID');
$grid->column('mch_id', '商户号');
$grid->column('created_at', '创建时间');
return $grid;
}
public function form(): Form
{
$form = new Form(new Wechat());
$form->text('name', '支付名称')
->required();
$form->text('appid', 'APP APPID');
$form->text('app_id', '公众号 APPID');
$form->text('miniapp_id', '小程序 APPID');
$form->text('mch_id', '商户号')
->required()
->rules('required|size:10', [
'required' => '商户号必须填写',
'size' => '商户号长度应为:size位',
]);
$form->text('key', '支付密钥')
->required()->rules('required|size:32', [
'required' => '支付密钥必须填写',
'size' => '支付密钥长度应为:size位',
]);
$form->url('notify_url', '通知地址');
// $form->file('cert_client', '公钥证书')
// ->disk('local')
// ->move('certs')
// ->removable();
//
// $form->file('cert_key', '私钥证书')
// ->disk('local')
// ->move('certs')
// ->removable();
$form->text('cert_client', '公钥证书')->help('相对/storage/app下的路径如certs/apiclient_key.pem');
$form->text('cert_key', '私钥证书')->help('相对/storage/app下的路径如certs/apiclient_cert.pem');
$form->embeds('log', '日志配置', function (Form\EmbeddedForm $form) {
$form->text('file', '日志文件名')->default('wechat');
$form->select('level')->options([
'info' => 'info',
'debug' => 'debug',
])->default('info');
$form->select('type', '记录方式')->options([
'daily' => '按日期',
'single' => '单文件',
])->default('daily');
$form->number('max_file')
->default(30)
->help('当 【记录方式】 为 【按日期】 时有效');
});
return $form;
}
public function ajax(Request $request)
{
$q = $request->q;
return Wechat::where('name', 'like', "%$q%")
->orWhere('mch_id', 'like', "%$q%")
->paginate(null, ['id', 'name as text']);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace Modules\Payment\Http\Controllers\Api;
use App\Api\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Modules\Payment\Models\Setting;
class GatewayController extends Controller
{
/**
* Notes : 获取支持的支付渠道
*
* @Date : 2021/8/26 3:50 下午
* @Author : <Jason.C>
* @return \Illuminate\Http\JsonResponse
*/
public function index(): JsonResponse
{
$setting = Setting::orderByDesc('in_use')->first();
return $this->success([
'alipay' => (bool) $setting->alipay_id,
'wechat' => (bool) $setting->wechat_id,
]);
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace Modules\Payment\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Modules\Payment\Facades\Pay;
use Modules\Payment\Models\Payment;
class NotifyController extends Controller
{
protected Payment $payment;
public function alipay()
{
$alipay = Pay::alipay();
if (config('payment.version', 2) == 2) {
$data = $alipay->verify();
} else {
$data = $alipay->callback();
}
$this->getPaymentByTradeNo($data->out_trade_no);
//设置支付完成
if ($this->payment) {
$this->payment->paid();
$this->payment->order->pay();
}
return $alipay->success();
}
public function wechat()
{
$wechat = Pay::wechat();
if (config('payment.version', 2) == 2) {
$data = $wechat->verify();
$this->getPaymentByTradeNo($data->out_trade_no);
} else {
$data = $wechat->callback();
$this->getPaymentByTradeNo($data->resource['ciphertext']['out_trade_no']);
}
//设置支付完成
if ($this->payment) {
$this->payment->paid();
$this->payment->order->pay();
}
return $wechat->success();
}
public function getPaymentByTradeNo($tradeNo)
{
$this->payment = Payment::where('trade_id', $tradeNo)->first();
}
}