diff --git a/CHANGELOG.md b/CHANGELOG.md index fdbbc55..34b15e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v3.7.10 + +### fixed + +- fix: 未配置微信证书时,自动获取证书后仍然使用之前的微信配置(#1026) + ## v3.7.9 ### added diff --git a/src/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPlugin.php b/src/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPlugin.php index 26c909e..f3877c5 100644 --- a/src/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPlugin.php +++ b/src/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPlugin.php @@ -123,6 +123,8 @@ class AddReceiverPlugin implements PluginInterface protected function encryptSensitiveData(array $params, array $config, 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['name'] = encrypt_wechat_contents($payload->get('name'), $publicKey); diff --git a/src/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePlugin.php b/src/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePlugin.php index b1f45dd..1b3e346 100644 --- a/src/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePlugin.php @@ -123,6 +123,8 @@ class CreatePlugin implements PluginInterface protected function encryptSensitiveData(array $params, array $config, 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']); foreach ($payload->get('receivers', []) as $key => $list) { diff --git a/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePlugin.php index f8d6e42..c197545 100644 --- a/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePlugin.php @@ -60,6 +60,8 @@ class CreatePlugin implements PluginInterface protected function encryptSensitiveData(?Collection $payload, array $params, array $config): array { $data['_serial_no'] = get_wechat_serial_no($params); + + $config = get_provider_config('wechat', $params); $publicKey = get_wechat_public_key($config, $data['_serial_no']); $phone = $payload?->get('buyer_information.phone') ?? null; diff --git a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php index c3141e7..c0e8531 100644 --- a/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php +++ b/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php @@ -92,6 +92,8 @@ class CreatePlugin implements PluginInterface { $data['transfer_detail_list'] = $payload->get('transfer_detail_list', []); $data['_serial_no'] = get_wechat_serial_no($params); + + $config = get_provider_config('wechat', $params); $publicKey = get_wechat_public_key($config, $data['_serial_no']); foreach ($data['transfer_detail_list'] as $key => $list) { diff --git a/src/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPlugin.php b/src/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPlugin.php index b028ae8..9203689 100644 --- a/src/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPlugin.php +++ b/src/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPlugin.php @@ -105,6 +105,8 @@ class RefundAbnormalPlugin implements PluginInterface { if ($payload->has('bank_account') && $payload->has('real_name')) { $data['_serial_no'] = get_wechat_serial_no($params); + + $config = get_provider_config('wechat', $params); $publicKey = get_wechat_public_key($config, $data['_serial_no']); $data['real_name'] = encrypt_wechat_contents($payload->get('real_name'), $publicKey); diff --git a/tests/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPluginTest.php b/tests/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPluginTest.php index 0df32ae..52a563a 100644 --- a/tests/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPluginTest.php +++ b/tests/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPluginTest.php @@ -2,8 +2,13 @@ namespace Yansongda\Pay\Tests\Plugin\Wechat\V3\Extend\ProfitSharing; +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Response; +use Mockery; +use Yansongda\Artful\Contract\HttpClientInterface; use Yansongda\Pay\Exception\Exception; use Yansongda\Artful\Exception\InvalidParamsException; +use Yansongda\Pay\Pay; use Yansongda\Pay\Plugin\Wechat\V3\Extend\ProfitSharing\AddReceiverPlugin; use Yansongda\Artful\Rocket; use Yansongda\Pay\Tests\TestCase; @@ -151,4 +156,50 @@ class AddReceiverPluginTest extends TestCase 'type' => 'PERSONAL_SUB_OPENID', ], $result->getPayload()->all()); } + + public function testServiceWithNameEmptyWechatCert() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'empty_wechat_public_cert'])->setPayload(new Collection([ + "name" => "yansongda", + ])); + + $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/profitsharing/receivers/add', $payload['_url']); + self::assertEquals('v3/profitsharing/receivers/add', $payload['_service_url']); + self::assertEquals('wx55955316af4ef13', $payload['appid']); + self::assertArrayHasKey('_serial_no', $payload); + self::assertArrayHasKey('name', $payload); + self::assertNotEquals('yansongda', $payload['name']); + } } diff --git a/tests/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePluginTest.php b/tests/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePluginTest.php index d26239f..de0f75c 100644 --- a/tests/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePluginTest.php +++ b/tests/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePluginTest.php @@ -2,8 +2,13 @@ namespace Yansongda\Pay\Tests\Plugin\Wechat\V3\Extend\ProfitSharing; +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Response; +use Mockery; +use Yansongda\Artful\Contract\HttpClientInterface; use Yansongda\Pay\Exception\Exception; use Yansongda\Artful\Exception\InvalidParamsException; +use Yansongda\Pay\Pay; use Yansongda\Pay\Plugin\Wechat\V3\Extend\ProfitSharing\CreatePlugin; use Yansongda\Artful\Rocket; use Yansongda\Pay\Tests\TestCase; @@ -167,4 +172,54 @@ class CreatePluginTest extends TestCase ], ], $result->getPayload()->all()); } + + public function testServiceWithNameEmptyWechatCert() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'empty_wechat_public_cert'])->setPayload(new Collection([ + 'receivers' => [ + [ + 'name' => 'yansongda', + ], + ], + ])); + + $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/profitsharing/orders', $payload['_url']); + self::assertEquals('v3/profitsharing/orders', $payload['_service_url']); + self::assertEquals('wx55955316af4ef13', $payload['appid']); + self::assertArrayHasKey('_serial_no', $payload); + self::assertArrayHasKey('name', $payload['receivers'][0]); + self::assertNotEquals('yansongda', $payload['receivers'][0]['name']); + } } diff --git a/tests/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePluginTest.php b/tests/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePluginTest.php index f15abca..fd1b017 100644 --- a/tests/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePluginTest.php +++ b/tests/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePluginTest.php @@ -2,7 +2,12 @@ namespace Yansongda\Pay\Tests\Plugin\Wechat\V3\Marketing\Fapiao\Blockchain; +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Response; +use Mockery; +use Yansongda\Artful\Contract\HttpClientInterface; use Yansongda\Artful\Rocket; +use Yansongda\Pay\Pay; use Yansongda\Pay\Plugin\Wechat\V3\Marketing\Fapiao\Blockchain\CreatePlugin; use Yansongda\Pay\Tests\TestCase; use Yansongda\Supports\Collection; @@ -55,4 +60,51 @@ class CreatePluginTest extends TestCase self::assertNotEquals('123', $payload['buyer_information']['phone']); self::assertNotEquals('456', $payload['buyer_information']['email']); } + + public function testNormalWithSensitiveDataEmptyWechatCert() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'empty_wechat_public_cert'])->setPayload(new Collection( [ + "test" => "yansongda", + 'buyer_information' => [ + 'phone' => '123', + 'email' => '456', + ] + ])); + + $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/new-tax-control-fapiao/fapiao-applications', $payload['_url']); + self::assertEquals('yansongda', $payload['test']); + self::assertArrayHasKey('_serial_no', $payload); + self::assertNotEquals('123', $payload['buyer_information']['phone']); + self::assertNotEquals('456', $payload['buyer_information']['email']); + } } diff --git a/tests/Plugin/Wechat/V3/Marketing/Transfer/CreatePluginTest.php b/tests/Plugin/Wechat/V3/Marketing/Transfer/CreatePluginTest.php index 69a9da0..657ddc8 100644 --- a/tests/Plugin/Wechat/V3/Marketing/Transfer/CreatePluginTest.php +++ b/tests/Plugin/Wechat/V3/Marketing/Transfer/CreatePluginTest.php @@ -2,8 +2,13 @@ namespace Yansongda\Pay\Tests\Plugin\Wechat\V3\Marketing\Transfer; +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Response; +use Mockery; +use Yansongda\Artful\Contract\HttpClientInterface; use Yansongda\Pay\Exception\Exception; use Yansongda\Artful\Exception\InvalidParamsException; +use Yansongda\Pay\Pay; use Yansongda\Pay\Plugin\Wechat\V3\Marketing\Transfer\CreatePlugin; use Yansongda\Artful\Rocket; use Yansongda\Pay\Tests\TestCase; @@ -105,4 +110,57 @@ class CreatePluginTest extends TestCase self::assertNotEquals('yansongda', $payload['transfer_detail_list'][0]['user_name']); self::assertEquals('bar', $payload['transfer_detail_list'][0]['foo']); } + + public function testNormalWithNameEmptyWechatCer() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'empty_wechat_public_cert'])->setPayload(new Collection([ + "test" => "111", + 'transfer_detail_list' => [ + [ + '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/transfer/batches', $payload['_url']); + self::assertEquals('wx55955316af4ef13', $payload['appid']); + self::assertEquals('111', $payload['test']); + self::assertArrayHasKey('_serial_no', $payload); + self::assertArrayHasKey('user_name', $payload['transfer_detail_list'][0]); + self::assertNotEquals('yansongda', $payload['transfer_detail_list'][0]['user_name']); + self::assertEquals('bar', $payload['transfer_detail_list'][0]['foo']); + } } diff --git a/tests/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPluginTest.php b/tests/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPluginTest.php index 7c705eb..9cb276a 100644 --- a/tests/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPluginTest.php +++ b/tests/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPluginTest.php @@ -2,8 +2,13 @@ namespace Yansongda\Pay\Tests\Plugin\Wechat\V3\Pay\Refund; +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Response; +use Mockery; +use Yansongda\Artful\Contract\HttpClientInterface; use Yansongda\Pay\Exception\Exception; use Yansongda\Artful\Exception\InvalidParamsException; +use Yansongda\Pay\Pay; use Yansongda\Pay\Plugin\Wechat\V3\Pay\Refund\RefundAbnormalPlugin; use Yansongda\Artful\Rocket; use Yansongda\Pay\Tests\TestCase; @@ -138,4 +143,54 @@ class RefundAbnormalPluginTest extends TestCase self::assertNotEquals('333', $payload['real_name']); self::assertArrayHasKey('_serial_no', $payload); } + + public function testServiceWithNameEmptyWechatCert() + { + $rocket = new Rocket(); + $rocket->setParams(['_config' => 'empty_wechat_public_cert'])->setPayload(new Collection([ + 'refund_id' => '111', + "name" => "yansongda", + 'bank_account' => '222', + 'real_name' => '333', + ])); + + $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/refund/domestic/refunds/111/apply-abnormal-refund', $payload['_url']); + self::assertEquals('v3/refund/domestic/refunds/111/apply-abnormal-refund', $payload['_service_url']); + self::assertEquals('yansongda', $payload['name']); + self::assertArrayHasKey('bank_account', $payload); + self::assertNotEquals('222', $payload['bank_account']); + self::assertArrayHasKey('real_name', $payload); + self::assertNotEquals('333', $payload['real_name']); + self::assertArrayHasKey('_serial_no', $payload); + } }