mirror of
https://gitee.com/zoujingli/ThinkAdmin.git
synced 2026-06-07 12:38:11 +08:00
fix: 标准化微信支付配置
This commit is contained in:
parent
f176fea5c7
commit
8805a2b172
@ -18,6 +18,7 @@ declare (strict_types=1);
|
||||
|
||||
namespace app\wechat\controller;
|
||||
|
||||
use app\wechat\service\PaymentService;
|
||||
use app\wechat\service\WechatService;
|
||||
use think\admin\Builder;
|
||||
use think\admin\Controller;
|
||||
@ -146,10 +147,11 @@ class Config extends Controller
|
||||
if ($this->request->isGet()) {
|
||||
$this->title = '微信支付配置';
|
||||
$local = LocalStorage::instance();
|
||||
$this->mch_ssl_cer = sysconf('wechat.mch_ssl_cer');
|
||||
$this->mch_ssl_key = sysconf('wechat.mch_ssl_key');
|
||||
$this->mch_ssl_p12 = sysconf('wechat.mch_ssl_p12');
|
||||
$this->mch_ssl_pay = sysconf('wechat.mch_ssl_pay');
|
||||
$data = sysdata('plugin.wechat.payment');
|
||||
$this->mch_ssl_cer = $data['mch_ssl_cer'] ?? '';
|
||||
$this->mch_ssl_key = $data['mch_ssl_key'] ?? '';
|
||||
$this->mch_ssl_p12 = $data['mch_ssl_p12'] ?? '';
|
||||
$this->mch_ssl_pay = $data['mch_ssl_pay'] ?? '';
|
||||
if (!$local->has($this->mch_ssl_cer, true)) $this->mch_ssl_cer = '';
|
||||
if (!$local->has($this->mch_ssl_key, true)) $this->mch_ssl_key = '';
|
||||
if (!$local->has($this->mch_ssl_p12, true)) $this->mch_ssl_p12 = '';
|
||||
@ -172,16 +174,12 @@ class Config extends Controller
|
||||
$wechat = $this->request->post('wechat');
|
||||
// PEM 证书模式处理
|
||||
if ($wechat['mch_ssl_type'] === 'pem') {
|
||||
WechatService::withWxpayCert(['mch_id' => $wechat['mch_id']]);
|
||||
if (empty($wechat['mch_ssl_key']) || !$local->has($wechat['mch_ssl_key'], true)) {
|
||||
$this->error('商户证书密钥不能为空!');
|
||||
}
|
||||
if (empty($wechat['mch_ssl_cer']) || !$local->has($wechat['mch_ssl_cer'], true)) {
|
||||
$this->error('商户证书公钥不能为空!');
|
||||
}
|
||||
if (empty($wechat['mch_ssl_pay']) || !$local->has($wechat['mch_ssl_pay'], true)) {
|
||||
$this->error('微信支付公钥不能为空!');
|
||||
}
|
||||
}
|
||||
// P12 证书模式转 PEM 模式
|
||||
if ($wechat['mch_ssl_type'] === 'p12') {
|
||||
@ -198,6 +196,9 @@ class Config extends Controller
|
||||
$this->error('商户账号与 P12 证书不匹配!');
|
||||
}
|
||||
}
|
||||
if (empty($wechat['mch_ssl_pay']) || !$local->has($wechat['mch_ssl_pay'], true)) {
|
||||
$this->error('微信支付公钥不能为空!');
|
||||
}
|
||||
// 记录文本格式参数,兼容分布式部署
|
||||
sysdata('plugin.wechat.payment', [
|
||||
'appid' => WechatService::getAppid(),
|
||||
@ -205,12 +206,15 @@ class Config extends Controller
|
||||
'mch_key' => $wechat['mch_key'],
|
||||
'mch_v3_key' => $wechat['mch_v3_key'],
|
||||
'ssl_pay_id' => $wechat['mch_v3_payid'] ?? '',
|
||||
'ssl_pay_text' => $local->get($wechat['mch_ssl_pay'], true),
|
||||
'ssl_key_text' => $local->get($wechat['mch_ssl_key'], true),
|
||||
'mch_ssl_cer' => $wechat['mch_ssl_cer'],
|
||||
'mch_ssl_key' => $wechat['mch_ssl_key'],
|
||||
'mch_ssl_pay' => $wechat['mch_ssl_pay'],
|
||||
'ssl_cer_text' => $local->get($wechat['mch_ssl_cer'], true),
|
||||
'ssl_key_text' => $local->get($wechat['mch_ssl_key'], true),
|
||||
'ssl_pay_text' => $local->get($wechat['mch_ssl_pay'], true),
|
||||
]);
|
||||
// 记录证书路径参数,兼容历史参数
|
||||
foreach ($wechat as $k => $v) sysconf("wechat.{$k}", $v);
|
||||
// 同步更新证书内容
|
||||
WechatService::withWxpayCert(['mch_id' => $wechat['mch_id']]);
|
||||
// 记录操作历史并返回保存结果
|
||||
sysoplog('微信支付配置', '修改微信支付配置成功');
|
||||
$this->success('微信支付配置成功!');
|
||||
|
||||
@ -226,33 +226,23 @@ class WechatService extends Service
|
||||
public static function withWxpayCert(array $options): array
|
||||
{
|
||||
// 文本模式主要是为了解决分布式部署
|
||||
$name1 = "wxpay/{$options['mch_id']}_cer.pem";
|
||||
$name2 = "wxpay/{$options['mch_id']}_key.pem";
|
||||
$data = sysdata('plugin.wechat.payment');
|
||||
$name1 = sprintf("wxpay/%s_%s_cer.pem", $options['mch_id'], md5($data['ssl_cer_text']));
|
||||
$name2 = sprintf("wxpay/%s_%s_key.pem", $options['mch_id'], md5($data['ssl_key_text']));
|
||||
$local = LocalStorage::instance();
|
||||
if ($local->has($name1, true) && $local->has($name2, true)) {
|
||||
$sslCer = $local->path($name1, true);
|
||||
$sslKey = $local->path($name2, true);
|
||||
} else {
|
||||
$sslCer = $local->set($name1, $data['ssl_cer_text'], true)['file'];
|
||||
$sslKey = $local->set($name2, $data['ssl_key_text'], true)['file'];
|
||||
}
|
||||
$data = sysdata('plugin.wechat.payment');
|
||||
if (empty($sslCer) || empty($sslKey)) {
|
||||
if (empty($data)) {
|
||||
$sslCer = $local->path(sysconf('wechat.mch_ssl_cer'), true);
|
||||
$sslKey = $local->path(sysconf('wechat.mch_ssl_key'), true);
|
||||
if (!$local->has($sslCer, true)) unset($sslCer);
|
||||
if (!$local->has($sslKey, true)) unset($sslKey);
|
||||
} elseif (!empty($data['ssl_key_text']) && !empty($data['ssl_cer_text'])) {
|
||||
$sslCer = $local->set($name1, $data['ssl_cer_text'], true)['file'];
|
||||
$sslKey = $local->set($name2, $data['ssl_key_text'], true)['file'];
|
||||
}
|
||||
}
|
||||
if (isset($sslCer) && isset($sslKey)) {
|
||||
$options['ssl_cer'] = $sslCer;
|
||||
$options['ssl_key'] = $sslKey;
|
||||
$options['cert_public'] = $sslCer;
|
||||
$options['cert_private'] = $sslKey;
|
||||
$options['mp_cert_serial'] = $data['ssl_pay_id'] ?? '';
|
||||
$options['mp_cert_content'] = $data['ssl_pay_text'] ?? '';
|
||||
}
|
||||
$options['ssl_cer'] = $sslCer;
|
||||
$options['ssl_key'] = $sslKey;
|
||||
$options['cert_public'] = $sslCer;
|
||||
$options['cert_private'] = $sslKey;
|
||||
$options['mp_cert_serial'] = $data['ssl_pay_id'] ?? '';
|
||||
$options['mp_cert_content'] = $data['ssl_pay_text'] ?? '';
|
||||
return $options;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user