Преглед изворни кода

fix(wechatpay): 修复通知服务中的签名验证日志和交易成功处理

- 在签名验证失败的日志中添加了 serial 字段以增强调试信息
- 修正 transactionSuccess 方法调用时传递的 inBody 参数类型
- 新增 NotifyService 的单元测试用例以验证交易成功回调处理逻辑
runphp пре 3 месеци
родитељ
комит
f88d0376e8

+ 1 - 1
src/PaymentProvider.php

@@ -108,7 +108,7 @@ class PaymentProvider implements PaymentProviderInterface
     public function notify(array $request): PaymentNotifyResult
     {
         $inBody = $request['inBody'];
-        $data = $this->notifyService->transactionSuccess($request['headers'], json_encode($request['inBody']));
+        $data = $this->notifyService->transactionSuccess($request['headers'], $request['inBody']);
         if ($inBody['event_type'] == 'TRANSACTION.SUCCESS') {
             // 交易成功
             Log::debug(__METHOD__ . json_encode($data));

+ 2 - 1
src/Service/NotifyService.php

@@ -41,11 +41,12 @@ class NotifyService
         );
         if (!$verifiedStatus) {
             // TODO
-            Log::warning('The signature is invalid. timestamp={timestamp} nonce={nonce} inBody={inBody} signature={signature}', [
+            Log::warning('The signature is invalid. timestamp={timestamp} nonce={nonce} inBody={inBody} signature={signature} serial={serial}', [
                 'timestamp' => $timestamp,
                 'nonce' => $nonce,
                 'inBody' => $inBody,
                 'signature' => $signature,
+                'serial' => $serial,
             ]);
             //throw new \RuntimeException('The signature is invalid.');
         }

+ 0 - 0
test/PaymentProviderTest.php → tests/PaymentProviderTest.php


+ 27 - 0
tests/Service/NotifyServiceTest.php

@@ -0,0 +1,27 @@
+<?php
+declare(strict_types=1);
+namespace SixShop\WechatPay\Service;
+
+use PHPUnit\Framework\Attributes\Test;
+use PHPUnit\Framework\TestCase;
+
+class NotifyServiceTest extends TestCase
+{
+    private NotifyService $notifyService;
+    protected function setUp(): void
+    {
+        $this->notifyService = app(NotifyService::class);
+    }
+
+    #[Test]
+    public function transactionSuccess()
+    {
+        $result = $this->notifyService->transactionSuccess([
+            'Wechatpay-Signature' => 'VmF2yqkm1dscjE/6M6KcQCG27HnRC7v+DQ4LXFTszRTR/q+0uEVso1D113QmUROcH5ATIgYwHii7IHWDXt4nk49IrYJ2PY/7g1bdt5HnXEI8IZeTyBHvaJzntH42rMvK+W0B1Lo0/VoHz9RXGbwCtBR4rmsYItyey/NTT0Q4EYLVSIWvQML9noLPUTwGm5y+YSAeK3vfDgVCMhTK01GB7UjJGm5ZA0XYidTSqD776ZRyTtEetkcPlTDcnagQjBa1w6KpRVjqo5jrdH2ShCqHewsbfC4wl+Mni1C39eDJ8Rsy6eKUh069cLIgFNWAb3rD694NFcNko5fJKglkRfQ6iw==',
+            'Wechatpay-Timestamp' => '1766159859',
+            'Wechatpay-Nonce' => 'f02OdZsxJPJ8IckupX0Z2j5dXqKyjBRC',
+            'Wechatpay-Serial' => 'PUB_KEY_ID_',
+        ],inBody: '{"id":"7afdf385-ce06-5d4d-a249-8a29e67cfd5d","create_time":"2025-12-19T20:57:16+08:00","resource_type":"encrypt-resource","event_type":"REFUND.SUCCESS","summary":"\u9000\u6b3e\u6210\u529f","resource":{"original_type":"refund","algorithm":"AEAD_AES_256_GCM","ciphertext":"\/ZfT5bua\/5qfyMktCV0s+Bq4yRF7XaNpLxaYxkPC6YAOF6VxJKiNpiNsvyvrGfm7Cpf2ApC3M3BoRIsELrGCzUggfybuopxiReMOE0o6UhaC0feZNwPhhgmIG8TgxcC58P5KPG75mHt5AlAfrnxFS88nxFgFW1B3PsSwIuSSxdXQGPv1oocC08FEAIj4bJ9ruXLTURJNvr+KVC+PlzBtGR8EKbAS20OytUx9JRZNs0ugccZvurc1lSdEvLc8O0uVA5f8MYFCx5gGHDt8KYjMknUnZSS5uI\/ObwQshfpD5jk77IMOBAAVXHpd0Il1IzGEi9i88BRWTdH2Ekl4JjyNWT0QqoeWsPw0DXyoRRDkBocpy8YOj4BK9SHgLc7R2Vn11UmlYKLzpVpXPWjBcEFLhHxFggjwuw68R4PWKZNVQrgvsZGT3hPQYbMJBH1o2iMY22y\/UBED03QlE0seNf1RMsSREs3rNVjotPHUdIBtHoae6YrfQ1sWKVhKMoingYpF5RZd4gXVhumQD\/OzdYkSysqM","associated_data":"refund","nonce":"2zDGvTscnbA2"}}');
+        dump($result);
+    }
+}

+ 0 - 0
test/WechatPayBuilderTest.php → tests/WechatPayBuilderTest.php