From 1f5f035ad68135e7c16843d39da6d7219ea86862 Mon Sep 17 00:00:00 2001 From: wanghaojie <814425737@qq.com> Date: Mon, 17 Jun 2024 15:34:35 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0epay=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B&=E4=BF=AE=E5=A4=8D=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E5=8F=91=E7=8E=B0=E7=9A=84=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Plugin/Epay/CallbackPlugin.php | 6 +- src/Plugin/Epay/GeneralPlugin.php | 33 ------ src/Plugin/Epay/Pay/Scan/CancelPlugin.php | 15 --- src/Plugin/Epay/Pay/Scan/PrepayPlugin.php | 36 ++++--- src/Plugin/Epay/Pay/Scan/QueryPlugin.php | 18 ++-- src/Plugin/Epay/Pay/Scan/RefundPlugin.php | 18 ++-- src/Plugin/Epay/StartPlugin.php | 3 +- src/Provider/Epay.php | 8 +- src/Shortcut/Epay/CancelShortcut.php | 30 ------ tests/Provider/EpayTest.php | 118 ++++++++++++++++++++++ 10 files changed, 165 insertions(+), 120 deletions(-) delete mode 100644 src/Plugin/Epay/GeneralPlugin.php delete mode 100644 src/Plugin/Epay/Pay/Scan/CancelPlugin.php delete mode 100644 src/Shortcut/Epay/CancelShortcut.php diff --git a/src/Plugin/Epay/CallbackPlugin.php b/src/Plugin/Epay/CallbackPlugin.php index 12eb72ee3..7496a31e2 100644 --- a/src/Plugin/Epay/CallbackPlugin.php +++ b/src/Plugin/Epay/CallbackPlugin.php @@ -6,6 +6,7 @@ use Closure; use Yansongda\Artful\Contract\PluginInterface; +use Yansongda\Artful\Direction\NoHttpRequestDirection; use Yansongda\Artful\Exception\InvalidConfigException; use Yansongda\Artful\Exception\InvalidParamsException; use Yansongda\Artful\Exception\InvalidResponseException; @@ -25,7 +26,7 @@ public function assembly(Rocket $rocket, Closure $next): Rocket $this->formatRequestAndParams($rocket); $params = $rocket->getParams(); - $config = get_provider_config('alipay', $params); + $config = get_provider_config('epay', $params); $payload = $rocket->getPayload(); $signature = $payload->get('sign'); @@ -35,7 +36,8 @@ public function assembly(Rocket $rocket, Closure $next): Rocket $this->verifySign($config, $payload, $signature); - $rocket->setDestination($rocket->getPayload()); + $rocket->setDirection(NoHttpRequestDirection::class) + ->setDestination($rocket->getPayload()); Logger::info('[epay][CallbackPlugin] 插件装载完毕', ['rocket' => $rocket]); diff --git a/src/Plugin/Epay/GeneralPlugin.php b/src/Plugin/Epay/GeneralPlugin.php deleted file mode 100644 index 75e7701fa..000000000 --- a/src/Plugin/Epay/GeneralPlugin.php +++ /dev/null @@ -1,33 +0,0 @@ - $rocket]); - - $this->doSomethingBefore($rocket); - - $rocket->setPacker(QueryPacker::class)->mergePayload([ - 'service' => $this->getService(), - ]); - - Logger::info('[epay][GeneralPlugin] 通用插件装载完毕', ['rocket' => $rocket]); - - return $next($rocket); - } - - protected function doSomethingBefore(Rocket $rocket): void {} - - abstract protected function getService(): string; -} diff --git a/src/Plugin/Epay/Pay/Scan/CancelPlugin.php b/src/Plugin/Epay/Pay/Scan/CancelPlugin.php deleted file mode 100644 index f84284679..000000000 --- a/src/Plugin/Epay/Pay/Scan/CancelPlugin.php +++ /dev/null @@ -1,15 +0,0 @@ - $rocket]); - /** - * @throws ServiceNotFoundException - * @throws ContainerException - */ - protected function doSomethingBefore(Rocket $rocket): void - { - if (!empty($rocket->getPayload()['notify_url'])) { - return; - } + $backUrl = $rocket->getPayload()['notify_url'] ?? null; + if (empty($backUrl)) { + $params = $rocket->getParams(); + $config = get_provider_config('epay', $params); - $params = $rocket->getParams(); - $config = get_provider_config('epay', $params); + $backUrl = $config['notify_url'] ?? null; + } - $backUrl = $config['notify_url'] ?? null; if (!$backUrl) { throw new InvalidConfigException(Exception::CONFIG_EPAY_INVALID, 'Missing Epay Config -- [notify_url]'); } $rocket->mergePayload([ + 'service' => 'atPay', 'backUrl' => $backUrl, ]); + + Logger::info('[Epay][Pay][Scan][PrepayPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); } } diff --git a/src/Plugin/Epay/Pay/Scan/QueryPlugin.php b/src/Plugin/Epay/Pay/Scan/QueryPlugin.php index defbd3711..428619096 100644 --- a/src/Plugin/Epay/Pay/Scan/QueryPlugin.php +++ b/src/Plugin/Epay/Pay/Scan/QueryPlugin.php @@ -4,20 +4,24 @@ namespace Yansongda\Pay\Plugin\Epay\Pay\Scan; +use Closure; +use Yansongda\Artful\Contract\PluginInterface; +use Yansongda\Artful\Logger; use Yansongda\Artful\Rocket; -use Yansongda\Pay\Plugin\Epay\GeneralPlugin; -class QueryPlugin extends GeneralPlugin +class QueryPlugin implements PluginInterface { - protected function getService(): string + public function assembly(Rocket $rocket, Closure $next): Rocket { - return 'payCheck'; - } + Logger::debug('[Epay][Pay][Scan][QueryPlugin] 插件开始装载', ['rocket' => $rocket]); - protected function doSomethingBefore(Rocket $rocket): void - { $rocket->mergePayload([ 'deviceNo' => '1234567890', + 'service' => 'payCheck', ]); + + Logger::info('[Epay][Pay][Scan][QueryPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); } } diff --git a/src/Plugin/Epay/Pay/Scan/RefundPlugin.php b/src/Plugin/Epay/Pay/Scan/RefundPlugin.php index e2aab8a03..d06a02f75 100644 --- a/src/Plugin/Epay/Pay/Scan/RefundPlugin.php +++ b/src/Plugin/Epay/Pay/Scan/RefundPlugin.php @@ -4,20 +4,24 @@ namespace Yansongda\Pay\Plugin\Epay\Pay\Scan; +use Closure; +use Yansongda\Artful\Contract\PluginInterface; +use Yansongda\Artful\Logger; use Yansongda\Artful\Rocket; -use Yansongda\Pay\Plugin\Epay\GeneralPlugin; -class RefundPlugin extends GeneralPlugin +class RefundPlugin implements PluginInterface { - protected function getService(): string + public function assembly(Rocket $rocket, Closure $next): Rocket { - return 'payRefund'; - } + Logger::debug('[Epay][Pay][Scan][RefundPlugin] 插件开始装载', ['rocket' => $rocket]); - protected function doSomethingBefore(Rocket $rocket): void - { $rocket->mergePayload([ 'deviceNo' => '1234567890', + 'service' => 'payRefund', ]); + + Logger::info('[Epay][Pay][Scan][RefundPlugin] 插件装载完毕', ['rocket' => $rocket]); + + return $next($rocket); } } diff --git a/src/Plugin/Epay/StartPlugin.php b/src/Plugin/Epay/StartPlugin.php index e5234f6b7..60818c4d3 100644 --- a/src/Plugin/Epay/StartPlugin.php +++ b/src/Plugin/Epay/StartPlugin.php @@ -7,6 +7,7 @@ use Closure; use Yansongda\Artful\Contract\PluginInterface; use Yansongda\Artful\Logger; +use Yansongda\Artful\Packer\QueryPacker; use Yansongda\Artful\Rocket; use Yansongda\Pay\Exception\ContainerException; use Yansongda\Pay\Exception\InvalidConfigException; @@ -29,7 +30,7 @@ public function assembly(Rocket $rocket, Closure $next): Rocket $params = $rocket->getParams(); $config = get_provider_config('epay', $params); - $rocket->mergePayload(array_merge( + $rocket->setPacker(QueryPacker::class)->mergePayload(array_merge( $params, [ 'createData' => date('Ymd'), diff --git a/src/Provider/Epay.php b/src/Provider/Epay.php index e566fd0b9..7c841510d 100644 --- a/src/Provider/Epay.php +++ b/src/Provider/Epay.php @@ -66,11 +66,7 @@ public function mergeCommonPlugins(array $plugins): array public function cancel($order): Collection|Rocket { - $order = is_array($order) ? $order : ['outTradeNo' => $order]; - - Event::dispatch(new MethodCalled('epay', __METHOD__, $order, null)); - - return $this->__call('cancel', [$order]); + throw new InvalidParamsException(Exception::PARAMS_METHOD_NOT_SUPPORTED, 'Epay does not support cancel api'); } public function close($order): Collection|Rocket @@ -89,7 +85,7 @@ public function callback(null|array|ServerRequestInterface $contents = null, ?ar { $request = $this->getCallbackParams($contents); - Event::dispatch(new CallbackReceived('epay', $request, $params, null)); + Event::dispatch(new CallbackReceived('epay', $request->all(), $params, null)); return $this->pay( [CallbackPlugin::class], diff --git a/src/Shortcut/Epay/CancelShortcut.php b/src/Shortcut/Epay/CancelShortcut.php deleted file mode 100644 index 901029e9e..000000000 --- a/src/Shortcut/Epay/CancelShortcut.php +++ /dev/null @@ -1,30 +0,0 @@ -mergeCommonPlugins($plugins)); } + public function testScan() + { + $response = 'errCode=&field1=&field2=&field3=&orderNo=20240617144526400259379&orderStatus=1&outTradeNo=YC202406170003&partnerId=6a13eab71c4f4b0aa4757eda6fc59710&payUrl=http://weixintest.jsbchina.cn/epcs/qr/login.htm?qrCode=2018060611052793473720240617144526688568&respBizDate=20240617&respCode=000000&respMsg=交易成功&totalFee=0.01&validTime=2&signType=RSA&sign=jN3Ha6J9UUIe9M0L/XeexEdaRL9GB6nMV12wNC7LQvTS6V4nKHj4Qzw6M8cNsA9L0Tb3QFT83B0qO3FJnruDrcHKqBLZb4FkoKKN/WiDBuA2UZQjG4+CBejoGJWfpkWSsei9tXUk36TB27lc2ZlYXSEwuuDwM7M9yvlYysc3fjg='; + //// + $http = Mockery::mock(Client::class); + $http->shouldReceive('sendRequest')->andReturn(new Response(200, [], $response)); + Pay::set(HttpClientInterface::class, $http); + + $result = Pay::epay()->scan([ + 'outTradeNo' => 'YC202406170003', + 'totalFee' => 0.01, + 'proInfo' => '元仓充值', + 'backUrl' => 'http://47.242.204.179:8000/api/user/recharge/ePayNotice', + ]); + + self::assertArrayHasKey('payUrl', $result->all()); + } + + public function testQuery() + { + $response = 'deviceNo=1234567890&errCode=&errMsg=&field1=2&field2=&field3=&orderNo=20240617144526400259379&orderStatus=2&outTradeNo=YC202406170003&partnerId=6a13eab71c4f4b0aa4757eda6fc59710&respBizDate=20240617&respCode=000000&respMsg=交易成功&totalFee=0.01&signType=RSA&sign=fRMelfVITd0+aV+I5MT9SyTwRjWB+vOVyES9s3l+eKFV9bXwtQLpaORFpr1emepm2mZjCAgK9AORaYYn9vhk+0x+b2jk2QiyQ3aXYrrYx0+foK/OqN9dcJjSTIIpUUitGYk/6CJwe0OFPsDWgqDiLb9A298VFXg++czErz0stcM='; + $http = Mockery::mock(Client::class); + $http->shouldReceive('sendRequest')->andReturn(new Response(200, [], $response)); + Pay::set(HttpClientInterface::class, $http); + + $outTradeNo = 'YC202406170003'; + $result = Pay::epay()->query([ + 'outTradeNo' => $outTradeNo, + ]); + + self::assertArrayHasKey('orderNo', $result->all()); + self::assertArrayHasKey('orderStatus', $result->all()); + self::assertEquals($outTradeNo, $result->get('outTradeNo')); + } + + public function testRefundErrorRefundAmt() + { + //单元测试检测异常是否正确 + $this->expectException(InvalidResponseException::class); + $response = 'field1=&field2=&field3=&partnerId=6a13eab71c4f4b0aa4757eda6fc59710&respBizDate=20240617&respCode=027111&respMsg=退款金额错误&signType=RSA&sign=hzreuJgx+iYz71W8HKyQEH4+XqE7c2Ad6NLa8lSJcVEmjc2nZPZl2s+mBVmZX3PYSlysqq5rlXysGMzQxf4CWkuoUK9wGsCDUIssCBOPcRjdsC2/uFaLavs/jagkKE/tLt45D6h4kibgaHIZabN5NgUkP0p0TAFHISsPPdqjKLY='; + $http = Mockery::mock(Client::class); + $http->shouldReceive('sendRequest')->andReturn(new Response(200, [], $response)); + Pay::set(HttpClientInterface::class, $http); + $outTradeNo = 'YC202406170003'; + Pay::epay()->refund([ + 'outTradeNo' => $outTradeNo, + 'refundAmt' => 0.02, + ]); + dd($result); + } + + public function testRefund() + { + //单元测试检测异常是否正确 + $response = 'fee=0&field1=2&field2=&field3=&orderStatus=3&outRefundNo=RK-YC202406170004&partnerId=6a13eab71c4f4b0aa4757eda6fc59710&refundAmt=0.01&refundNo=20240617151229401202589&respBizDate=20240617&respCode=000000&respMsg=交易成功&signType=RSA&sign=VJi8vD3ZkcPZXkgkJ3RX9oREKxeNoUAi9+SZoiBHNlNc87QN0NRngmLthHbzJUV6Fz8hQX5jumZQnhTpEqlTgEZsHRCIm7ZsqhingBNVKItq/sAqzlpIeogU/jVE4zueqInYIMbVOj6+3AQyZ1+Tblz6d0JrGals3exmBUt/03U='; + $http = Mockery::mock(Client::class); + $http->shouldReceive('sendRequest')->andReturn(new Response(200, [], $response)); + Pay::set(HttpClientInterface::class, $http); + + $outRefundNo = 'RK-YC202406170004'; + $result = Pay::epay()->refund([ + 'outTradeNo' => 'YC202406170004', + 'refundAmt' => 0.01, + 'outRefundNo' => $outRefundNo, + ]); + + self::assertArrayHasKey('orderStatus', $result->all()); + self::assertEquals($outRefundNo, $result->get('outRefundNo')); + dd($result); + } + + + public function testCancel() + { + $this->expectException(InvalidParamsException::class); + + Pay::epay()->cancel([ + 'outTradeNo' => 'YC202406170003', + ]); + } + + public function testClose() + { + $this->expectException(InvalidParamsException::class); + + Pay::epay()->cancel([ + 'outTradeNo' => 'YC202406170003', + ]); + } + + public function testCallback() + { + $playload = [ + 'partnerId'=> '6a13eab71c4f4b0aa4757eda6fc59710', + 'orderStatus'=> '1', + 'totalFee'=> '0.02', + 'outTradeNo'=> 'RC240613164110030316', + 'orderNo'=> '20240613164114400729509', + 'field1'=> '2', + 'field2'=> '', + 'field3'=> '20240613164139|20240613164134400800219', + 'signType'=> 'RSA', + 'sign'=> 'DPKX4mZAVd/LwMDOt1OJgryBuPeH78y7B78smze+m+vvzae5MBf0O3BoTvVJQHD/RPVftHVvnYHeKvIjCC2bCrxoY9Sv2N8Hbr5HfjIikk0a2qaIQp6TTvecMP9JitzSuZP+sih+uxMkRM5Nrg8weGbePaQ6nODNWiSGDhV+Jq0=' + ]; + $result = Pay::epay()->callback($playload); + self::assertNotEmpty($result->all()); + self::assertArrayHasKey('outTradeNo', $result->all()); + self::assertArrayHasKey('orderNo', $result->all()); + self::assertArrayHasKey('orderStatus', $result->all()); + self::assertArrayHasKey('field3', $result->all()); + + } + public function testSuccess() { $result = Pay::epay()->success();