Files
fastmovieai/fastmovie-admin/app/admin/controller/PaymentTemplateController.php
T
李建琦 eae151fd57 FastMovieAI AI短剧创作平台 二开基线
- 源码: xhadmincn/FastMovieAI (Apache 2.0)
- 二开: Docker部署, Swoole改Select, route.php修复, 补update/VERSION
- vendor/示例资源已gitignore
2026-08-26 18:37:36 +08:00

640 lines
25 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace app\admin\controller;
use app\Basic;
use app\expose\build\builder\ComponentBuilder;
use app\expose\build\builder\FormBuilder;
use app\expose\build\builder\TableBuilder;
use app\expose\enum\Action;
use app\expose\enum\AlipayRsaModel;
use app\expose\enum\PaymentChannels;
use app\expose\enum\State;
use app\expose\enum\WxpayMchType;
use app\expose\enum\WxpayVersion;
use app\model\PaymentTemplate;
use support\Request;
class PaymentTemplateController extends Basic
{
public function indexGetTable(Request $request)
{
$builder = new TableBuilder;
$builder->addAction('操作', [
'width' => '200px',
'fixed' => 'right'
]);
$builder->addTableAction('编辑', [
'path' => 'PaymentTemplate/update',
'props' => [
'type' => 'primary',
'title' => '编辑《{title}》支付模板'
],
'component' => [
'name' => 'button',
'props' => [
'type' => 'primary',
'size' => 'small'
]
]
]);
$builder->addTableAction('删除', [
'model' => Action::COMFIRM['value'],
'path' => 'PaymentTemplate/delete',
'props' => [
'type' => 'error',
'message' => '确定要删除《{title}》支付模板吗?',
'confirmButtonClass' => 'el-button--danger'
],
'component' => [
'name' => 'button',
'props' => [
'type' => 'danger',
'size' => 'small'
]
]
]);
$builder->addHeader();
$builder->addHeaderAction('新增模板', [
'path' => 'PaymentTemplate/create',
'props' => [
'type' => 'success',
'title' => '新增支付模板'
],
'component' => [
'name' => 'button',
'props' => [
'type' => 'success',
'icon' => 'Plus'
]
]
]);
$builder->add('id', 'ID', [
'props' => [
'width' => '80px'
]
]);
$builder->add('title', '模板名称');
$builder->add('channels', '支付方式', [
'component' => [
'name' => 'tag',
'options' => PaymentChannels::getOptions()
],
'props' => [
'width' => '160px'
]
]);
$builder->add('state', '状态', [
'component' => [
'name' => 'switch',
'api' => 'PaymentTemplate/indexUpdateState',
'props' => [
'active-value' => State::YES['value'],
'inactive-value' => State::NO['value']
]
],
'props' => [
'width' => '100px'
]
]);
$builder->add('create_time', '时间', [
'props' => [
'width' => '200px'
],
'component' => [
'name' => 'table-times',
'props' => [
'group' => [
[
'field' => 'create_time',
'label' => '创建'
],
[
'field' => 'update_time',
'label' => '更新'
]
]
]
]
]);
return $this->resData($builder);
}
public function index(Request $request)
{
$limit = $request->get('limit', 10);
$where = [];
$where[] = ['channels_uid', '=', null];
$list = PaymentTemplate::where($where)->withoutField('value')
->order('id desc')->paginate($limit)->each(function ($item) {
});
return $this->resData($list);
}
public function create(Request $request)
{
if ($request->method() === 'POST') {
$D = $request->post();
$model = new PaymentTemplate;
$model->title = $D['title'];
unset($D['title']);
$model->channels = $D['channels'];
unset($D['channels']);
$model->state = State::YES['value'];
$model->value = $this->getValue($model->channels, $D);
if ($model->save()) {
return $this->success('新增成功');
}
return $this->fail('新增失败');
}
$builder = $this->getFormBuilder();
return $this->resData($builder);
}
public function update(Request $request)
{
if ($request->method() === 'POST') {
$D = $request->post();
$model = PaymentTemplate::where(['id' => $D['id']])->find();
if (!$model) {
return $this->fail('数据不存在');
}
unset($D['id']);
$model->title = $D['title'];
unset($D['title']);
$model->channels = $D['channels'];
unset($D['channels']);
$model->state = State::YES['value'];
$model->value = $this->getValue($model->channels, $D);
if ($model->save()) {
return $this->success('更新成功');
}
return $this->fail('更新失败');
}
$id = $request->get('id');
$model = PaymentTemplate::where(['id' => $id])->find();
if (!$model) {
return $this->fail('数据不存在');
}
$builder = $this->getFormBuilder(true);
$data = [
'id' => $model->id,
'title' => $model->title,
'channels' => $model->channels
];
foreach ($model->value as $key => $value) {
$data[$key] = $value;
}
$builder->setData($data);
return $this->resData($builder);
}
private function getValue($channels, $D)
{
$value = [];
switch ($channels) {
case PaymentChannels::WXPAY['value']:
$value = [
'mch_type' => $D['mch_type'],
'appid' => $D['appid'],
'mch_id' => $D['mch_id'],
'mch_key' => $D['mch_key'],
'ssl_cert' => $D['ssl_cert'],
'ssl_key' => $D['ssl_key'],
'notify_url' => $D['notify_url'],
];
break;
case PaymentChannels::ALIPAY['value']:
$value = [
'appid' => $D['appid'],
'ras_model' => $D['ras_model'],
'app_public_cert' => $D['app_public_cert'],
'alipay_public_cert' => $D['alipay_public_cert'],
'alipay_root_cert' => $D['alipay_root_cert'],
'alipay_public_key' => $D['alipay_public_key'],
'private_key' => $D['private_key'],
'notify_url' => $D['notify_url'],
];
break;
case PaymentChannels::INTEGRAL['value']:
$value = [
'display_name' => $D['display_name'],
'proportion' => $D['proportion'],
'is_integer' => $D['is_integer'],
'integer' => $D['integer']
];
break;
}
return $value;
}
private function getFormBuilder($update = false)
{
$builder = new FormBuilder(null, '', [
'labelWidth' => '300px',
'labelPosition' => 'right'
]);
$Component = new ComponentBuilder;
$builder->add('title', '模板名称', 'input', null, [
'required' => true,
'prompt' => [
$Component->add('text', ['default' => '仅用于后台管理使用,对前台用户不可见;例如:H5-支付宝支付;微信小程序-微信支付'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入模板名称'
]
]);
$builder->add('channels', '支付方式', 'radio', PaymentChannels::WXPAY['value'], [
'required' => true,
'prompt' => [
$Component->add('text', ['default' => '保存以后支付方式将不可修改,请谨慎操作,'], ['type' => 'info', 'size' => 'small'])
->add('link', ['default' => '微信商户平台'], ['type' => 'success', 'href' => 'https://pay.weixin.qq.com', 'target' => '_blank', 'underline' => 'never', 'size' => 'small'])
->add('text', ['default' => ''], ['type' => 'info', 'size' => 'small'])
->add('link', ['default' => '支付宝开放平台'], ['type' => 'primary', 'href' => 'https://alipay.com', 'target' => '_blank', 'underline' => 'never', 'size' => 'small'])
->builder()
],
'options' => PaymentChannels::getOptions(),
'props' => [
'disabled' => $update
],
'subProps' => [
'border' => true
]
]);
# 微信支付开始
/* $builder->add('api_version', '微信支付接口版本', 'radio', WxpayVersion::V3['value'], [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']]
],
'options' => WxpayVersion::getOptions(),
'subProps' => [
'border' => true
]
]); */
$builder->add('mch_type', '微信商户号类型', 'radio', WxpayMchType::NORMAL['value'], [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']]
],
'options' => WxpayMchType::getOptions(),
'subProps' => [
'border' => true
]
]);
$builder->add('appid', '应用ID (AppID)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::NORMAL['value']]
],
'prompt' => [
$Component->add('text', ['default' => '微信小程序或者微信公众号的APPID,需要在哪个客户端支付就填写哪个,APP支付需要填写开放平台的应用APPID'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入应用ID (AppID)'
]
]);
$builder->add('mch_id', '微信商户号 (MchId)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::NORMAL['value']]
],
'prompt' => [
$Component->add('text', ['default' => '微信支付的商户号,纯数字格式;例如:1600000109'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入微信商户号 (MchId)'
]
]);
$builder->add('mch_key', '支付密钥 (APIKEY)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::NORMAL['value']]
],
'prompt' => [
$Component->add('text', ['default' => '微信支付商户平台 - 账户中心 - API安全 - 设置APIv3密钥'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入支付密钥 (APIKEY)'
]
]);
$builder->add('ssl_cert', '证书文件 (CERT)', 'bundle', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::NORMAL['value']]
],
'props' => [
'view' => 'file',
'multiple' => 1
]
]);
$builder->add('ssl_key', '证书文件 (KEY)', 'bundle', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::NORMAL['value']]
],
'props' => [
'view' => 'file',
'multiple' => 1
]
]);
# 微信支付结束
# 微信支付服务商模式开始
$builder->add('service_appid', '服务商应用ID (AppID)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::SERVICE['value']]
],
'prompt' => [
$Component->add('text', ['default' => '请填写微信支付服务商的AppID'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入服务商应用ID (AppID)'
]
]);
$builder->add('service_mch_id', '服务商户号 (MchId)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::SERVICE['value']]
],
'prompt' => [
$Component->add('text', ['default' => '微信支付服务商的商户号,纯数字格式;例如:1600000109'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入服务商户号 (MchId)'
]
]);
$builder->add('service_mch_key', '服务商密钥 (APIKEY)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::SERVICE['value']]
],
'prompt' => [
$Component->add('text', ['default' => '微信支付商户平台 - 账户中心 - API安全 - 设置API密钥'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入服务商密钥 (APIKEY)'
]
]);
$builder->add('appid', '子商户应用ID (AppID)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::SERVICE['value']]
],
'prompt' => [
$Component->add('text', ['default' => '微信小程序或者微信公众号的APPID,需要在哪个客户端支付就填写哪个,APP支付需要填写开放平台的应用APPID'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入子商户应用ID (AppID)'
]
]);
$builder->add('mch_id', '子商户号 (MchId)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::SERVICE['value']]
],
'prompt' => [
$Component->add('text', ['default' => '微信支付的商户号,纯数字格式;例如:1600000109'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入子商户号 (MchId)'
]
]);
$builder->add('service_ssl_cert', '服务商证书文件 (CERT)', 'bundle', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::SERVICE['value']]
],
'props' => [
'view' => 'file',
'multiple' => 1
]
]);
$builder->add('service_ssl_key', '服务商证书文件 (KEY)', 'bundle', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::WXPAY['value']],
['mch_type', '=', WxpayMchType::SERVICE['value']]
],
'props' => [
'accept' => 'application/octet-stream',
'view' => 'file',
'multiple' => 1
]
]);
# 微信支付服务商模式结束
# 支付宝支付开始
$builder->add('appid', '支付宝应用 (AppID)', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::ALIPAY['value']]
],
'prompt' => [
$Component->add('text', ['default' => '支付宝分配给开发者的应用ID;例如:2021072300007148'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入支付宝应用 (AppID)'
]
]);
$builder->add('ras_model', '加签模式', 'radio', AlipayRsaModel::PUBLIC_CERT['value'], [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::ALIPAY['value']]
],
'prompt' => [
$Component->add('text', ['default' => '如需使用资金支出类的接口,则必须使用公钥证书模式'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'options' => AlipayRsaModel::getOptions(),
'subProps' => [
'border' => true
]
]);
$builder->add('app_public_cert', '应用公钥证书', 'bundle', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::ALIPAY['value']],
['ras_model', '=', AlipayRsaModel::PUBLIC_CERT['value']]
],
'prompt' => [
$Component->add('text', ['default' => '请上传 "appCertPublicKey_xxxxxxxx.crt" 文件'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'view' => 'file',
'multiple' => 1
]
]);
$builder->add('alipay_public_cert', '支付宝公钥证书', 'bundle', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::ALIPAY['value']],
['ras_model', '=', AlipayRsaModel::PUBLIC_CERT['value']]
],
'prompt' => [
$Component->add('text', ['default' => '请上传 "alipayCertPublicKey_RSA2.crt" 文件'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'view' => 'file',
'multiple' => 1
]
]);
$builder->add('alipay_root_cert', '支付宝根证书', 'bundle', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::ALIPAY['value']],
['ras_model', '=', AlipayRsaModel::PUBLIC_CERT['value']]
],
'prompt' => [
$Component->add('text', ['default' => '请上传 "alipayRootCert.crt" 文件'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'view' => 'file',
'multiple' => 1
]
]);
$builder->add('alipay_public_key', '支付宝公钥 (alipayPublicKey)', 'input', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::ALIPAY['value']],
['ras_model', '=', AlipayRsaModel::PUBLIC_KEY['value']]
],
'prompt' => [
$Component->add('text', ['default' => '可在 "支付宝开放平台" - "应用信息" - "接口加签方式" - "支付宝公钥" 中复制'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'textarea',
'autosize' => [
'minRows' => 4,
'maxRows' => 6
],
'placeholder' => '请输入支付宝公钥 (alipayPublicKey)'
]
]);
$builder->add('private_key', '应用私钥 (privateKey)', 'input', '', [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::ALIPAY['value']]
],
'prompt' => [
$Component->add('text', ['default' => '查看 "应用私钥RSA2048-敏感数据,请妥善保管.txt" 文件,将全部内容复制到此处'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'textarea',
'autosize' => [
'minRows' => 4,
'maxRows' => 6
],
'placeholder' => '请输入应用私钥 (privateKey)'
]
]);
$builder->add('display_name', '显示名称', 'input', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::INTEGRAL['value']]
],
'prompt' => [
$Component->add('text', ['default' => '在客户端显示的名称'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '请输入显示名称'
]
]);
$builder->add('proportion', '充值比例', 'input-number', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::INTEGRAL['value']]
],
'prompt' => [
$Component->add('text', ['default' => '1元=多少积分'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'controls' => false,
'min' => 1,
'max' => 1000000
]
]);
$builder->add('is_integer', '整数使用', 'switch', State::NO['value'], [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::INTEGRAL['value']]
],
'prompt' => [
$Component->add('text', ['default' => '开启后只能使用整数的倍数积分'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'active-value' => State::YES['value'],
'inactive-value' => State::NO['value']
]
]);
$builder->add('integer', '整数', 'input-number', null, [
'required' => true,
'where' => [
['channels', '=', PaymentChannels::INTEGRAL['value']],
['is_integer', '=', State::YES['value']]
],
'prompt' => [
$Component->add('text', ['default' => '整数的倍数使用'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'controls' => false,
'min' => 1,
'max' => 1000000
]
]);
$builder->add('notify_url', '支付通知', 'input', null, [
'required' => true,
'where' => [
['channels', 'in', [PaymentChannels::WXPAY['value'],PaymentChannels::ALIPAY['value']]]
],
'prompt' => [
$Component->add('text', ['default' => '只需要填写域名,不需要填写路径,如:https://www.baidu.com'], ['type' => 'info', 'size' => 'small'])
->builder()
],
'props' => [
'type' => 'text',
'placeholder' => '支付通知接口域名'
]
]);
return $builder;
}
}