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; } }