fix: 标准化微信支付配置

This commit is contained in:
邹景立 2025-03-04 00:05:31 +08:00
parent f176fea5c7
commit 8805a2b172
2 changed files with 28 additions and 34 deletions

View File

@ -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('微信支付配置成功!');

View File

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