From e0f3a14b7c135d6e2c70c881404bb5d6ffaf1d06 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Thu, 2 Jul 2020 23:54:34 +0700 Subject: [PATCH 1/8] Add complete purchase middleware. --- .../CompletePurchaseMiddleware.php | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/Middlewares/CompletePurchaseMiddleware.php diff --git a/src/Middlewares/CompletePurchaseMiddleware.php b/src/Middlewares/CompletePurchaseMiddleware.php new file mode 100644 index 0000000..cffddea --- /dev/null +++ b/src/Middlewares/CompletePurchaseMiddleware.php @@ -0,0 +1,47 @@ + + * @since 1.1.0 + */ +class CompletePurchaseMiddleware +{ + /** + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next, string $gateway, $successHandle, $failureHandle = null) + { + /** @var AbstractGateway $gateway */ + $gateway = app('omnipay')->gateway($gateway); + + if (!$gateway->supportsCompletePurchase()) { + throw new \InvalidArgumentException('Gateway configured not support complete purchase method!'); + } + + $response = $gateway->completePurchase()->send(); + + if ($response->isSuccessful()) { + return app()->call($successHandle, [$response]); + } + + if ($failureHandle) { + return app()->call($failureHandle, [$response]); + } + + throw new BadRequestHttpException('Bad request'); + } +} From 351e8ca6ecb6ebeeb7530d6e4040e18c9b041552 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 3 Jul 2020 00:16:22 +0700 Subject: [PATCH 2/8] Update complete purchase middleware. --- src/Middlewares/CompletePurchaseMiddleware.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Middlewares/CompletePurchaseMiddleware.php b/src/Middlewares/CompletePurchaseMiddleware.php index cffddea..c57c235 100644 --- a/src/Middlewares/CompletePurchaseMiddleware.php +++ b/src/Middlewares/CompletePurchaseMiddleware.php @@ -23,7 +23,7 @@ class CompletePurchaseMiddleware * @param \Closure $next * @return mixed */ - public function handle($request, Closure $next, string $gateway, $successHandle, $failureHandle = null) + public function handle($request, Closure $next, string $gateway, $failureHandle = null) { /** @var AbstractGateway $gateway */ $gateway = app('omnipay')->gateway($gateway); @@ -34,14 +34,16 @@ public function handle($request, Closure $next, string $gateway, $successHandle, $response = $gateway->completePurchase()->send(); - if ($response->isSuccessful()) { - return app()->call($successHandle, [$response]); - } + $request->attributes->set('completePurchaseResponse', $response); + + if (!$response->isSuccessful()) { + if ($failureHandle) { + return app()->call($failureHandle, [$response]); + } - if ($failureHandle) { - return app()->call($failureHandle, [$response]); + throw new BadRequestHttpException('Bad request'); } - throw new BadRequestHttpException('Bad request'); + return $next($request); } } From 2674b3096a7406b79bcc38d7e3c0a3c63a05f28f Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 3 Jul 2020 00:17:18 +0700 Subject: [PATCH 3/8] Fix typo middleware namespace. --- src/{Middlewares => Middleware}/CompletePurchaseMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/{Middlewares => Middleware}/CompletePurchaseMiddleware.php (96%) diff --git a/src/Middlewares/CompletePurchaseMiddleware.php b/src/Middleware/CompletePurchaseMiddleware.php similarity index 96% rename from src/Middlewares/CompletePurchaseMiddleware.php rename to src/Middleware/CompletePurchaseMiddleware.php index c57c235..1464e70 100644 --- a/src/Middlewares/CompletePurchaseMiddleware.php +++ b/src/Middleware/CompletePurchaseMiddleware.php @@ -6,7 +6,7 @@ * @license [MIT](https://opensource.org/licenses/MIT) */ -namespace PHPViet\Laravel\Omnipay\Middlewares; +namespace PHPViet\Laravel\Omnipay\Middleware; use Closure; use Omnipay\Common\AbstractGateway; From e5629868495c3755b74cfad9140c02d3d33f2320 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Sat, 4 Jul 2020 12:22:33 +0700 Subject: [PATCH 4/8] Add CompletePurchaseMiddlewareTest. --- src/Middleware/CompletePurchaseMiddleware.php | 17 ++--- .../CompletePurchaseMiddlewareTest.php | 71 +++++++++++++++++++ 2 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 tests/Middleware/CompletePurchaseMiddlewareTest.php diff --git a/src/Middleware/CompletePurchaseMiddleware.php b/src/Middleware/CompletePurchaseMiddleware.php index 1464e70..d51a333 100644 --- a/src/Middleware/CompletePurchaseMiddleware.php +++ b/src/Middleware/CompletePurchaseMiddleware.php @@ -10,6 +10,7 @@ use Closure; use Omnipay\Common\AbstractGateway; +use Omnipay\Common\Exception\InvalidRequestException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; /** @@ -23,7 +24,7 @@ class CompletePurchaseMiddleware * @param \Closure $next * @return mixed */ - public function handle($request, Closure $next, string $gateway, $failureHandle = null) + public function handle($request, Closure $next, string $gateway) { /** @var AbstractGateway $gateway */ $gateway = app('omnipay')->gateway($gateway); @@ -32,18 +33,14 @@ public function handle($request, Closure $next, string $gateway, $failureHandle throw new \InvalidArgumentException('Gateway configured not support complete purchase method!'); } - $response = $gateway->completePurchase()->send(); + try { + $response = $gateway->completePurchase()->send(); + } catch (InvalidRequestException $e) { + throw new BadRequestHttpException($e->getMessage()); + } $request->attributes->set('completePurchaseResponse', $response); - if (!$response->isSuccessful()) { - if ($failureHandle) { - return app()->call($failureHandle, [$response]); - } - - throw new BadRequestHttpException('Bad request'); - } - return $next($request); } } diff --git a/tests/Middleware/CompletePurchaseMiddlewareTest.php b/tests/Middleware/CompletePurchaseMiddlewareTest.php new file mode 100644 index 0000000..e96b77d --- /dev/null +++ b/tests/Middleware/CompletePurchaseMiddlewareTest.php @@ -0,0 +1,71 @@ + + * @since 1.0.0 + */ +class CompletePurchaseMiddlewareTest extends TestCase +{ + + public function getEnvironmentSetUp($app): void + { + $_GET['partnerCode'] = 'test'; + $_GET['accessKey'] = 'test'; + $_GET['requestId'] = 'test'; + $_GET['amount'] = 'test'; + $_GET['orderId'] = 'test'; + $_GET['orderInfo'] = 'test'; + $_GET['orderType'] = 'test'; + $_GET['transId'] = 'test'; + $_GET['message'] = 'test'; + $_GET['localMessage'] = 'test'; + $_GET['responseTime'] = 'test'; + $_GET['errorCode'] = 'test'; + $_GET['extraData'] = 'test'; + $_GET['signature'] = 'test'; + $_GET['payType'] = 'test'; + + parent::getEnvironmentSetUp($app); + + $router = $app->get('router'); + $router->middleware(CompletePurchaseMiddleware::class); + $router->aliasMiddleware('completePurchase', CompletePurchaseMiddleware::class); + $router->get( + '/test', + function (Request $request) { + $completePurchaseResponse = $request->attributes->get('completePurchaseResponse'); + + $this->assertInstanceOf(ResponseInterface::class, $completePurchaseResponse); + + return new Response('ok', 200); + } + )->middleware('completePurchase:MoMoAIO'); + } + + public function testCanGetResponse() + { + $response = $this->get('/test'); + $response->assertOk(); + } + + public function testMissingRequestQueryParam() + { + unset($_GET['signature']); + $response = $this->get('/test'); + $response->assertStatus(400); + } +} From fb0c57f2023ca62814ed141cf85c6955deba07e9 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Sun, 5 Jul 2020 00:20:06 +0700 Subject: [PATCH 5/8] Add CompletePurchaseMiddleware doc. --- docs/VNPay.md | 3 ++ docs/VTCPay.md | 3 ++ docs/common/CompletePurchaseMiddleware.md | 37 +++++++++++++++++++ docs/momo/AllInOne.md | 3 ++ docs/onepay/Domestic.md | 3 ++ docs/onepay/International.md | 3 ++ src/Middleware/CompletePurchaseMiddleware.php | 4 +- 7 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 docs/common/CompletePurchaseMiddleware.md diff --git a/docs/VNPay.md b/docs/VNPay.md index 50ee43a..dca1ba9 100644 --- a/docs/VNPay.md +++ b/docs/VNPay.md @@ -47,6 +47,9 @@ if ($response->isSuccessful()) { } ``` +Hoặc bạn có thể sử dụng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` để giảm bớt nghiệp vụ xử lý kiểm tra tính hợp lệ +của request, xem thêm tại [đây](../common/CompletePurchaseMiddleware.md). + Kham khảo thêm các tham trị khi VNPay trả về tại [đây](https://sandbox.vnpayment.vn/apis/docs/huong-dan-tich-hop/#code-returnurl). ### Kiểm tra thông tin `IPN` do VNPay gửi sang: diff --git a/docs/VTCPay.md b/docs/VTCPay.md index 09d9652..e8b9e54 100644 --- a/docs/VTCPay.md +++ b/docs/VTCPay.md @@ -45,6 +45,9 @@ if ($response->isSuccessful()) { } ``` +Hoặc bạn có thể sử dụng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` để giảm bớt nghiệp vụ xử lý kiểm tra tính hợp lệ +của request, xem thêm tại [đây](../common/CompletePurchaseMiddleware.md). + Kham khảo thêm các tham trị khi VTCPay trả về tại [đây](https://vtcpay.vn/tai-lieu-tich-hop-website). diff --git a/docs/common/CompletePurchaseMiddleware.md b/docs/common/CompletePurchaseMiddleware.md new file mode 100644 index 0000000..f39e4ea --- /dev/null +++ b/docs/common/CompletePurchaseMiddleware.md @@ -0,0 +1,37 @@ +Complete purchase middleware +================================================== + +Lớp `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` là một [route middleware](https://laravel.com/docs/7.x/middleware#assigning-middleware-to-routes) giúp bạn +giảm bớt nghiệp vụ xác thực phiên giao dịch của khách có thành công hay không hay có phải là do nhà cung cấp dịch vụ gửi về hay không, thay vào đó bạn chỉ cần tập trung vào xử lý +nghiệp vụ khi thanh toán thành công hoặc thất bại. + +Để sử dụng middleware này thì bạn cần khai báo nó vào `routeMiddleware`: + +```php +// Within App\Http\Kernel Class... + + protected $routeMiddleware = [ + 'completePurchase' => \PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware::class + ]; +``` + +Và gắn nó vào route đảm nhiệm nghiệp vụ khi nhà cung cấp dịch vụ redirect khách về site của bạn +ví dụ: + +```php + Route::get('/complete-purchase', function (\Illuminate\Http\Request $request) { + /** @var \Omnipay\Common\Message\ResponseInterface $completePurchaseResponse */ + $completePurchaseResponse = $request->attributes->get('completePurchaseResponse'); + + if ($completePurchaseResponse->isSuccessful()) { + // xử lý logic thanh toán thành công. + } elseif ($completePurchaseResponse->isCancelled()) { + // khi khách hủy giao dịch. + } else { + // các trường hợp khác + } + + })->middleware('completePurchase:MoMoAIO'); +``` + +Parameter truyền vào middleware chính là gateway name của bạn ở ví dụ trên nó là `MoMoAIO` gateway. diff --git a/docs/momo/AllInOne.md b/docs/momo/AllInOne.md index 5ce0dd1..491503b 100644 --- a/docs/momo/AllInOne.md +++ b/docs/momo/AllInOne.md @@ -44,6 +44,9 @@ if ($response->isSuccessful()) { } ``` +Hoặc bạn có thể sử dụng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` để giảm bớt nghiệp vụ xử lý kiểm tra tính hợp lệ +của request, xem thêm tại [đây](../common/CompletePurchaseMiddleware.md). + Kham khảo thêm các tham trị khi MoMo trả về tại [đây](https://developers.momo.vn/#/docs/aio/?id=th%c3%b4ng-tin-tham-s%e1%bb%91). ### Kiểm tra thông tin `notifyUrl` do MoMo gửi sang: diff --git a/docs/onepay/Domestic.md b/docs/onepay/Domestic.md index 315cacd..bdc381a 100644 --- a/docs/onepay/Domestic.md +++ b/docs/onepay/Domestic.md @@ -44,6 +44,9 @@ if ($response->isSuccessful()) { } ``` +Hoặc bạn có thể sử dụng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` để giảm bớt nghiệp vụ xử lý kiểm tra tính hợp lệ +của request, xem thêm tại [đây](../common/CompletePurchaseMiddleware.md). + Kham khảo thêm các tham trị khi OnePay trả về tại [đây](https://mtf.onepay.vn/developer/resource/documents/docx/quy_trinh_tich_hop-noidia.pdf). ### Kiểm tra thông tin `IPN` do OnePay gửi sang: diff --git a/docs/onepay/International.md b/docs/onepay/International.md index 973366d..22f5037 100644 --- a/docs/onepay/International.md +++ b/docs/onepay/International.md @@ -44,6 +44,9 @@ if ($response->isSuccessful()) { } ``` +Hoặc bạn có thể sử dụng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` để giảm bớt nghiệp vụ xử lý kiểm tra tính hợp lệ +của request, xem thêm tại [đây](../common/CompletePurchaseMiddleware.md). + Kham khảo thêm các tham trị khi OnePay trả về tại [đây](https://mtf.onepay.vn/developer/resource/documents/docx/quy_trinh_tich_hop-noidia.pdf). ### Kiểm tra thông tin `IPN` do OnePay gửi sang: diff --git a/src/Middleware/CompletePurchaseMiddleware.php b/src/Middleware/CompletePurchaseMiddleware.php index d51a333..2b9c81d 100644 --- a/src/Middleware/CompletePurchaseMiddleware.php +++ b/src/Middleware/CompletePurchaseMiddleware.php @@ -10,7 +10,7 @@ use Closure; use Omnipay\Common\AbstractGateway; -use Omnipay\Common\Exception\InvalidRequestException; +use Omnipay\Common\Exception\OmnipayException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; /** @@ -35,7 +35,7 @@ public function handle($request, Closure $next, string $gateway) try { $response = $gateway->completePurchase()->send(); - } catch (InvalidRequestException $e) { + } catch (OmnipayException $e) { throw new BadRequestHttpException($e->getMessage()); } From 703bda4a59121dd4388cde7ebcce9e13133a6652 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Sun, 5 Jul 2020 00:23:23 +0700 Subject: [PATCH 6/8] Update CHANGELOG.md. --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f62bb49..0cb3eef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ Tất cả lịch sử tiến trình phát triển thư viện +### 1.1.0 + ++ Thêm lớp đối tượng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` giảm nghiệp vụ xác minh tính hợp lệ của +complete purchase request. + + ### 1.0.1 + Hổ trợ Laravel 6 & 7. From f8209f2e3902f3dc380433db47c6259fd7fcbfd1 Mon Sep 17 00:00:00 2001 From: Vuong Minh Date: Sat, 4 Jul 2020 17:27:15 +0000 Subject: [PATCH 7/8] Apply fixes from StyleCI --- src/Middleware/CompletePurchaseMiddleware.php | 2 +- tests/Middleware/CompletePurchaseMiddlewareTest.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Middleware/CompletePurchaseMiddleware.php b/src/Middleware/CompletePurchaseMiddleware.php index 2b9c81d..126f2c7 100644 --- a/src/Middleware/CompletePurchaseMiddleware.php +++ b/src/Middleware/CompletePurchaseMiddleware.php @@ -29,7 +29,7 @@ public function handle($request, Closure $next, string $gateway) /** @var AbstractGateway $gateway */ $gateway = app('omnipay')->gateway($gateway); - if (!$gateway->supportsCompletePurchase()) { + if (! $gateway->supportsCompletePurchase()) { throw new \InvalidArgumentException('Gateway configured not support complete purchase method!'); } diff --git a/tests/Middleware/CompletePurchaseMiddlewareTest.php b/tests/Middleware/CompletePurchaseMiddlewareTest.php index e96b77d..933830b 100644 --- a/tests/Middleware/CompletePurchaseMiddlewareTest.php +++ b/tests/Middleware/CompletePurchaseMiddlewareTest.php @@ -20,7 +20,6 @@ */ class CompletePurchaseMiddlewareTest extends TestCase { - public function getEnvironmentSetUp($app): void { $_GET['partnerCode'] = 'test'; From 82c47b7f70445c16c1240c4ad53abd8b9f2a4129 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Sun, 5 Jul 2020 00:34:48 +0700 Subject: [PATCH 8/8] Fix docs [skip ci]. --- docs/VNPay.md | 2 +- docs/VTCPay.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/VNPay.md b/docs/VNPay.md index dca1ba9..05a8cfe 100644 --- a/docs/VNPay.md +++ b/docs/VNPay.md @@ -48,7 +48,7 @@ if ($response->isSuccessful()) { ``` Hoặc bạn có thể sử dụng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` để giảm bớt nghiệp vụ xử lý kiểm tra tính hợp lệ -của request, xem thêm tại [đây](../common/CompletePurchaseMiddleware.md). +của request, xem thêm tại [đây](common/CompletePurchaseMiddleware.md). Kham khảo thêm các tham trị khi VNPay trả về tại [đây](https://sandbox.vnpayment.vn/apis/docs/huong-dan-tich-hop/#code-returnurl). diff --git a/docs/VTCPay.md b/docs/VTCPay.md index e8b9e54..05882f1 100644 --- a/docs/VTCPay.md +++ b/docs/VTCPay.md @@ -46,7 +46,7 @@ if ($response->isSuccessful()) { ``` Hoặc bạn có thể sử dụng `PHPViet\Laravel\Omnipay\Middleware\CompletePurchaseMiddleware` để giảm bớt nghiệp vụ xử lý kiểm tra tính hợp lệ -của request, xem thêm tại [đây](../common/CompletePurchaseMiddleware.md). +của request, xem thêm tại [đây](common/CompletePurchaseMiddleware.md). Kham khảo thêm các tham trị khi VTCPay trả về tại [đây](https://vtcpay.vn/tai-lieu-tich-hop-website).