From 494c2e7b8fbf609ad245f2dd2c131c8de1638ded Mon Sep 17 00:00:00 2001 From: Matin Date: Mon, 6 Jan 2025 00:55:45 +0330 Subject: [PATCH] fix: handle cancel payment --- .env | 1 + .env.production | 1 + src/application/IPG/gateways/zarinpal.ts | 25 ++++++++----------- src/application/payment/payment.controller.ts | 13 +++++++--- src/application/payment/payment.service.ts | 3 +-- 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.env b/.env index 6e39344..4b41231 100644 --- a/.env +++ b/.env @@ -6,6 +6,7 @@ CONNECTION_STRING= MERCHANT_ID=250ae134-635f-4728-8415-ee9a984616e8 IPG_TYPE=sandbox SITE_URL=https://dlearn-api.run.danakcorp.com/payment +ACADEMY_URL=http://academy.shinan.ir EMAIL_HOST= EMAIL_PORT= EMAIL_USER= diff --git a/.env.production b/.env.production index 6e39344..4b41231 100644 --- a/.env.production +++ b/.env.production @@ -6,6 +6,7 @@ CONNECTION_STRING= MERCHANT_ID=250ae134-635f-4728-8415-ee9a984616e8 IPG_TYPE=sandbox SITE_URL=https://dlearn-api.run.danakcorp.com/payment +ACADEMY_URL=http://academy.shinan.ir EMAIL_HOST= EMAIL_PORT= EMAIL_USER= diff --git a/src/application/IPG/gateways/zarinpal.ts b/src/application/IPG/gateways/zarinpal.ts index 995e9b3..9d8de36 100644 --- a/src/application/IPG/gateways/zarinpal.ts +++ b/src/application/IPG/gateways/zarinpal.ts @@ -20,7 +20,7 @@ export class ZarinPalGateway { amount, callback_url: `${this.callbackURL}/${callbackPath}`, description: "خرید دوره", - currency: "IRR" as const, + currency: "IRT" as const, metadata: { userId }, } @@ -40,20 +40,15 @@ export class ZarinPalGateway { } async verifyPayment(authority: string, amount: number) { - try { - const verifyData = { - merchant_id: this.merchantID, - amount, - authority, - } - - const response = await axios.post(`${this.gatewayApiURL}/v4/payment/verify.json`, verifyData, { headers: this.requestHeaders }); - const { data } = response.data; - - return data; - } catch (error) { - this.logger.error("error in payment verification", error); - throw new InternalServerErrorException("error in payment verification"); + const verifyData = { + merchant_id: this.merchantID, + amount, + authority, } + + const response = await axios.post(`${this.gatewayApiURL}/v4/payment/verify.json`, verifyData, { headers: this.requestHeaders }); + const { data } = response.data; + + return data; } } \ No newline at end of file diff --git a/src/application/payment/payment.controller.ts b/src/application/payment/payment.controller.ts index b3af482..b449817 100644 --- a/src/application/payment/payment.controller.ts +++ b/src/application/payment/payment.controller.ts @@ -6,6 +6,7 @@ import { HttpStatus, Post, Query, + Res, UseGuards, } from '@nestjs/common'; import { @@ -15,6 +16,7 @@ import { ApiQuery, } from '@nestjs/swagger'; import { CurrentUser } from '../../decorators/currentUser.decorator'; +import { Response } from 'express'; import { AuthGuard } from '../../auth/auth.guard'; import { ApiTags } from '@nestjs/swagger'; import { Roles } from '../../decorators/role.decorators'; @@ -58,9 +60,14 @@ export class PaymentController { description: 'get status', }) @Get('/verify/Zarinpal/cart') - async verifyPayment(@Query('Authority') authority: string, @Query('Status') status: string) { - console.log({ authorityInController: authority, status }) - return this.paymentService.verifyPayment(authority, status); + async verifyPayment(@Query('Authority') authority: string, @Query('Status') status: string,@Res() res: Response) { + if (status === 'NOK') { + return res.redirect(`${process.env.ACADEMY_URL}/payment/verify/Zarinpal/cart?Authority=${authority}&Status=${status}`) + } + const result = await this.paymentService.verifyPayment(authority, status); + console.log({resultincontroller:result}) + return res.redirect(`${process.env.ACADEMY_URL}/payment/verify/Zarinpal/cart?Authority=${authority}&Status=${status}`) + } @ApiOperation({ diff --git a/src/application/payment/payment.service.ts b/src/application/payment/payment.service.ts index 59f41b8..69ee63d 100644 --- a/src/application/payment/payment.service.ts +++ b/src/application/payment/payment.service.ts @@ -115,13 +115,12 @@ export class PaymentService { async verifyPayment(authority: string, status: string) { - console.log({ authorityInService: authority }) const paymentData = await this.paymentDataAccess.getPaymentByAuthority(authority); - console.log({ paymentData }) if (!paymentData) { throw new Error("payment not found"); } const verifyData = await this.paymentGateway.verifyPayment({ authority, amount: paymentData.amount }); + console.log({verifyData}) if (verifyData.code === 100 || verifyData.code === 101) { await this.purchaseDataAccess.createPurchase(paymentData.userId.toString(), paymentData.courseId.toString(), paymentData._id.toString()); paymentData.paymentStatus = PaymentStatus.Completed;