From 1760cdbcb2a58bd047788ba86c23c03d3cfd95e1 Mon Sep 17 00:00:00 2001 From: yansongda Date: Fri, 31 Jan 2025 22:45:47 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=89=88=E5=BE=AE=E4=BF=A1=E5=95=86=E6=88=B7=E8=BD=AC?= =?UTF-8?q?=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Functions.php | 2 +- .../V3/Marketing/MchTransfer/CancelPlugin.php | 54 ++ .../V3/Marketing/MchTransfer/CreatePlugin.php | 101 +++ .../MchTransfer/InvokeAndroidPlugin.php | 77 ++ .../Marketing/MchTransfer/InvokeIosPlugin.php | 77 ++ .../MchTransfer/InvokeJsapiPlugin.php | 74 ++ .../Marketing/MchTransfer/QueryByWxPlugin.php | 54 ++ .../V3/Marketing/MchTransfer/QueryPlugin.php | 54 ++ .../Transfer/Batch/QueryByWxPlugin.php | 1 + .../Marketing/Transfer/Batch/QueryPlugin.php | 1 + .../V3/Marketing/Transfer/CreatePlugin.php | 1 + .../Transfer/Detail/QueryByWxPlugin.php | 1 + .../Marketing/Transfer/Detail/QueryPlugin.php | 1 + .../Transfer/DownloadReceiptPlugin.php | 1 + .../Transfer/Receipt/CreatePlugin.php | 1 + .../Transfer/Receipt/QueryPlugin.php | 1 + .../Transfer/ReceiptDetail/CreatePlugin.php | 1 + .../Transfer/ReceiptDetail/QueryPlugin.php | 1 + .../MchTransfer/CancelPluginTest.php | 60 ++ .../MchTransfer/CreatePluginTest.php | 158 ++++ .../MchTransfer/InvokeAndroidPluginTest.php | 72 ++ .../MchTransfer/InvokeIosPluginTest.php | 72 ++ .../MchTransfer/InvokeJsapiPluginTest.php | 74 ++ .../MchTransfer/QueryByWxPluginTest.php | 60 ++ .../Marketing/MchTransfer/QueryPluginTest.php | 60 ++ web/docs/v3/quick-start/init.md | 4 +- web/package.json | 13 +- web/pnpm-lock.yaml | 847 +++++++++--------- 28 files changed, 1490 insertions(+), 433 deletions(-) create mode 100644 src/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPlugin.php create mode 100644 src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php create mode 100644 src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPlugin.php create mode 100644 src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPlugin.php create mode 100644 src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPlugin.php create mode 100644 src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPlugin.php create mode 100644 src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPlugin.php create mode 100644 tests/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPluginTest.php create mode 100644 tests/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePluginTest.php create mode 100644 tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPluginTest.php create mode 100644 tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPluginTest.php create mode 100644 tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPluginTest.php create mode 100644 tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPluginTest.php create mode 100644 tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPluginTest.php diff --git a/src/Functions.php b/src/Functions.php index dd804744e..4c7826e64 100644 --- a/src/Functions.php +++ b/src/Functions.php @@ -456,7 +456,7 @@ function get_wechat_public_key(array $config, string $serialNo): string $publicKey = $config['wechat_public_cert_path'][$serialNo] ?? null; if (empty($publicKey)) { - throw new InvalidParamsException(Exception::PARAMS_WECHAT_SERIAL_NOT_FOUND, '参数异常: 微信公钥序列号为找到 -'.$serialNo); + throw new InvalidParamsException(Exception::PARAMS_WECHAT_SERIAL_NOT_FOUND, '参数异常: 微信公钥序列号未找到 - '.$serialNo); } return $publicKey; diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPlugin.php new file mode 100644 index 000000000..91cd6995e --- /dev/null +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPlugin.php @@ -0,0 +1,54 @@ + $rocket]); + + $config = get_provider_config('wechat', $rocket->getParams()); + $payload = $rocket->getPayload(); + $outBillNo = $payload?->get('out_bill_no') ?? null; + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + throw new InvalidParamsException(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE, '参数异常: 撤销转账,只支持普通商户模式,当前配置为服务商模式'); + } + + if (empty($outBillNo)) { + throw new InvalidParamsException(Exception::PARAMS_NECESSARY_PARAMS_MISSING, '参数异常: 撤销转账,参数缺少 `out_bill_no`'); + } + + $rocket->setPayload([ + '_method' => 'POST', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills/out-bill-no/'.$outBillNo.'/cancel', + ]); + + Logger::info('[Wechat][Marketing][MchTransfer][CancelPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); + } +} diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php new file mode 100644 index 000000000..9823d61d7 --- /dev/null +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php @@ -0,0 +1,101 @@ + $rocket]); + + $params = $rocket->getParams(); + $payload = $rocket->getPayload(); + $config = get_provider_config('wechat', $params); + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + throw new InvalidParamsException(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE, '参数异常: 发起商家转账,只支持普通商户模式,当前配置为服务商模式'); + } + + if (is_null($payload) || $payload->isEmpty()) { + throw new InvalidParamsException(Exception::PARAMS_NECESSARY_PARAMS_MISSING, '参数异常: 发起商家转账参数,参数缺失'); + } + + $rocket->mergePayload(array_merge( + [ + '_method' => 'POST', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills', + 'appid' => $payload->get('appid', $config[get_wechat_type_key($params)] ?? ''), + ], + $this->normal($params, $config, $payload) + )); + + Logger::info('[Wechat][Marketing][MchTransfer][CreatePlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); + } + + /** + * @throws ContainerException + * @throws InvalidParamsException + * @throws ServiceNotFoundException + * @throws DecryptException + * @throws InvalidConfigException + */ + protected function normal(array $params, array $config, Collection $payload): array + { + if (!$payload->has('user_name')) { + return []; + } + + return $this->encryptSensitiveData($params, $config, $payload); + } + + /** + * @throws ContainerException + * @throws DecryptException + * @throws InvalidConfigException + * @throws InvalidParamsException + * @throws ServiceNotFoundException + */ + protected function encryptSensitiveData(array $params, array $config, Collection $payload): array + { + $data['_serial_no'] = get_wechat_serial_no($params); + + $publicKey = get_wechat_public_key($config, $data['_serial_no']); + + $data['user_name'] = encrypt_wechat_contents($payload->get('user_name'), $publicKey); + + return $data; + } +} diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPlugin.php new file mode 100644 index 000000000..b8ac3ea87 --- /dev/null +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPlugin.php @@ -0,0 +1,77 @@ + $rocket]); + + $config = get_provider_config('wechat', $rocket->getParams()); + $destination = $rocket->getDestination(); + $packageInfo = $destination?->get('package_info'); + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + throw new InvalidParamsException(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE, '参数异常: Android调起用户确认收款,只支持普通商户模式,当前配置为服务商模式'); + } + + if (is_null($packageInfo)) { + Logger::error('[Wechat][V3][Marketing][MchTransfer][InvokeAndroidPlugin] Android调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求', $destination?->all() ?? null); + + throw new InvalidResponseException(Exception::RESPONSE_MISSING_NECESSARY_PARAMS, $destination?->get('fail_reason') ?? 'Android调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求', $destination?->all() ?? null); + } + + $params = $rocket->getParams(); + $config = get_provider_config('wechat', $params); + $payload = $rocket->getPayload(); + + $rocket->setDestination($this->getInvokeConfig($payload, $params, $config, $packageInfo)); + + Logger::info('[Wechat][V3][Marketing][MchTransfer][InvokeAndroidPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $rocket; + } + + protected function getInvokeConfig(?Collection $payload, array $params, array $config, string $packageInfo): Config + { + return new Config([ + 'businessType' => 'requestMerchantTransfer', + 'query' => http_build_query([ + 'appId' => $payload?->get('_invoke_appId') ?? $config[get_wechat_type_key($params)] ?? '', + 'mchId' => $payload?->get('_invoke_mchId') ?? $config['mch_id'] ?? '', + 'package' => $packageInfo, + ]), + ]); + } +} diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPlugin.php new file mode 100644 index 000000000..f124cc98b --- /dev/null +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPlugin.php @@ -0,0 +1,77 @@ + $rocket]); + + $config = get_provider_config('wechat', $rocket->getParams()); + $destination = $rocket->getDestination(); + $packageInfo = $destination?->get('package_info'); + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + throw new InvalidParamsException(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE, '参数异常: iOS调起用户确认收款,只支持普通商户模式,当前配置为服务商模式'); + } + + if (is_null($packageInfo)) { + Logger::error('[Wechat][V3][Marketing][MchTransfer][InvokeIosPlugin] iOS调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求', $destination?->all() ?? null); + + throw new InvalidResponseException(Exception::RESPONSE_MISSING_NECESSARY_PARAMS, $destination?->get('fail_reason') ?? 'iOS调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求', $destination?->all() ?? null); + } + + $params = $rocket->getParams(); + $config = get_provider_config('wechat', $params); + $payload = $rocket->getPayload(); + + $rocket->setDestination($this->getInvokeConfig($payload, $params, $config, $packageInfo)); + + Logger::info('[Wechat][V3][Marketing][MchTransfer][InvokeIosPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $rocket; + } + + protected function getInvokeConfig(?Collection $payload, array $params, array $config, string $packageInfo): Config + { + return new Config([ + 'businessType' => 'requestMerchantTransfer', + 'query' => http_build_query([ + 'appId' => $payload?->get('_invoke_appId') ?? $config[get_wechat_type_key($params)] ?? '', + 'mchId' => $payload?->get('_invoke_mchId') ?? $config['mch_id'] ?? '', + 'package' => $packageInfo, + ]), + ]); + } +} diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPlugin.php new file mode 100644 index 000000000..ac7c5ac34 --- /dev/null +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPlugin.php @@ -0,0 +1,74 @@ + $rocket]); + + $config = get_provider_config('wechat', $rocket->getParams()); + $destination = $rocket->getDestination(); + $packageInfo = $destination?->get('package_info'); + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + throw new InvalidParamsException(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE, '参数异常: JSAPI调起用户确认收款,只支持普通商户模式,当前配置为服务商模式'); + } + + if (is_null($packageInfo)) { + Logger::error('[Wechat][V3][Marketing][MchTransfer][InvokeJsapiPlugin] JSAPI调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求', $destination?->all() ?? null); + + throw new InvalidResponseException(Exception::RESPONSE_MISSING_NECESSARY_PARAMS, $destination?->get('fail_reason') ?? 'JSAPI调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求', $destination?->all() ?? null); + } + + $params = $rocket->getParams(); + $config = get_provider_config('wechat', $params); + $payload = $rocket->getPayload(); + + $rocket->setDestination($this->getInvokeConfig($payload, $params, $config, $packageInfo)); + + Logger::info('[Wechat][V3][Marketing][MchTransfer][InvokeJsapiPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $rocket; + } + + protected function getInvokeConfig(?Collection $payload, array $params, array $config, string $packageInfo): Config + { + return new Config([ + 'appId' => $payload?->get('_invoke_appId') ?? $config[get_wechat_type_key($params)] ?? '', + 'mchId' => $payload?->get('_invoke_mchId') ?? $config['mch_id'] ?? '', + 'package' => $packageInfo, + ]); + } +} diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPlugin.php new file mode 100644 index 000000000..a1129005e --- /dev/null +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPlugin.php @@ -0,0 +1,54 @@ + $rocket]); + + $config = get_provider_config('wechat', $rocket->getParams()); + $payload = $rocket->getPayload(); + $transferBillNo = $payload?->get('transfer_bill_no') ?? null; + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + throw new InvalidParamsException(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE, '参数异常: 通过微信单号查询转账单,只支持普通商户模式,当前配置为服务商模式'); + } + + if (empty($transferBillNo)) { + throw new InvalidParamsException(Exception::PARAMS_NECESSARY_PARAMS_MISSING, '参数异常: 通过微信单号查询转账单,参数缺少 `transfer_bill_no`'); + } + + $rocket->setPayload([ + '_method' => 'GET', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills/transfer-bill-no/'.$transferBillNo, + ]); + + Logger::info('[Wechat][Marketing][MchTransfer][QueryByWxPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); + } +} diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPlugin.php new file mode 100644 index 000000000..f7b802098 --- /dev/null +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPlugin.php @@ -0,0 +1,54 @@ + $rocket]); + + $config = get_provider_config('wechat', $rocket->getParams()); + $payload = $rocket->getPayload(); + $outBillNo = $payload?->get('out_bill_no') ?? null; + + if (Pay::MODE_SERVICE === ($config['mode'] ?? Pay::MODE_NORMAL)) { + throw new InvalidParamsException(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE, '参数异常: 通过商户单号查询转账单,只支持普通商户模式,当前配置为服务商模式'); + } + + if (empty($outBillNo)) { + throw new InvalidParamsException(Exception::PARAMS_NECESSARY_PARAMS_MISSING, '参数异常: 通过商户单号查询转账单,参数缺少 `out_bill_no`'); + } + + $rocket->setPayload([ + '_method' => 'GET', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills/out-bill-no/'.$outBillNo, + ]); + + Logger::info('[Wechat][Marketing][MchTransfer][QueryPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); + } +} diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php index 7d6ae2d61..bcf706241 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php @@ -19,6 +19,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/get-transfer-batch-by-no.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class QueryByWxPlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php index 36ac73a5a..39216c4ea 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php @@ -19,6 +19,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/get-transfer-batch-by-out-no.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class QueryPlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php index c0e853127..12bb53c40 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php @@ -25,6 +25,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/initiate-batch-transfer.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class CreatePlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php index e022ccf9e..30e9eb50e 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php @@ -18,6 +18,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-detail/get-transfer-detail-by-no.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class QueryByWxPlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php index 970a0c029..f5ea09bd4 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php @@ -18,6 +18,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-detail/get-transfer-detail-by-out-no.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class QueryPlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php index c1a1972b6..0bfdb1f89 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php @@ -19,6 +19,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/download-receipt.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class DownloadReceiptPlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php index b8e98eb3b..701ea97a6 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php @@ -18,6 +18,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-signature/create-electronic-signature.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class CreatePlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php index 37d4f7437..02435e179 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php @@ -18,6 +18,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-signature/get-electronic-signature-by-out-no.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class QueryPlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php index c2c01b1e7..089aca0aa 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php @@ -18,6 +18,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-receipt-api/create-electronic-receipt.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class CreatePlugin implements PluginInterface { diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php index df46b69fa..0b1ca13c5 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php @@ -19,6 +19,7 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-receipt-api/query-electronic-receipt.html + * @deprecated since v3.7.12 and will be removed in v3.8.0. */ class QueryPlugin implements PluginInterface { diff --git a/tests/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPluginTest.php b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPluginTest.php new file mode 100644 index 000000000..f03f4aca1 --- /dev/null +++ b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPluginTest.php @@ -0,0 +1,60 @@ +plugin = new CancelPlugin(); + } + + public function testModeWrong() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'service_provider']); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE); + self::expectExceptionMessage('参数异常: 撤销转账,只支持普通商户模式,当前配置为服务商模式'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testEmptyPayload() + { + $rocket = new Rocket(); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_NECESSARY_PARAMS_MISSING); + self::expectExceptionMessage('参数异常: 撤销转账,参数缺少 `out_bill_no`'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testNormalParams() + { + $rocket = new Rocket(); + $rocket->setPayload(new Collection( [ + "out_bill_no" => "111", + ])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + self::assertEquals([ + '_method' => 'POST', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills/out-bill-no/111/cancel', + ], $result->getPayload()->all()); + } +} diff --git a/tests/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePluginTest.php b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePluginTest.php new file mode 100644 index 000000000..2a7ab6414 --- /dev/null +++ b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePluginTest.php @@ -0,0 +1,158 @@ +plugin = new CreatePlugin(); + } + + public function testModeWrong() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'service_provider']); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE); + self::expectExceptionMessage('参数异常: 发起商家转账,只支持普通商户模式,当前配置为服务商模式'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testEmptyPayload() + { + $rocket = new Rocket(); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_NECESSARY_PARAMS_MISSING); + self::expectExceptionMessage('参数异常: 发起商家转账参数,参数缺失'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testNormalParams() + { + $rocket = new Rocket(); + $rocket->setPayload(new Collection( [ + "test" => "yansongda", + 'appid' => '1111', + ])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + self::assertEquals([ + '_method' => 'POST', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills', + 'test' => 'yansongda', + 'appid' => '1111', + ], $result->getPayload()->all()); + } + + public function testNormalWithoutName() + { + $rocket = new Rocket(); + $rocket->setPayload(new Collection( [ + "test" => "yansongda", + ])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + self::assertEquals([ + '_method' => 'POST', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills', + 'test' => 'yansongda', + 'appid' => 'wx55955316af4ef13', + ], $result->getPayload()->all()); + } + + public function testNormalWithName() + { + $rocket = new Rocket(); + $rocket->setPayload(new Collection([ + "test" => "111", + 'user_name' => 'yansongda', + 'foo' => 'bar', + ])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { + return $rocket; + }); + + $payload = $result->getPayload()->all(); + self::assertEquals('POST', $payload['_method']); + self::assertEquals('v3/fund-app/mch-transfer/transfer-bills', $payload['_url']); + self::assertEquals('wx55955316af4ef13', $payload['appid']); + self::assertEquals('111', $payload['test']); + self::assertEquals('bar', $payload['foo']); + self::assertArrayHasKey('_serial_no', $payload); + self::assertArrayHasKey('user_name', $payload); + self::assertNotEquals('yansongda', $payload['user_name']); + } + + public function testNormalWithNameEmptyWechatCer() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'empty_wechat_public_cert'])->setPayload(new Collection([ + "test" => "111", + 'user_name' => 'yansongda', + 'foo' => 'bar', + ])); + + $response = new Response( + 200, + [], + json_encode([ + 'data' => [ + [ + 'effective_time' => '2021-07-16T17:51:10+08:00', + 'encrypt_certificate' => [ + 'algorithm' => 'AEAD_AES_256_GCM', + 'associated_data' => 'certificate', + 'ciphertext' => 'kbbHAUhBwdjYZkHPW149MW/8WNpxQo1Gyp4kVNVjd+zrXnyOFhgZic2U2+tobFAgfdr93zr0JZF3FdbxgkaOAV2NAeCfU8jsUYXSfn7fM8487jXMVXKKEneGiiv1/bDLkz7KFsTfu2y5Rv+igWQ+bvCUQAwoNzjupTXnnDR5hBiofZcFLHL45govyYE2o0qD5SLiJHcFS4pg/IOx8SIqUFNepr3piKXUxKowU8/kNxXyRzL8yp7XnhrzAzclupvjveNwZyiw3TqlLZdR5TbEFLCogWaRHZRqz3vKEfgRaUYUtXCtQVrm+adbSDBFIq34v+XfeIHMz9pKhH/m80N5Hx69hPzbvIdBhzwaEDyN3h8gaeYKFyW9xIAs5jCrzzUEkKyMzOKzx7XA+1HRakSyvs6RlkRTa/ztBy6aZL0nxK6XMZ9tA7zdf2VnBX/7WPQYRzoky0cVyH1KRZxI7In2hfvpjSvl6P7Adzp+EZXYM/dINTrrg+RQRe60tPy7vgE8PZZf+SAWzSZPWIm7Lx6GksJX0vnT4gOeTAPw6EeFsYU/ZD7fYslJOEbA14yHBrJFkwDpSI8aSHp2nZYbruM0y8IKr0p3vjN80Ko3jiRPxj4uNdJliR9WDCV22b9JeadAaJhO9+oSNbbtFnFTCZjXbf8rMz5KCGVrGRvUyB70zhRxYIOdTYKAEkmbU7jcMLd0aufuQqIw0WviQHB+ztrkjBCFwPu5/hlRVj9opNFnzYNltfVGrA1XW3NQ4FaMNah95ahomAG/+S7zJqq4Gvk1O/PgQ9kMP0adY3GlrHUNqr2zC709IervMQ1pEdcuNEln3V5TSDiE0x7BjoMoN2m+MKAIhw59VxzHGNmJELbkKsZUhKKXFFyEXFsw143/9IYOyanmHQxujdIBKI0rxYkVz9QgaajisCzdnRf0ymnkceGGnYsP7VTYBnuCncjgHxbEn3emlTRygEjgj/epupsQL2tfW+snxnafEM+Pc079pUYmKeCUEUoX/FUmdFIf8hlSHBTjEVMGsNUI/u2W781RBDfk2X/2QQQm3NOjgZ3le6hxEQqc12yANTvdq7cFVllWqMHBsXPCjpHWIHcS5BMkImoD7s6WItq60yJA8ioGJf3Rba+Yb/YeBBNxjDnXtAmX/2hJIsxEFLTYGUvdmFC5jeb5ifrOuxnLciKM8y4nLZ28dDsvVsaBBAMAFYfWb5NymKUDhhngR5bDuW4sKccZ6DmYQeStHT1fn2yoSneGA70HctQSWZ2roTdNihPTCs7rYD0dFeQ+SfLOJzMN4c5GbJ6n5tdCjERcLGIaXEKacfySo7e4VZtHeHowvlvBclS9pooZqzHd+EFlJEYywEs9jURgsJY2yHJt2zTZeIdsvM8KK5v0NkH8FiPbWqFG8LaRmUrqhJGLuLLRTcJnt6YVYESxUVTb3pmriUbXfg/ThHF/y0THyrM6bVDNOwNWZOpMYPPNaVmOTX39JdYayWl2HX0n8AsIRmevXzD4N9iDh2HGwie4gh92Qdcogwua++uhkhSsLFuWBpJiaPdxVtzz3E3jHfy+yryfh6msaXc/jmhwqBm/ii3j76lDP5YaRv4+JWZmom72+pmZuKD8qPKrPRxI2/aGiKEqgs25knpLLnbAhWAEYeIzVK1sQkjc5JFss1Std8FdDrHeM6agAB+MWncK1LloXZmiwz/6WmlwSDepnGHqLEciXThAZq6FwunJZTcHY9LamJgIY81c9t/KHlSFqlc/9mW4OZHM4BOZQ5sTj5PWE+OP2Aq9CKdJqoK3OmphBg2ewjrZt5/tSn9jpk6NlVrHD7MsJcKi5a0he4qvNPh1cHqUqWcF4rBFmfPptdHIBV77LXnizJZMUAwf16KsmJpwJg==', + 'nonce' => '4196a5b75276', + ], + 'expire_time' => '2026-07-15T17:51:10+08:00', + 'serial_no' => 'test-45F59D4DABF31918AFCEC556D5D2C6E376675D57', + ] + ] + ]) + ); + + $http = Mockery::mock(Client::class); + $http->shouldReceive('sendRequest')->andReturn($response); + + Pay::set(HttpClientInterface::class, $http); + + $result = $this->plugin->assembly($rocket, function ($rocket) { + return $rocket; + }); + + $payload = $result->getPayload()->all(); + self::assertEquals('POST', $payload['_method']); + self::assertEquals('v3/fund-app/mch-transfer/transfer-bills', $payload['_url']); + self::assertEquals('wx55955316af4ef13', $payload['appid']); + self::assertEquals('111', $payload['test']); + self::assertEquals('bar', $payload['foo']); + self::assertArrayHasKey('_serial_no', $payload); + self::assertArrayHasKey('user_name', $payload); + self::assertNotEquals('yansongda', $payload['user_name']); + } +} diff --git a/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPluginTest.php b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPluginTest.php new file mode 100644 index 000000000..ac425e7a8 --- /dev/null +++ b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPluginTest.php @@ -0,0 +1,72 @@ +plugin = new InvokeAndroidPlugin(); + } + + public function testModeWrong() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'service_provider']); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE); + self::expectExceptionMessage('参数异常: Android调起用户确认收款,只支持普通商户模式,当前配置为服务商模式'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testMissingPackage() + { + $rocket = new Rocket(); + + self::expectException(InvalidResponseException::class); + self::expectExceptionCode(Exception::RESPONSE_MISSING_NECESSARY_PARAMS); + self::expectExceptionMessage('Android调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testNormalParams() + { + $rocket = (new Rocket()) + ->setDestination(new Collection(['package_info' => 'affffddafdfafddffda=='])) + ->setPayload(['_invoke_appId' => '111']); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + $contents = $result->getDestination(); + + self::assertEquals('requestMerchantTransfer', $contents->get('businessType')); + self::assertEquals('appId=111&mchId=1600314069&package=affffddafdfafddffda%3D%3D', $contents->get('query')); + } + + public function testNormal() + { + $rocket = (new Rocket())->setDestination(new Collection(['package_info' => 'affffddafdfafddffda=='])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + $contents = $result->getDestination(); + + self::assertEquals('requestMerchantTransfer', $contents->get('businessType')); + self::assertEquals('appId=wx55955316af4ef13&mchId=1600314069&package=affffddafdfafddffda%3D%3D', $contents->get('query')); + } +} \ No newline at end of file diff --git a/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPluginTest.php b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPluginTest.php new file mode 100644 index 000000000..79aa93b61 --- /dev/null +++ b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPluginTest.php @@ -0,0 +1,72 @@ +plugin = new InvokeIosPlugin(); + } + + public function testModeWrong() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'service_provider']); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE); + self::expectExceptionMessage('参数异常: iOS调起用户确认收款,只支持普通商户模式,当前配置为服务商模式'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testMissingPackage() + { + $rocket = new Rocket(); + + self::expectException(InvalidResponseException::class); + self::expectExceptionCode(Exception::RESPONSE_MISSING_NECESSARY_PARAMS); + self::expectExceptionMessage('iOS调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testNormalParams() + { + $rocket = (new Rocket()) + ->setDestination(new Collection(['package_info' => 'affffddafdfafddffda=='])) + ->setPayload(['_invoke_appId' => '111']); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + $contents = $result->getDestination(); + + self::assertEquals('requestMerchantTransfer', $contents->get('businessType')); + self::assertEquals('appId=111&mchId=1600314069&package=affffddafdfafddffda%3D%3D', $contents->get('query')); + } + + public function testNormal() + { + $rocket = (new Rocket())->setDestination(new Collection(['package_info' => 'affffddafdfafddffda=='])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + $contents = $result->getDestination(); + + self::assertEquals('requestMerchantTransfer', $contents->get('businessType')); + self::assertEquals('appId=wx55955316af4ef13&mchId=1600314069&package=affffddafdfafddffda%3D%3D', $contents->get('query')); + } +} \ No newline at end of file diff --git a/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPluginTest.php b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPluginTest.php new file mode 100644 index 000000000..444dfd6f7 --- /dev/null +++ b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPluginTest.php @@ -0,0 +1,74 @@ +plugin = new InvokeJsapiPlugin(); + } + + public function testModeWrong() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'service_provider']); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE); + self::expectExceptionMessage('参数异常: JSAPI调起用户确认收款,只支持普通商户模式,当前配置为服务商模式'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testMissingPackage() + { + $rocket = new Rocket(); + + self::expectException(InvalidResponseException::class); + self::expectExceptionCode(Exception::RESPONSE_MISSING_NECESSARY_PARAMS); + self::expectExceptionMessage('JSAPI调起用户确认收款失败:响应缺少 `package_info` 参数,请自行检查参数是否符合微信要求'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testNormalParams() + { + $rocket = (new Rocket()) + ->setDestination(new Collection(['package_info' => 'yansongda'])) + ->setPayload(['_invoke_appId' => '111']); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + $contents = $result->getDestination(); + + self::assertEquals('111', $contents->get('appId')); + self::assertEquals('yansongda', $contents->get('package')); + self::assertEquals('1600314069', $contents->get('mchId')); + } + + public function testNormal() + { + $rocket = (new Rocket())->setDestination(new Collection(['package_info' => 'yansongda'])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + $contents = $result->getDestination(); + + self::assertEquals('wx55955316af4ef13', $contents->get('appId')); + self::assertEquals('yansongda', $contents->get('package')); + self::assertEquals('1600314069', $contents->get('mchId')); + } +} \ No newline at end of file diff --git a/tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPluginTest.php b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPluginTest.php new file mode 100644 index 000000000..6acac33f4 --- /dev/null +++ b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPluginTest.php @@ -0,0 +1,60 @@ +plugin = new QueryByWxPlugin(); + } + + public function testModeWrong() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'service_provider']); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE); + self::expectExceptionMessage('参数异常: 通过微信单号查询转账单,只支持普通商户模式,当前配置为服务商模式'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testEmptyPayload() + { + $rocket = new Rocket(); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_NECESSARY_PARAMS_MISSING); + self::expectExceptionMessage('参数异常: 通过微信单号查询转账单,参数缺少 `transfer_bill_no`'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testNormalParams() + { + $rocket = new Rocket(); + $rocket->setPayload(new Collection( [ + "transfer_bill_no" => "111", + ])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + self::assertEquals([ + '_method' => 'GET', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills/transfer-bill-no/111', + ], $result->getPayload()->all()); + } +} diff --git a/tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPluginTest.php b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPluginTest.php new file mode 100644 index 000000000..7b9492972 --- /dev/null +++ b/tests/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPluginTest.php @@ -0,0 +1,60 @@ +plugin = new QueryPlugin(); + } + + public function testModeWrong() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'service_provider']); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_PLUGIN_ONLY_SUPPORT_NORMAL_MODE); + self::expectExceptionMessage('参数异常: 通过商户单号查询转账单,只支持普通商户模式,当前配置为服务商模式'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testEmptyPayload() + { + $rocket = new Rocket(); + + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_NECESSARY_PARAMS_MISSING); + self::expectExceptionMessage('参数异常: 通过商户单号查询转账单,参数缺少 `out_bill_no`'); + + $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + } + + public function testNormalParams() + { + $rocket = new Rocket(); + $rocket->setPayload(new Collection( [ + "out_bill_no" => "111", + ])); + + $result = $this->plugin->assembly($rocket, function ($rocket) { return $rocket; }); + + self::assertEquals([ + '_method' => 'GET', + '_url' => 'v3/fund-app/mch-transfer/transfer-bills/out-bill-no/111', + ], $result->getPayload()->all()); + } +} diff --git a/web/docs/v3/quick-start/init.md b/web/docs/v3/quick-start/init.md index 71fd59f93..a0f591cf0 100644 --- a/web/docs/v3/quick-start/init.md +++ b/web/docs/v3/quick-start/init.md @@ -69,8 +69,8 @@ $config = [ 'sub_mini_app_id' => '', // 「选填」服务商模式下,子商户id 'sub_mch_id' => '', - // 「选填」(适用于 2024-11 及之前开通微信支付的老商户)微信平台公钥证书路径,强烈建议 php-fpm 模式下配置此参数 - // 「必填」微信支付公钥路径,key 填写形如 PUB_KEY_ID_0000000000000024101100397200000006 的公钥id,见 https://pay.weixin.qq.com/doc/v3/merchant/4013053249 + // 「选填」(适用于 2024-11 及之前开通微信支付的老商户)微信支付平台证书序列号及证书路径,强烈建议 php-fpm 模式下配置此参数 + // 「必填」微信支付公钥ID及证书路径,key 填写形如 PUB_KEY_ID_0000000000000024101100397200000006 的公钥id,见 https://pay.weixin.qq.com/doc/v3/merchant/4013053249 'wechat_public_cert_path' => [ '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt', 'PUB_KEY_ID_0000000000000024101100397200000006' => __DIR__.'/Cert/publickey.pem', diff --git a/web/package.json b/web/package.json index addb9601a..f475d002c 100644 --- a/web/package.json +++ b/web/package.json @@ -6,11 +6,11 @@ "web:serve": "vitepress serve" }, "devDependencies": { - "@types/node": "^22.10.2", - "fast-glob": "^3.3.2", - "sass": "^1.83.0", - "vite": "^6.0.9", - "vitepress": "^1.5.0", + "@types/node": "^22.12.0", + "fast-glob": "^3.3.3", + "sass": "^1.83.4", + "vite": "^6.0.11", + "vitepress": "^1.6.3", "vue": "^3.5.13" }, "pnpm": { @@ -20,5 +20,6 @@ "search-insights" ] } - } + }, + "packageManager": "pnpm@9.15.4+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0" } diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 4138e6bbf..e7bb6bd15 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -9,20 +9,20 @@ importers: .: devDependencies: '@types/node': - specifier: ^22.10.2 - version: 22.10.2 + specifier: ^22.12.0 + version: 22.12.0 fast-glob: - specifier: ^3.3.2 - version: 3.3.2 + specifier: ^3.3.3 + version: 3.3.3 sass: - specifier: ^1.83.0 - version: 1.83.0 + specifier: ^1.83.4 + version: 1.83.4 vite: - specifier: ^6.0.9 - version: 6.0.9(@types/node@22.10.2)(sass@1.83.0) + specifier: ^6.0.11 + version: 6.0.11(@types/node@22.12.0)(sass@1.83.4) vitepress: - specifier: ^1.5.0 - version: 1.5.0(@algolia/client-search@5.18.0)(@types/node@22.10.2)(postcss@8.5.1)(sass@1.83.0)(search-insights@2.13.0) + specifier: ^1.6.3 + version: 1.6.3(@algolia/client-search@5.20.0)(@types/node@22.12.0)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0) vue: specifier: ^3.5.13 version: 3.5.13 @@ -49,56 +49,56 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.18.0': - resolution: {integrity: sha512-DLIrAukjsSrdMNNDx1ZTks72o4RH/1kOn8Wx5zZm8nnqFexG+JzY4SANnCNEjnFQPJTTvC+KpgiNW/CP2lumng==} + '@algolia/client-abtesting@5.20.0': + resolution: {integrity: sha512-YaEoNc1Xf2Yk6oCfXXkZ4+dIPLulCx8Ivqj0OsdkHWnsI3aOJChY5qsfyHhDBNSOhqn2ilgHWxSfyZrjxBcAww==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.18.0': - resolution: {integrity: sha512-0VpGG2uQW+h2aejxbG8VbnMCQ9ary9/ot7OASXi6OjE0SRkYQ/+pkW+q09+IScif3pmsVVYggmlMPtAsmYWHng==} + '@algolia/client-analytics@5.20.0': + resolution: {integrity: sha512-CIT9ni0+5sYwqehw+t5cesjho3ugKQjPVy/iPiJvtJX4g8Cdb6je6SPt2uX72cf2ISiXCAX9U3cY0nN0efnRDw==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.18.0': - resolution: {integrity: sha512-X1WMSC+1ve2qlMsemyTF5bIjwipOT+m99Ng1Tyl36ZjQKTa54oajBKE0BrmM8LD8jGdtukAgkUhFoYOaRbMcmQ==} + '@algolia/client-common@5.20.0': + resolution: {integrity: sha512-iSTFT3IU8KNpbAHcBUJw2HUrPnMXeXLyGajmCL7gIzWOsYM4GabZDHXOFx93WGiXMti1dymz8k8R+bfHv1YZmA==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.18.0': - resolution: {integrity: sha512-FAJRNANUOSs/FgYOJ/Njqp+YTe4TMz2GkeZtfsw1TMiA5mVNRS/nnMpxas9771aJz7KTEWvK9GwqPs0K6RMYWg==} + '@algolia/client-insights@5.20.0': + resolution: {integrity: sha512-w9RIojD45z1csvW1vZmAko82fqE/Dm+Ovsy2ElTsjFDB0HMAiLh2FO86hMHbEXDPz6GhHKgGNmBRiRP8dDPgJg==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.18.0': - resolution: {integrity: sha512-I2dc94Oiwic3SEbrRp8kvTZtYpJjGtg5y5XnqubgnA15AgX59YIY8frKsFG8SOH1n2rIhUClcuDkxYQNXJLg+w==} + '@algolia/client-personalization@5.20.0': + resolution: {integrity: sha512-p/hftHhrbiHaEcxubYOzqVV4gUqYWLpTwK+nl2xN3eTrSW9SNuFlAvUBFqPXSVBqc6J5XL9dNKn3y8OA1KElSQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.18.0': - resolution: {integrity: sha512-x6XKIQgKFTgK/bMasXhghoEjHhmgoP61pFPb9+TaUJ32aKOGc65b12usiGJ9A84yS73UDkXS452NjyP50Knh/g==} + '@algolia/client-query-suggestions@5.20.0': + resolution: {integrity: sha512-m4aAuis5vZi7P4gTfiEs6YPrk/9hNTESj3gEmGFgfJw3hO2ubdS4jSId1URd6dGdt0ax2QuapXufcrN58hPUcw==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.18.0': - resolution: {integrity: sha512-qI3LcFsVgtvpsBGR7aNSJYxhsR+Zl46+958ODzg8aCxIcdxiK7QEVLMJMZAR57jGqW0Lg/vrjtuLFDMfSE53qA==} + '@algolia/client-search@5.20.0': + resolution: {integrity: sha512-KL1zWTzrlN4MSiaK1ea560iCA/UewMbS4ZsLQRPoDTWyrbDKVbztkPwwv764LAqgXk0fvkNZvJ3IelcK7DqhjQ==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.18.0': - resolution: {integrity: sha512-bGvJg7HnGGm+XWYMDruZXWgMDPVt4yCbBqq8DM6EoaMBK71SYC4WMfIdJaw+ABqttjBhe6aKNRkWf/bbvYOGyw==} + '@algolia/ingestion@1.20.0': + resolution: {integrity: sha512-shj2lTdzl9un4XJblrgqg54DoK6JeKFO8K8qInMu4XhE2JuB8De6PUuXAQwiRigZupbI0xq8aM0LKdc9+qiLQA==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.18.0': - resolution: {integrity: sha512-lBssglINIeGIR+8KyzH05NAgAmn1BCrm5D2T6pMtr/8kbTHvvrm1Zvcltc5dKUQEFyyx3J5+MhNc7kfi8LdjVw==} + '@algolia/monitoring@1.20.0': + resolution: {integrity: sha512-aF9blPwOhKtWvkjyyXh9P5peqmhCA1XxLBRgItT+K6pbT0q4hBDQrCid+pQZJYy4HFUKjB/NDDwyzFhj/rwKhw==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.18.0': - resolution: {integrity: sha512-uSnkm0cdAuFwdMp4pGT5vHVQ84T6AYpTZ3I0b3k/M3wg4zXDhl3aCiY8NzokEyRLezz/kHLEEcgb/tTTobOYVw==} + '@algolia/recommend@5.20.0': + resolution: {integrity: sha512-T6B/WPdZR3b89/F9Vvk6QCbt/wrLAtrGoL8z4qPXDFApQ8MuTFWbleN/4rHn6APWO3ps+BUePIEbue2rY5MlRw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.18.0': - resolution: {integrity: sha512-1XFjW0C3pV0dS/9zXbV44cKI+QM4ZIz9cpatXpsjRlq6SUCpLID3DZHsXyE6sTb8IhyPaUjk78GEJT8/3hviqg==} + '@algolia/requester-browser-xhr@5.20.0': + resolution: {integrity: sha512-t6//lXsq8E85JMenHrI6mhViipUT5riNhEfCcvtRsTV+KIBpC6Od18eK864dmBhoc5MubM0f+sGpKOqJIlBSCg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.18.0': - resolution: {integrity: sha512-0uodeNdAHz1YbzJh6C5xeQ4T6x5WGiUxUq3GOaT/R4njh5t78dq+Rb187elr7KtnjUmETVVuCvmEYaThfTHzNg==} + '@algolia/requester-fetch@5.20.0': + resolution: {integrity: sha512-FHxYGqRY+6bgjKsK4aUsTAg6xMs2S21elPe4Y50GB0Y041ihvw41Vlwy2QS6K9ldoftX4JvXodbKTcmuQxywdQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.18.0': - resolution: {integrity: sha512-tZCqDrqJ2YE2I5ukCQrYN8oiF6u3JIdCxrtKq+eniuLkjkO78TKRnXrVcKZTmfFJyyDK8q47SfDcHzAA3nHi6w==} + '@algolia/requester-node-http@5.20.0': + resolution: {integrity: sha512-kmtQClq/w3vtPteDSPvaW9SPZL/xrIgMrxZyAgsFwrJk0vJxqyC5/hwHmrCraDnStnGSADnLpBf4SpZnwnkwWw==} engines: {node: '>= 14.0.0'} '@babel/helper-string-parser@7.25.9': @@ -109,13 +109,13 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.7': + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.7': + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} engines: {node: '>=6.9.0'} '@docsearch/css@3.8.2': @@ -429,8 +429,8 @@ packages: cpu: [x64] os: [win32] - '@iconify-json/simple-icons@1.2.17': - resolution: {integrity: sha512-1vXbM6a6HV2rwXxu8ptD2OYhqrqX0ZZRepOg7nIjkvKlKq90Iici4X++A8h36bEVlV2wGjqx8uVYB0pwnPZVSw==} + '@iconify-json/simple-icons@1.2.22': + resolution: {integrity: sha512-0UzThRMwHuOJfgpp+tyV/y2uEBLjFVrxC4igv9iWjSEQEBK4tNjWZNTRCBCYyv/FwWVYyKAsA8tZQ8vUYzvFnw==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -450,200 +450,206 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@parcel/watcher-android-arm64@2.5.0': - resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.0': - resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==} + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.0': - resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==} + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.0': - resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==} + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.0': - resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==} + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.0': - resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.0': - resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.0': - resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.0': - resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.0': - resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.0': - resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.0': - resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==} + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.0': - resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==} + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.0': - resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@rollup/rollup-android-arm-eabi@4.31.0': - resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==} + '@rollup/rollup-android-arm-eabi@4.32.1': + resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.31.0': - resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==} + '@rollup/rollup-android-arm64@4.32.1': + resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.31.0': - resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==} + '@rollup/rollup-darwin-arm64@4.32.1': + resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.31.0': - resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==} + '@rollup/rollup-darwin-x64@4.32.1': + resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.31.0': - resolution: {integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==} + '@rollup/rollup-freebsd-arm64@4.32.1': + resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.31.0': - resolution: {integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==} + '@rollup/rollup-freebsd-x64@4.32.1': + resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.31.0': - resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==} + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': + resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.31.0': - resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==} + '@rollup/rollup-linux-arm-musleabihf@4.32.1': + resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.31.0': - resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==} + '@rollup/rollup-linux-arm64-gnu@4.32.1': + resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.31.0': - resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==} + '@rollup/rollup-linux-arm64-musl@4.32.1': + resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.31.0': - resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': - resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.31.0': - resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==} + '@rollup/rollup-linux-riscv64-gnu@4.32.1': + resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.31.0': - resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==} + '@rollup/rollup-linux-s390x-gnu@4.32.1': + resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.31.0': - resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==} + '@rollup/rollup-linux-x64-gnu@4.32.1': + resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.31.0': - resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==} + '@rollup/rollup-linux-x64-musl@4.32.1': + resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.31.0': - resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==} + '@rollup/rollup-win32-arm64-msvc@4.32.1': + resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.31.0': - resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==} + '@rollup/rollup-win32-ia32-msvc@4.32.1': + resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.31.0': - resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==} + '@rollup/rollup-win32-x64-msvc@4.32.1': + resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==} cpu: [x64] os: [win32] - '@shikijs/core@1.24.4': - resolution: {integrity: sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==} + '@shikijs/core@2.2.0': + resolution: {integrity: sha512-U+vpKdsQDWuX3fPTCkSc8XPX9dCaS+r+qEP1XhnU30yxRFo2OxHJmY2H5rO1q+v0zB5R2vobsxEFt5uPf31CGQ==} - '@shikijs/engine-javascript@1.24.4': - resolution: {integrity: sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==} + '@shikijs/engine-javascript@2.2.0': + resolution: {integrity: sha512-96SpZ4V3UVMtpSPR5QpmU395CNrQiRPszXK62m8gKR2HMA0653ruce7omS5eX6EyAyFSYHvBWtTuspiIsHpu4A==} - '@shikijs/engine-oniguruma@1.24.4': - resolution: {integrity: sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==} + '@shikijs/engine-oniguruma@2.2.0': + resolution: {integrity: sha512-wowCKwkvPFFMXFkiKK/a2vs5uTCc0W9+O9Xcu/oqFP6VoDFe14T8u/D+Rl4dCJJSOyeynP9mxNPJ82T5JHTNCw==} - '@shikijs/transformers@1.24.4': - resolution: {integrity: sha512-0jq5p9WLB7ToM/O7RWfxuIwirTJbIQsUR06jxdG3h3CEuO5m7ik8GnDsxwHhyIEfgJSZczSnVUZWFrNKy5It6g==} + '@shikijs/langs@2.2.0': + resolution: {integrity: sha512-RSWLH3bnoyG6O1kZ2msh5jOkKKp8eENwyT30n62vUtXfp5cxkF/bpWPpO+p4+GAPhL2foBWR2kOerwkKG0HXlQ==} - '@shikijs/types@1.24.4': - resolution: {integrity: sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==} + '@shikijs/themes@2.2.0': + resolution: {integrity: sha512-8Us9ZF2mV9kuh+4ySJ9MzrUDIpc2RIkRfKBZclkliW1z9a0PlGU2U7fCkItZZHpR5e4/ft5BzuO+GDqombC6Aw==} - '@shikijs/vscode-textmate@9.3.1': - resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + '@shikijs/transformers@2.2.0': + resolution: {integrity: sha512-zrj7OcSKAh3KL4Jgv45aKS6lSPXZWq61/DyXJJ5gsBMUIE5Ojmnvmseit7H8zQ/xPQOgJP+XqEzy7utScv0N9w==} + + '@shikijs/types@2.2.0': + resolution: {integrity: sha512-wkZZKs80NtW5Jp/7ONI1j7EdXSatX2BKMS7I01wliDa09gJKHkZyVqlEMRka/mjT5Qk9WgAyitoCKgGgbsP/9g==} + + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -663,8 +669,8 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/node@22.10.2': - resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + '@types/node@22.12.0': + resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -672,8 +678,8 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@ungap/structured-clone@1.2.1': - resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@vitejs/plugin-vue@5.2.1': resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} @@ -694,14 +700,14 @@ packages: '@vue/compiler-ssr@3.5.13': resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - '@vue/devtools-api@7.6.8': - resolution: {integrity: sha512-ma6dY/sZR36zALVsV1W7eC57c6IJPXsy8SNgZn1PLVWU4z4dPn5TIBmnF4stmdJ4sQcixqKaQ8pwjbMPzEZwiA==} + '@vue/devtools-api@7.7.1': + resolution: {integrity: sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==} - '@vue/devtools-kit@7.6.8': - resolution: {integrity: sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==} + '@vue/devtools-kit@7.7.1': + resolution: {integrity: sha512-yhZ4NPnK/tmxGtLNQxmll90jIIXdb2jAhPF76anvn5M/UkZCiLJy28bYgPIACKZ7FCosyKoaope89/RsFJll1w==} - '@vue/devtools-shared@7.6.8': - resolution: {integrity: sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==} + '@vue/devtools-shared@7.7.1': + resolution: {integrity: sha512-BtgF7kHq4BHG23Lezc/3W2UhK2ga7a8ohAIAGJMBr4BkxUFzhqntQtCiuL1ijo2ztWnmusymkirgqUrXoQKumA==} '@vue/reactivity@3.5.13': resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} @@ -720,11 +726,11 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@vueuse/core@11.3.0': - resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} + '@vueuse/core@12.5.0': + resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} - '@vueuse/integrations@11.3.0': - resolution: {integrity: sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==} + '@vueuse/integrations@12.5.0': + resolution: {integrity: sha512-HYLt8M6mjUfcoUOzyBcX2RjpfapIwHPBmQJtTmXOQW845Y/Osu9VuTJ5kPvnmWJ6IUa05WpblfOwZ+P0G4iZsQ==} peerDependencies: async-validator: ^4 axios: ^1 @@ -764,14 +770,14 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@11.3.0': - resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} + '@vueuse/metadata@12.5.0': + resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} - '@vueuse/shared@11.3.0': - resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} + '@vueuse/shared@12.5.0': + resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} - algoliasearch@5.18.0: - resolution: {integrity: sha512-/tfpK2A4FpS0o+S78o3YSdlqXr0MavJIDlFK3XZrlXLy7vaRXJvW5jYg3v5e/wCaF8y0IpMjkYLhoV6QqfpOgw==} + algoliasearch@5.20.0: + resolution: {integrity: sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ==} engines: {node: '>= 14.0.0'} birpc@0.2.19: @@ -836,8 +842,8 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fastq@1.18.0: @@ -847,8 +853,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - focus-trap@7.6.2: - resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} + focus-trap@7.6.4: + resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -936,8 +942,8 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - oniguruma-to-es@0.8.1: - resolution: {integrity: sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==} + oniguruma-to-es@2.3.0: + resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -953,8 +959,8 @@ packages: resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} - preact@10.25.3: - resolution: {integrity: sha512-dzQmIFtM970z+fP9ziQ3yG4e3ULIbwZzJ734vaMVUTaKQ2+Ru1Ou/gjshOYVHCcd1rpAelC6ngjvjDXph98unQ==} + preact@10.25.4: + resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -962,18 +968,18 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} - regex-recursion@5.0.0: - resolution: {integrity: sha512-UwyOqeobrCCqTXPcsSqH4gDhOjD5cI/b8kjngWgSZbxYh5yVjAwTjO5+hAuPRNiuR70+5RlWSs+U9PVcVcW9Lw==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@5.0.2: - resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -982,24 +988,24 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.31.0: - resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==} + rollup@4.32.1: + resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - sass@1.83.0: - resolution: {integrity: sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==} + sass@1.83.4: + resolution: {integrity: sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==} engines: {node: '>=14.0.0'} hasBin: true search-insights@2.13.0: resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} - shiki@1.24.4: - resolution: {integrity: sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==} + shiki@2.2.0: + resolution: {integrity: sha512-3uoZBmc+zpd2JOEeTvKP/vK5UVDDe8YiigkT9flq+MV5Z1MKFiUXfbLIvHfqcJ+V90StDiP1ckN97z1WlhC6cQ==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -1084,8 +1090,8 @@ packages: terser: optional: true - vite@6.0.9: - resolution: {integrity: sha512-MSgUxHcaXLtnBPktkbUSoQUANApKYuxZ6DrbVENlIorbhL2dZydTLaZ01tjUoE3szeFzlFk9ANOKk0xurh4MKA==} + vite@6.0.11: + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1124,8 +1130,8 @@ packages: yaml: optional: true - vitepress@1.5.0: - resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} + vitepress@1.6.3: + resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -1136,17 +1142,6 @@ packages: postcss: optional: true - vue-demi@0.14.10: - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} - hasBin: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue@3.5.13: resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: @@ -1160,130 +1155,130 @@ packages: snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) - '@algolia/client-search': 5.18.0 - algoliasearch: 5.18.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) + '@algolia/client-search': 5.20.0 + algoliasearch: 5.20.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': dependencies: - '@algolia/client-search': 5.18.0 - algoliasearch: 5.18.0 + '@algolia/client-search': 5.20.0 + algoliasearch: 5.20.0 - '@algolia/client-abtesting@5.18.0': + '@algolia/client-abtesting@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-analytics@5.18.0': + '@algolia/client-analytics@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-common@5.18.0': {} + '@algolia/client-common@5.20.0': {} - '@algolia/client-insights@5.18.0': + '@algolia/client-insights@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-personalization@5.18.0': + '@algolia/client-personalization@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-query-suggestions@5.18.0': + '@algolia/client-query-suggestions@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/client-search@5.18.0': + '@algolia/client-search@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/ingestion@1.18.0': + '@algolia/ingestion@1.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/monitoring@1.18.0': + '@algolia/monitoring@1.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/recommend@5.18.0': + '@algolia/recommend@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + '@algolia/client-common': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 - '@algolia/requester-browser-xhr@5.18.0': + '@algolia/requester-browser-xhr@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 + '@algolia/client-common': 5.20.0 - '@algolia/requester-fetch@5.18.0': + '@algolia/requester-fetch@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 + '@algolia/client-common': 5.20.0 - '@algolia/requester-node-http@5.18.0': + '@algolia/requester-node-http@5.20.0': dependencies: - '@algolia/client-common': 5.18.0 + '@algolia/client-common': 5.20.0 '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.3': + '@babel/parser@7.26.7': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.7 - '@babel/types@7.26.3': + '@babel/types@7.26.7': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0)': + '@docsearch/js@3.8.2(@algolia/client-search@5.20.0)(search-insights@2.13.0)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0) - preact: 10.25.3 + '@docsearch/react': 3.8.2(@algolia/client-search@5.20.0)(search-insights@2.13.0) + preact: 10.25.4 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -1291,12 +1286,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0)': + '@docsearch/react@3.8.2(@algolia/client-search@5.20.0)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.18.0)(algoliasearch@5.18.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) '@docsearch/css': 3.8.2 - algoliasearch: 5.18.0 + algoliasearch: 5.20.0 optionalDependencies: search-insights: 2.13.0 transitivePeerDependencies: @@ -1446,7 +1441,7 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@iconify-json/simple-icons@1.2.17': + '@iconify-json/simple-icons@1.2.22': dependencies: '@iconify/types': 2.0.0 @@ -1466,154 +1461,163 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 - '@parcel/watcher-android-arm64@2.5.0': + '@parcel/watcher-android-arm64@2.5.1': optional: true - '@parcel/watcher-darwin-arm64@2.5.0': + '@parcel/watcher-darwin-arm64@2.5.1': optional: true - '@parcel/watcher-darwin-x64@2.5.0': + '@parcel/watcher-darwin-x64@2.5.1': optional: true - '@parcel/watcher-freebsd-x64@2.5.0': + '@parcel/watcher-freebsd-x64@2.5.1': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.0': + '@parcel/watcher-linux-arm-glibc@2.5.1': optional: true - '@parcel/watcher-linux-arm-musl@2.5.0': + '@parcel/watcher-linux-arm-musl@2.5.1': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.0': + '@parcel/watcher-linux-arm64-glibc@2.5.1': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.0': + '@parcel/watcher-linux-arm64-musl@2.5.1': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.0': + '@parcel/watcher-linux-x64-glibc@2.5.1': optional: true - '@parcel/watcher-linux-x64-musl@2.5.0': + '@parcel/watcher-linux-x64-musl@2.5.1': optional: true - '@parcel/watcher-win32-arm64@2.5.0': + '@parcel/watcher-win32-arm64@2.5.1': optional: true - '@parcel/watcher-win32-ia32@2.5.0': + '@parcel/watcher-win32-ia32@2.5.1': optional: true - '@parcel/watcher-win32-x64@2.5.0': + '@parcel/watcher-win32-x64@2.5.1': optional: true - '@parcel/watcher@2.5.0': + '@parcel/watcher@2.5.1': dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.8 node-addon-api: 7.1.1 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.0 - '@parcel/watcher-darwin-arm64': 2.5.0 - '@parcel/watcher-darwin-x64': 2.5.0 - '@parcel/watcher-freebsd-x64': 2.5.0 - '@parcel/watcher-linux-arm-glibc': 2.5.0 - '@parcel/watcher-linux-arm-musl': 2.5.0 - '@parcel/watcher-linux-arm64-glibc': 2.5.0 - '@parcel/watcher-linux-arm64-musl': 2.5.0 - '@parcel/watcher-linux-x64-glibc': 2.5.0 - '@parcel/watcher-linux-x64-musl': 2.5.0 - '@parcel/watcher-win32-arm64': 2.5.0 - '@parcel/watcher-win32-ia32': 2.5.0 - '@parcel/watcher-win32-x64': 2.5.0 + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 optional: true - '@rollup/rollup-android-arm-eabi@4.31.0': + '@rollup/rollup-android-arm-eabi@4.32.1': optional: true - '@rollup/rollup-android-arm64@4.31.0': + '@rollup/rollup-android-arm64@4.32.1': optional: true - '@rollup/rollup-darwin-arm64@4.31.0': + '@rollup/rollup-darwin-arm64@4.32.1': optional: true - '@rollup/rollup-darwin-x64@4.31.0': + '@rollup/rollup-darwin-x64@4.32.1': optional: true - '@rollup/rollup-freebsd-arm64@4.31.0': + '@rollup/rollup-freebsd-arm64@4.32.1': optional: true - '@rollup/rollup-freebsd-x64@4.31.0': + '@rollup/rollup-freebsd-x64@4.32.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.31.0': + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.31.0': + '@rollup/rollup-linux-arm-musleabihf@4.32.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.31.0': + '@rollup/rollup-linux-arm64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.31.0': + '@rollup/rollup-linux-arm64-musl@4.32.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.31.0': + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.31.0': + '@rollup/rollup-linux-riscv64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.31.0': + '@rollup/rollup-linux-s390x-gnu@4.32.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.31.0': + '@rollup/rollup-linux-x64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-x64-musl@4.31.0': + '@rollup/rollup-linux-x64-musl@4.32.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.31.0': + '@rollup/rollup-win32-arm64-msvc@4.32.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.31.0': + '@rollup/rollup-win32-ia32-msvc@4.32.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.31.0': + '@rollup/rollup-win32-x64-msvc@4.32.1': optional: true - '@shikijs/core@1.24.4': + '@shikijs/core@2.2.0': dependencies: - '@shikijs/engine-javascript': 1.24.4 - '@shikijs/engine-oniguruma': 1.24.4 - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/engine-javascript': 2.2.0 + '@shikijs/engine-oniguruma': 2.2.0 + '@shikijs/types': 2.2.0 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@1.24.4': + '@shikijs/engine-javascript@2.2.0': dependencies: - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 - oniguruma-to-es: 0.8.1 + '@shikijs/types': 2.2.0 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 2.3.0 - '@shikijs/engine-oniguruma@1.24.4': + '@shikijs/engine-oniguruma@2.2.0': dependencies: - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/types': 2.2.0 + '@shikijs/vscode-textmate': 10.0.1 - '@shikijs/transformers@1.24.4': + '@shikijs/langs@2.2.0': dependencies: - shiki: 1.24.4 + '@shikijs/types': 2.2.0 - '@shikijs/types@1.24.4': + '@shikijs/themes@2.2.0': dependencies: - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/types': 2.2.0 + + '@shikijs/transformers@2.2.0': + dependencies: + '@shikijs/core': 2.2.0 + '@shikijs/types': 2.2.0 + + '@shikijs/types@2.2.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.1': {} + '@shikijs/vscode-textmate@10.0.1': {} '@types/estree@1.0.6': {} @@ -1634,7 +1638,7 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node@22.10.2': + '@types/node@22.12.0': dependencies: undici-types: 6.20.0 @@ -1642,16 +1646,16 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@ungap/structured-clone@1.2.1': {} + '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.10.2)(sass@1.83.0))(vue@3.5.13)': + '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.12.0)(sass@1.83.4))(vue@3.5.13)': dependencies: - vite: 5.4.14(@types/node@22.10.2)(sass@1.83.0) + vite: 5.4.14(@types/node@22.12.0)(sass@1.83.4) vue: 3.5.13 '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.7 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -1664,7 +1668,7 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.7 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 @@ -1679,13 +1683,13 @@ snapshots: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 - '@vue/devtools-api@7.6.8': + '@vue/devtools-api@7.7.1': dependencies: - '@vue/devtools-kit': 7.6.8 + '@vue/devtools-kit': 7.7.1 - '@vue/devtools-kit@7.6.8': + '@vue/devtools-kit@7.7.1': dependencies: - '@vue/devtools-shared': 7.6.8 + '@vue/devtools-shared': 7.7.1 birpc: 0.2.19 hookable: 5.5.3 mitt: 3.0.1 @@ -1693,7 +1697,7 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.2 - '@vue/devtools-shared@7.6.8': + '@vue/devtools-shared@7.7.1': dependencies: rfdc: 1.4.1 @@ -1721,51 +1725,48 @@ snapshots: '@vue/shared@3.5.13': {} - '@vueuse/core@11.3.0(vue@3.5.13)': + '@vueuse/core@12.5.0': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 11.3.0 - '@vueuse/shared': 11.3.0(vue@3.5.13) - vue-demi: 0.14.10(vue@3.5.13) + '@vueuse/metadata': 12.5.0 + '@vueuse/shared': 12.5.0 + vue: 3.5.13 transitivePeerDependencies: - - '@vue/composition-api' - - vue + - typescript - '@vueuse/integrations@11.3.0(focus-trap@7.6.2)(vue@3.5.13)': + '@vueuse/integrations@12.5.0(focus-trap@7.6.4)': dependencies: - '@vueuse/core': 11.3.0(vue@3.5.13) - '@vueuse/shared': 11.3.0(vue@3.5.13) - vue-demi: 0.14.10(vue@3.5.13) + '@vueuse/core': 12.5.0 + '@vueuse/shared': 12.5.0 + vue: 3.5.13 optionalDependencies: - focus-trap: 7.6.2 + focus-trap: 7.6.4 transitivePeerDependencies: - - '@vue/composition-api' - - vue + - typescript - '@vueuse/metadata@11.3.0': {} + '@vueuse/metadata@12.5.0': {} - '@vueuse/shared@11.3.0(vue@3.5.13)': + '@vueuse/shared@12.5.0': dependencies: - vue-demi: 0.14.10(vue@3.5.13) + vue: 3.5.13 transitivePeerDependencies: - - '@vue/composition-api' - - vue - - algoliasearch@5.18.0: - dependencies: - '@algolia/client-abtesting': 5.18.0 - '@algolia/client-analytics': 5.18.0 - '@algolia/client-common': 5.18.0 - '@algolia/client-insights': 5.18.0 - '@algolia/client-personalization': 5.18.0 - '@algolia/client-query-suggestions': 5.18.0 - '@algolia/client-search': 5.18.0 - '@algolia/ingestion': 1.18.0 - '@algolia/monitoring': 1.18.0 - '@algolia/recommend': 5.18.0 - '@algolia/requester-browser-xhr': 5.18.0 - '@algolia/requester-fetch': 5.18.0 - '@algolia/requester-node-http': 5.18.0 + - typescript + + algoliasearch@5.20.0: + dependencies: + '@algolia/client-abtesting': 5.20.0 + '@algolia/client-analytics': 5.20.0 + '@algolia/client-common': 5.20.0 + '@algolia/client-insights': 5.20.0 + '@algolia/client-personalization': 5.20.0 + '@algolia/client-query-suggestions': 5.20.0 + '@algolia/client-search': 5.20.0 + '@algolia/ingestion': 1.20.0 + '@algolia/monitoring': 1.20.0 + '@algolia/recommend': 5.20.0 + '@algolia/requester-browser-xhr': 5.20.0 + '@algolia/requester-fetch': 5.20.0 + '@algolia/requester-node-http': 5.20.0 birpc@0.2.19: {} @@ -1781,7 +1782,7 @@ snapshots: chokidar@4.0.3: dependencies: - readdirp: 4.0.2 + readdirp: 4.1.1 comma-separated-tokens@2.0.3: {} @@ -1860,7 +1861,7 @@ snapshots: estree-walker@2.0.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -1876,7 +1877,7 @@ snapshots: dependencies: to-regex-range: 5.0.1 - focus-trap@7.6.2: + focus-trap@7.6.4: dependencies: tabbable: 6.2.0 @@ -1931,7 +1932,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.1 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -1972,11 +1973,11 @@ snapshots: node-addon-api@7.1.1: optional: true - oniguruma-to-es@0.8.1: + oniguruma-to-es@2.3.0: dependencies: emoji-regex-xs: 1.0.0 - regex: 5.0.2 - regex-recursion: 5.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 perfect-debounce@1.0.0: {} @@ -1990,21 +1991,22 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.25.3: {} + preact@10.25.4: {} property-information@6.5.0: {} queue-microtask@1.2.3: {} - readdirp@4.0.2: {} + readdirp@4.1.1: {} - regex-recursion@5.0.0: + regex-recursion@5.1.1: dependencies: + regex: 5.1.1 regex-utilities: 2.3.0 regex-utilities@2.3.0: {} - regex@5.0.2: + regex@5.1.1: dependencies: regex-utilities: 2.3.0 @@ -2012,52 +2014,54 @@ snapshots: rfdc@1.4.1: {} - rollup@4.31.0: + rollup@4.32.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.31.0 - '@rollup/rollup-android-arm64': 4.31.0 - '@rollup/rollup-darwin-arm64': 4.31.0 - '@rollup/rollup-darwin-x64': 4.31.0 - '@rollup/rollup-freebsd-arm64': 4.31.0 - '@rollup/rollup-freebsd-x64': 4.31.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.31.0 - '@rollup/rollup-linux-arm-musleabihf': 4.31.0 - '@rollup/rollup-linux-arm64-gnu': 4.31.0 - '@rollup/rollup-linux-arm64-musl': 4.31.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.31.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0 - '@rollup/rollup-linux-riscv64-gnu': 4.31.0 - '@rollup/rollup-linux-s390x-gnu': 4.31.0 - '@rollup/rollup-linux-x64-gnu': 4.31.0 - '@rollup/rollup-linux-x64-musl': 4.31.0 - '@rollup/rollup-win32-arm64-msvc': 4.31.0 - '@rollup/rollup-win32-ia32-msvc': 4.31.0 - '@rollup/rollup-win32-x64-msvc': 4.31.0 + '@rollup/rollup-android-arm-eabi': 4.32.1 + '@rollup/rollup-android-arm64': 4.32.1 + '@rollup/rollup-darwin-arm64': 4.32.1 + '@rollup/rollup-darwin-x64': 4.32.1 + '@rollup/rollup-freebsd-arm64': 4.32.1 + '@rollup/rollup-freebsd-x64': 4.32.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.32.1 + '@rollup/rollup-linux-arm-musleabihf': 4.32.1 + '@rollup/rollup-linux-arm64-gnu': 4.32.1 + '@rollup/rollup-linux-arm64-musl': 4.32.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.32.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.32.1 + '@rollup/rollup-linux-riscv64-gnu': 4.32.1 + '@rollup/rollup-linux-s390x-gnu': 4.32.1 + '@rollup/rollup-linux-x64-gnu': 4.32.1 + '@rollup/rollup-linux-x64-musl': 4.32.1 + '@rollup/rollup-win32-arm64-msvc': 4.32.1 + '@rollup/rollup-win32-ia32-msvc': 4.32.1 + '@rollup/rollup-win32-x64-msvc': 4.32.1 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - sass@1.83.0: + sass@1.83.4: dependencies: chokidar: 4.0.3 immutable: 5.0.3 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.0 + '@parcel/watcher': 2.5.1 search-insights@2.13.0: {} - shiki@1.24.4: + shiki@2.2.0: dependencies: - '@shikijs/core': 1.24.4 - '@shikijs/engine-javascript': 1.24.4 - '@shikijs/engine-oniguruma': 1.24.4 - '@shikijs/types': 1.24.4 - '@shikijs/vscode-textmate': 9.3.1 + '@shikijs/core': 2.2.0 + '@shikijs/engine-javascript': 2.2.0 + '@shikijs/engine-oniguruma': 2.2.0 + '@shikijs/langs': 2.2.0 + '@shikijs/themes': 2.2.0 + '@shikijs/types': 2.2.0 + '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 source-map-js@1.2.1: {} @@ -2118,45 +2122,45 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.14(@types/node@22.10.2)(sass@1.83.0): + vite@5.4.14(@types/node@22.12.0)(sass@1.83.4): dependencies: esbuild: 0.21.5 postcss: 8.5.1 - rollup: 4.31.0 + rollup: 4.32.1 optionalDependencies: - '@types/node': 22.10.2 + '@types/node': 22.12.0 fsevents: 2.3.3 - sass: 1.83.0 + sass: 1.83.4 - vite@6.0.9(@types/node@22.10.2)(sass@1.83.0): + vite@6.0.11(@types/node@22.12.0)(sass@1.83.4): dependencies: esbuild: 0.24.2 postcss: 8.5.1 - rollup: 4.31.0 + rollup: 4.32.1 optionalDependencies: - '@types/node': 22.10.2 + '@types/node': 22.12.0 fsevents: 2.3.3 - sass: 1.83.0 + sass: 1.83.4 - vitepress@1.5.0(@algolia/client-search@5.18.0)(@types/node@22.10.2)(postcss@8.5.1)(sass@1.83.0)(search-insights@2.13.0): + vitepress@1.6.3(@algolia/client-search@5.20.0)(@types/node@22.12.0)(postcss@8.5.1)(sass@1.83.4)(search-insights@2.13.0): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.18.0)(search-insights@2.13.0) - '@iconify-json/simple-icons': 1.2.17 - '@shikijs/core': 1.24.4 - '@shikijs/transformers': 1.24.4 - '@shikijs/types': 1.24.4 + '@docsearch/js': 3.8.2(@algolia/client-search@5.20.0)(search-insights@2.13.0) + '@iconify-json/simple-icons': 1.2.22 + '@shikijs/core': 2.2.0 + '@shikijs/transformers': 2.2.0 + '@shikijs/types': 2.2.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.10.2)(sass@1.83.0))(vue@3.5.13) - '@vue/devtools-api': 7.6.8 + '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.12.0)(sass@1.83.4))(vue@3.5.13) + '@vue/devtools-api': 7.7.1 '@vue/shared': 3.5.13 - '@vueuse/core': 11.3.0(vue@3.5.13) - '@vueuse/integrations': 11.3.0(focus-trap@7.6.2)(vue@3.5.13) - focus-trap: 7.6.2 + '@vueuse/core': 12.5.0 + '@vueuse/integrations': 12.5.0(focus-trap@7.6.4) + focus-trap: 7.6.4 mark.js: 8.11.1 minisearch: 7.1.1 - shiki: 1.24.4 - vite: 5.4.14(@types/node@22.10.2)(sass@1.83.0) + shiki: 2.2.0 + vite: 5.4.14(@types/node@22.12.0)(sass@1.83.4) vue: 3.5.13 optionalDependencies: postcss: 8.5.1 @@ -2164,7 +2168,6 @@ snapshots: - '@algolia/client-search' - '@types/node' - '@types/react' - - '@vue/composition-api' - async-validator - axios - change-case @@ -2188,10 +2191,6 @@ snapshots: - typescript - universal-cookie - vue-demi@0.14.10(vue@3.5.13): - dependencies: - vue: 3.5.13 - vue@3.5.13: dependencies: '@vue/compiler-dom': 3.5.13 From 589eb0cea43452c070193f1b2c43e6f3e7b91846 Mon Sep 17 00:00:00 2001 From: yansongda Date: Fri, 31 Jan 2025 23:06:43 +0800 Subject: [PATCH 2/7] update --- .../Transfer/Batch/QueryByWxPlugin.php | 3 +- .../Marketing/Transfer/Batch/QueryPlugin.php | 3 +- .../V3/Marketing/Transfer/CreatePlugin.php | 3 +- .../Transfer/Detail/QueryByWxPlugin.php | 3 +- .../Marketing/Transfer/Detail/QueryPlugin.php | 3 +- .../Transfer/DownloadReceiptPlugin.php | 3 +- .../Transfer/Receipt/CreatePlugin.php | 3 +- .../Transfer/Receipt/QueryPlugin.php | 3 +- .../Transfer/ReceiptDetail/CreatePlugin.php | 3 +- .../Transfer/ReceiptDetail/QueryPlugin.php | 3 +- src/Shortcut/Wechat/TransferShortcut.php | 38 ++++++++++++++++++- .../Shortcut/Wechat/TransferShortcutTest.php | 18 ++++++++- web/docs/v3/wechat/pay.md | 20 +++++++++- 13 files changed, 92 insertions(+), 14 deletions(-) diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php index bcf706241..d0e949096 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\Batch; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -19,8 +20,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/get-transfer-batch-by-no.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class QueryByWxPlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php index 39216c4ea..d787f3ec4 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\Batch; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -19,8 +20,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/get-transfer-batch-by-out-no.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class QueryPlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php index 12bb53c40..25759be84 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidConfigException; @@ -25,8 +26,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/initiate-batch-transfer.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class CreatePlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php index 30e9eb50e..e2d750573 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\Detail; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -18,8 +19,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-detail/get-transfer-detail-by-no.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class QueryByWxPlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php index f5ea09bd4..d401a686c 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\Detail; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -18,8 +19,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-detail/get-transfer-detail-by-out-no.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class QueryPlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php index 0bfdb1f89..049ea5f65 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Direction\OriginResponseDirection; use Yansongda\Artful\Exception\ContainerException; @@ -19,8 +20,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/download-receipt.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class DownloadReceiptPlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php index 701ea97a6..9775669ba 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\Receipt; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -18,8 +19,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-signature/create-electronic-signature.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class CreatePlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php index 02435e179..c4032ccee 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\Receipt; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -18,8 +19,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-signature/get-electronic-signature-by-out-no.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class QueryPlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php index 089aca0aa..28cd2a886 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\ReceiptDetail; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -18,8 +19,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-receipt-api/create-electronic-receipt.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class CreatePlugin implements PluginInterface { /** diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php index 0b1ca13c5..efe467082 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php @@ -5,6 +5,7 @@ namespace Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\ReceiptDetail; use Closure; +use JetBrains\PhpStorm\Deprecated; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Exception\ContainerException; use Yansongda\Artful\Exception\InvalidParamsException; @@ -19,8 +20,8 @@ /** * @see https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/electronic-receipt-api/query-electronic-receipt.html - * @deprecated since v3.7.12 and will be removed in v3.8.0. */ +#[Deprecated(reason: '由于微信支付变更,自 v3.7.12 开始废弃, 并将在 v3.8.0 移除')] class QueryPlugin implements PluginInterface { /** diff --git a/src/Shortcut/Wechat/TransferShortcut.php b/src/Shortcut/Wechat/TransferShortcut.php index a2bc1b476..80dc278c7 100644 --- a/src/Shortcut/Wechat/TransferShortcut.php +++ b/src/Shortcut/Wechat/TransferShortcut.php @@ -5,18 +5,54 @@ namespace Yansongda\Pay\Shortcut\Wechat; use Yansongda\Artful\Contract\ShortcutInterface; +use Yansongda\Artful\Exception\InvalidParamsException; use Yansongda\Artful\Plugin\AddPayloadBodyPlugin; use Yansongda\Artful\Plugin\ParserPlugin; use Yansongda\Artful\Plugin\StartPlugin; +use Yansongda\Pay\Exception\Exception; use Yansongda\Pay\Plugin\Wechat\AddRadarPlugin; use Yansongda\Pay\Plugin\Wechat\ResponsePlugin; use Yansongda\Pay\Plugin\Wechat\V3\AddPayloadSignaturePlugin; -use Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\CreatePlugin; +use Yansongda\Pay\Plugin\Wechat\V3\Marketing\MchTransfer\CreatePlugin; use Yansongda\Pay\Plugin\Wechat\V3\VerifySignaturePlugin; +use Yansongda\Supports\Str; class TransferShortcut implements ShortcutInterface { + /** + * @throws InvalidParamsException + */ public function getPlugins(array $params): array + { + $method = Str::camel($params['_action'] ?? 'default').'Plugins'; + + if (method_exists($this, $method)) { + return $this->{$method}(); + } + + throw new InvalidParamsException(Exception::PARAMS_SHORTCUT_ACTION_INVALID, "您所提供的 action 方法 [{$method}] 不支持,请参考文档或源码确认"); + } + + public function defaultPlugins(): array + { + return $this->transferPlugins(); + } + + public function transferPlugins(): array + { + return [ + StartPlugin::class, + \Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\CreatePlugin::class, + AddPayloadBodyPlugin::class, + AddPayloadSignaturePlugin::class, + AddRadarPlugin::class, + VerifySignaturePlugin::class, + ResponsePlugin::class, + ParserPlugin::class, + ]; + } + + public function mchTransferPlugins(): array { return [ StartPlugin::class, diff --git a/tests/Shortcut/Wechat/TransferShortcutTest.php b/tests/Shortcut/Wechat/TransferShortcutTest.php index bb3d1cc1f..a5996b1e0 100644 --- a/tests/Shortcut/Wechat/TransferShortcutTest.php +++ b/tests/Shortcut/Wechat/TransferShortcutTest.php @@ -10,7 +10,7 @@ use Yansongda\Pay\Plugin\Wechat\AddRadarPlugin; use Yansongda\Pay\Plugin\Wechat\ResponsePlugin; use Yansongda\Pay\Plugin\Wechat\V3\AddPayloadSignaturePlugin; -use Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\CreatePlugin; +use Yansongda\Pay\Plugin\Wechat\V3\Marketing\MchTransfer\CreatePlugin; use Yansongda\Pay\Plugin\Wechat\V3\VerifySignaturePlugin; use Yansongda\Pay\Shortcut\Wechat\TransferShortcut; use Yansongda\Pay\Tests\TestCase; @@ -30,7 +30,7 @@ public function testDefault() { self::assertEquals([ StartPlugin::class, - CreatePlugin::class, + \Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\CreatePlugin::class, AddPayloadBodyPlugin::class, AddPayloadSignaturePlugin::class, AddRadarPlugin::class, @@ -39,4 +39,18 @@ public function testDefault() ParserPlugin::class, ], $this->plugin->getPlugins([])); } + + public function testMch() + { + self::assertEquals([ + StartPlugin::class, + CreatePlugin::class, + AddPayloadBodyPlugin::class, + AddPayloadSignaturePlugin::class, + AddRadarPlugin::class, + VerifySignaturePlugin::class, + ResponsePlugin::class, + ParserPlugin::class, + ], $this->plugin->getPlugins(['_action' => 'mch_transfer'])); + } } diff --git a/web/docs/v3/wechat/pay.md b/web/docs/v3/wechat/pay.md index 4b3958cca..6659422bc 100644 --- a/web/docs/v3/wechat/pay.md +++ b/web/docs/v3/wechat/pay.md @@ -240,6 +240,21 @@ $result = Pay::wechat()->scan($order); ```php Pay::config($config); +$order = [ + '_action' => 'mch_transfer', // 微信官方老版本下线后,此部分可省略 + 'out_bill_no' => time().'', + 'transfer_scene_id' => '1001', + 'openid' => 'MYE42l80oelYMDE34nYD456Xoy', + // 'user_name' => '闫嵩达' // 明文传参即可,sdk 会自动加密 + 'transfer_amount' => 1, + 'transfer_remark' => 'test', + 'transfer_scene_report_infos' => [ + ['info_type' => '活动名称', 'info_content' => '新会员有礼'], + ['info_type' => '奖励说明', 'info_content' => '注册会员抽奖一等奖'], + ], +]; + +// 以下为老版本调用方式,微信官方将于 2025年 3 月 31日 下线,建议使用新版本调用方式 $order = [ 'out_batch_no' => time().'', 'batch_name' => 'subject-测试', @@ -264,4 +279,7 @@ $result = Pay::wechat()->transfer($order); **所有订单配置中,客观参数均不用配置,扩展包已经为大家自动处理了**,比如,`appid`,`sign` 等参数,大家只需传入订单类主观参数即可。 -所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考[这里](https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/initiate-batch-transfer.html),查看「请求参数」一节。 +所有订单配置参数和官方无任何差别,兼容所有功能,所有参数请参考以下链接,查看「请求参数」一节: + +- [新版本](https://pay.weixin.qq.com/doc/v3/merchant/4012716434) +- [老版本](https://pay.weixin.qq.com/docs/merchant/apis/batch-transfer-to-balance/transfer-batch/initiate-batch-transfer.html) From fc9785716cfc6f0d1297635f683dc00872e32b2c Mon Sep 17 00:00:00 2001 From: yansongda Date: Fri, 31 Jan 2025 23:09:01 +0800 Subject: [PATCH 3/7] update --- .github/workflows/coverage.yml | 2 +- .github/workflows/style.yml | 3 ++- .github/workflows/tester.yml | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 348e6c9a1..a446faf34 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -15,7 +15,7 @@ jobs: - name: PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.4' extensions: openssl coverage: xdebug - name: Install Dependencies diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 28ec317e4..e043d069a 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -15,7 +15,7 @@ jobs: - name: PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.4' coverage: none - name: Install Dependencies run: composer install --no-progress @@ -32,6 +32,7 @@ jobs: - 8.1 - 8.2 - 8.3 + - 8.4 steps: - name: Checkout Code uses: actions/checkout@v4 diff --git a/.github/workflows/tester.yml b/.github/workflows/tester.yml index fc0ca642f..309281579 100644 --- a/.github/workflows/tester.yml +++ b/.github/workflows/tester.yml @@ -21,6 +21,7 @@ jobs: - 8.1 - 8.2 - 8.3 + - 8.4 steps: - name: Checkout Code uses: actions/checkout@v4 From 3c90d71fc03ec4fef5f30ef8c08920c7bf93c082 Mon Sep 17 00:00:00 2001 From: yansongda Date: Fri, 31 Jan 2025 23:14:26 +0800 Subject: [PATCH 4/7] update --- .../Wechat/V3/Marketing/MchTransfer/CreatePlugin.php | 9 +++++---- src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php index 9823d61d7..fd2de0cd4 100644 --- a/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php @@ -57,7 +57,7 @@ public function assembly(Rocket $rocket, Closure $next): Rocket '_url' => 'v3/fund-app/mch-transfer/transfer-bills', 'appid' => $payload->get('appid', $config[get_wechat_type_key($params)] ?? ''), ], - $this->normal($params, $config, $payload) + $this->normal($params, $payload) )); Logger::info('[Wechat][Marketing][MchTransfer][CreatePlugin] 插件装载完毕', ['rocket' => $rocket]); @@ -72,13 +72,13 @@ public function assembly(Rocket $rocket, Closure $next): Rocket * @throws DecryptException * @throws InvalidConfigException */ - protected function normal(array $params, array $config, Collection $payload): array + protected function normal(array $params, Collection $payload): array { if (!$payload->has('user_name')) { return []; } - return $this->encryptSensitiveData($params, $config, $payload); + return $this->encryptSensitiveData($params, $payload); } /** @@ -88,10 +88,11 @@ protected function normal(array $params, array $config, Collection $payload): ar * @throws InvalidParamsException * @throws ServiceNotFoundException */ - protected function encryptSensitiveData(array $params, array $config, Collection $payload): array + protected function encryptSensitiveData(array $params, Collection $payload): array { $data['_serial_no'] = get_wechat_serial_no($params); + $config = get_provider_config('wechat', $params); $publicKey = get_wechat_public_key($config, $data['_serial_no']); $data['user_name'] = encrypt_wechat_contents($payload->get('user_name'), $publicKey); diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php index 25759be84..a61725583 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php @@ -59,7 +59,7 @@ public function assembly(Rocket $rocket, Closure $next): Rocket '_url' => 'v3/transfer/batches', 'appid' => $payload->get('appid', $config[get_wechat_type_key($params)] ?? ''), ], - $this->normal($params, $config, $payload) + $this->normal($params, $payload) )); Logger::info('[Wechat][Marketing][Transfer][CreatePlugin] 插件装载完毕', ['rocket' => $rocket]); @@ -74,13 +74,13 @@ public function assembly(Rocket $rocket, Closure $next): Rocket * @throws DecryptException * @throws InvalidConfigException */ - protected function normal(array $params, array $config, Collection $payload): array + protected function normal(array $params, Collection $payload): array { if (!$payload->has('transfer_detail_list.0.user_name')) { return []; } - return $this->encryptSensitiveData($params, $config, $payload); + return $this->encryptSensitiveData($params, $payload); } /** @@ -90,7 +90,7 @@ protected function normal(array $params, array $config, Collection $payload): ar * @throws InvalidParamsException * @throws ServiceNotFoundException */ - protected function encryptSensitiveData(array $params, array $config, Collection $payload): array + protected function encryptSensitiveData(array $params, Collection $payload): array { $data['transfer_detail_list'] = $payload->get('transfer_detail_list', []); $data['_serial_no'] = get_wechat_serial_no($params); From 1d5ef6f548b71e80b06970e3c29779eef325d8e2 Mon Sep 17 00:00:00 2001 From: yansongda Date: Fri, 31 Jan 2025 23:15:49 +0800 Subject: [PATCH 5/7] update --- .github/workflows/style.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index e043d069a..708dd471b 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -15,7 +15,7 @@ jobs: - name: PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.3' coverage: none - name: Install Dependencies run: composer install --no-progress From c797faf59b03d6f7b1942b6a4e9ea3873f449e16 Mon Sep 17 00:00:00 2001 From: yansongda Date: Fri, 31 Jan 2025 23:17:33 +0800 Subject: [PATCH 6/7] update --- tests/Shortcut/Wechat/TransferShortcutTest.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/Shortcut/Wechat/TransferShortcutTest.php b/tests/Shortcut/Wechat/TransferShortcutTest.php index a5996b1e0..d63f1a223 100644 --- a/tests/Shortcut/Wechat/TransferShortcutTest.php +++ b/tests/Shortcut/Wechat/TransferShortcutTest.php @@ -4,9 +4,11 @@ namespace Yansongda\Pay\Tests\Shortcut\Wechat; +use Yansongda\Artful\Exception\InvalidParamsException; use Yansongda\Artful\Plugin\AddPayloadBodyPlugin; use Yansongda\Artful\Plugin\ParserPlugin; use Yansongda\Artful\Plugin\StartPlugin; +use Yansongda\Pay\Exception\Exception; use Yansongda\Pay\Plugin\Wechat\AddRadarPlugin; use Yansongda\Pay\Plugin\Wechat\ResponsePlugin; use Yansongda\Pay\Plugin\Wechat\V3\AddPayloadSignaturePlugin; @@ -53,4 +55,12 @@ public function testMch() ParserPlugin::class, ], $this->plugin->getPlugins(['_action' => 'mch_transfer'])); } + + public function testFoo() + { + self::expectException(InvalidParamsException::class); + self::expectExceptionCode(Exception::PARAMS_SHORTCUT_ACTION_INVALID); + + $this->plugin->getPlugins(['_action' => 'foo']); + } } From ac3407a93c65da238441dac1a36bc1bc2c4acce0 Mon Sep 17 00:00:00 2001 From: yansongda Date: Fri, 31 Jan 2025 23:20:28 +0800 Subject: [PATCH 7/7] update --- web/docs/v3/quick-start/wechat.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/web/docs/v3/quick-start/wechat.md b/web/docs/v3/quick-start/wechat.md index 16b454215..2258d8d52 100644 --- a/web/docs/v3/quick-start/wechat.md +++ b/web/docs/v3/quick-start/wechat.md @@ -138,6 +138,21 @@ $result = Pay::wechat()->scan($order); ```php Pay::config($config); +$order = [ + '_action' => 'mch_transfer', // 微信官方老版本下线后,此部分可省略 + 'out_bill_no' => time().'', + 'transfer_scene_id' => '1001', + 'openid' => 'MYE42l80oelYMDE34nYD456Xoy', + // 'user_name' => '闫嵩达' // 明文传参即可,sdk 会自动加密 + 'transfer_amount' => 1, + 'transfer_remark' => 'test', + 'transfer_scene_report_infos' => [ + ['info_type' => '活动名称', 'info_content' => '新会员有礼'], + ['info_type' => '奖励说明', 'info_content' => '注册会员抽奖一等奖'], + ], +]; + +// 以下为老版本调用方式,微信官方将于 2025年 3 月 31日 下线,建议使用新版本调用方式 $order = [ 'out_batch_no' => time().'', 'batch_name' => 'subject-测试',