redirect after online payment
This commit is contained in:
@@ -4,7 +4,9 @@ import {
|
|||||||
UseGuards,
|
UseGuards,
|
||||||
Query,
|
Query,
|
||||||
Delete,
|
Delete,
|
||||||
|
Res,
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
|
import type { Response } from 'express';
|
||||||
import { PaymentService } from '../services/payments.service';
|
import { PaymentService } from '../services/payments.service';
|
||||||
import {
|
import {
|
||||||
ApiTags,
|
ApiTags,
|
||||||
@@ -38,8 +40,18 @@ export class PaymentController {
|
|||||||
|
|
||||||
@Get('public/payments/online/:token/verify')
|
@Get('public/payments/online/:token/verify')
|
||||||
@ApiOperation({ summary: 'Verify online payment' })
|
@ApiOperation({ summary: 'Verify online payment' })
|
||||||
verifyOnlinePayment(@Param('token') token: string) {
|
async verifyOnlinePayment(
|
||||||
return this.paymentService.verifyOnlinePayment(token);
|
@Param('token') token: string,
|
||||||
|
@Res() res: Response,
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
const payment = await this.paymentService.verifyOnlinePayment(token);
|
||||||
|
const redirectUrl = this.paymentService.getRedirectUrlAfterVerify(payment);
|
||||||
|
return res.redirect(302, redirectUrl);
|
||||||
|
} catch {
|
||||||
|
const redirectUrl = this.paymentService.getRedirectUrlAfterVerifyToFailed();
|
||||||
|
return res.redirect(302, redirectUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,17 @@ import { Admin } from 'src/modules/admin/entities/admin.entity';
|
|||||||
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
|
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
|
||||||
import { CreditTransaction } from 'src/modules/user/entities/credit-transaction.entity';
|
import { CreditTransaction } from 'src/modules/user/entities/credit-transaction.entity';
|
||||||
import { InvoiceService } from 'src/modules/invoice/invoice.service';
|
import { InvoiceService } from 'src/modules/invoice/invoice.service';
|
||||||
|
import { ConfigService } from '@nestjs/config';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class PaymentService {
|
export class PaymentService {
|
||||||
private readonly logger = new Logger(PaymentService.name);
|
private readonly logger = new Logger(PaymentService.name);
|
||||||
|
private readonly frontUrl: string;
|
||||||
|
|
||||||
|
private readonly paymentSuccessPath = 'invoice/payment/success';
|
||||||
|
private readonly paymentFailedPath = 'invoice/payment/failed';
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly em: EntityManager,
|
private readonly em: EntityManager,
|
||||||
@@ -35,7 +40,10 @@ export class PaymentService {
|
|||||||
private readonly creditRepository: CreditRepository,
|
private readonly creditRepository: CreditRepository,
|
||||||
private readonly adminRepository: AdminRepository,
|
private readonly adminRepository: AdminRepository,
|
||||||
private readonly invoiceService: InvoiceService,
|
private readonly invoiceService: InvoiceService,
|
||||||
) { }
|
private readonly configService: ConfigService,
|
||||||
|
) {
|
||||||
|
this.frontUrl = this.configService.getOrThrow<string>('FRONT_URL') || 'https://negareh-console.dev.danakcorp.com/'
|
||||||
|
}
|
||||||
|
|
||||||
async payInvoice(invoiceId: string, dto: PayOrderDto, adminId?: string): Promise<{ paymentUrl: string | null }> {
|
async payInvoice(invoiceId: string, dto: PayOrderDto, adminId?: string): Promise<{ paymentUrl: string | null }> {
|
||||||
|
|
||||||
@@ -231,6 +239,27 @@ export class PaymentService {
|
|||||||
return payment;
|
return payment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the frontend URL to redirect the user after online payment verification.
|
||||||
|
* Success: /payment/success?invoiceId=...
|
||||||
|
* Failed: /payment/failed?invoiceId=...
|
||||||
|
*/
|
||||||
|
getRedirectUrlAfterVerify(payment: Payment): string {
|
||||||
|
const base = this.frontUrl.replace(/\/$/, '');
|
||||||
|
const invoiceId = payment.invoice?.id ?? '';
|
||||||
|
const path =
|
||||||
|
payment.status === PaymentStatusEnum.Paid
|
||||||
|
? this.paymentSuccessPath
|
||||||
|
: this.paymentFailedPath;
|
||||||
|
return `${base}${path}?invoiceId=${encodeURIComponent(invoiceId)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Redirect URL when verification fails without a payment (e.g. invalid token). */
|
||||||
|
getRedirectUrlAfterVerifyToFailed(): string {
|
||||||
|
const base = this.frontUrl.replace(/\/$/, '');
|
||||||
|
return `${base}${this.paymentFailedPath}`;
|
||||||
|
}
|
||||||
|
|
||||||
findAll(dto: FindPaymentsDto) {
|
findAll(dto: FindPaymentsDto) {
|
||||||
return this.paymentRepository.findAllPaginated(dto)
|
return this.paymentRepository.findAllPaginated(dto)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user