uz-pay-sdk
Version:
🚀 Universal Payment SDK for Uzbekistan - Integrate Payme, Click, UzCard, Humo & Apelsin with one simple API. Battle-tested, production-ready, 95% faster integration.
253 lines • 9.94 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebhookController = void 0;
const common_1 = require("@nestjs/common");
const logger_config_1 = require("../logger/logger.config");
const webhook_service_1 = require("./webhook.service");
let WebhookController = class WebhookController {
constructor(webhookService) {
this.webhookService = webhookService;
}
async handlePaymeWebhook(payload, signature) {
logger_config_1.logger.info('Payme webhook received', {
transactionId: payload.transaction?.id,
state: payload.transaction?.state,
});
try {
// Payme signature validation
const isValid = this.webhookService.validatePaymeSignature(payload, signature);
if (!isValid) {
throw new common_1.BadRequestException('Invalid signature');
}
const webhookData = {
provider: 'payme',
transactionId: payload.transaction?.id,
orderId: payload.transaction?.account?.order_id,
amount: payload.transaction?.amount,
status: this.mapPaymeStatus(payload.transaction?.state),
timestamp: new Date().toISOString(),
};
await this.webhookService.processWebhook(webhookData);
return { success: true };
}
catch (error) {
logger_config_1.logger.error('Payme webhook processing failed', {
error: error.message,
payload: JSON.stringify(payload, null, 2),
});
throw error;
}
}
async handleClickWebhook(payload, signature) {
logger_config_1.logger.info('Click webhook received', {
clickTransId: payload.click_trans_id,
merchantTransId: payload.merchant_trans_id,
action: payload.action,
});
try {
// Click signature validation
const isValid = this.webhookService.validateClickSignature(payload, signature);
if (!isValid) {
throw new common_1.BadRequestException('Invalid signature');
}
const webhookData = {
provider: 'click',
transactionId: payload.click_trans_id,
orderId: payload.merchant_trans_id,
amount: payload.amount,
status: this.mapClickStatus(payload.action),
timestamp: new Date().toISOString(),
};
await this.webhookService.processWebhook(webhookData);
return { success: true };
}
catch (error) {
logger_config_1.logger.error('Click webhook processing failed', {
error: error.message,
payload: JSON.stringify(payload, null, 2),
});
throw error;
}
}
async handleUzcardWebhook(payload, authorization) {
logger_config_1.logger.info('UzCard webhook received', {
transactionId: payload.transaction_id,
orderId: payload.order_id,
status: payload.status,
});
try {
const webhookData = {
provider: 'uzcard',
transactionId: payload.transaction_id,
orderId: payload.order_id,
amount: payload.amount,
status: this.mapUzcardStatus(payload.status),
timestamp: new Date().toISOString(),
};
await this.webhookService.processWebhook(webhookData);
return { success: true };
}
catch (error) {
logger_config_1.logger.error('UzCard webhook processing failed', {
error: error.message,
payload: JSON.stringify(payload, null, 2),
});
throw error;
}
}
async handleHumoWebhook(payload) {
logger_config_1.logger.info('Humo webhook received', {
transactionId: payload.transaction_id,
orderId: payload.order_id,
});
try {
const webhookData = {
provider: 'humo',
transactionId: payload.transaction_id,
orderId: payload.order_id,
amount: payload.amount,
status: this.mapHumoStatus(payload.status),
timestamp: new Date().toISOString(),
};
await this.webhookService.processWebhook(webhookData);
return { success: true };
}
catch (error) {
logger_config_1.logger.error('Humo webhook processing failed', {
error: error.message,
payload: JSON.stringify(payload, null, 2),
});
throw error;
}
}
async handleApelsinWebhook(payload) {
logger_config_1.logger.info('Apelsin webhook received', {
transactionId: payload.transaction_id,
orderId: payload.order_id,
});
try {
const webhookData = {
provider: 'apelsin',
transactionId: payload.transaction_id,
orderId: payload.order_id,
amount: payload.amount,
status: this.mapApelsinStatus(payload.status),
timestamp: new Date().toISOString(),
};
await this.webhookService.processWebhook(webhookData);
return { success: true };
}
catch (error) {
logger_config_1.logger.error('Apelsin webhook processing failed', {
error: error.message,
payload: JSON.stringify(payload, null, 2),
});
throw error;
}
}
// Status mapping methods
mapPaymeStatus(state) {
switch (state) {
case 2:
return 'success';
case -1:
case -2:
return 'cancelled';
case 1:
return 'pending';
default:
return 'failed';
}
}
mapClickStatus(action) {
switch (action) {
case 1:
return 'success';
case 0:
return 'failed';
default:
return 'pending';
}
}
mapUzcardStatus(status) {
switch (status?.toLowerCase()) {
case 'success':
case 'completed':
return 'success';
case 'failed':
case 'error':
return 'failed';
case 'cancelled':
return 'cancelled';
default:
return 'pending';
}
}
mapHumoStatus(status) {
return this.mapUzcardStatus(status); // Same logic
}
mapApelsinStatus(status) {
return this.mapUzcardStatus(status); // Same logic
}
};
exports.WebhookController = WebhookController;
__decorate([
(0, common_1.Post)('payme'),
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
__param(0, (0, common_1.Body)()),
__param(1, (0, common_1.Headers)('x-signature')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, String]),
__metadata("design:returntype", Promise)
], WebhookController.prototype, "handlePaymeWebhook", null);
__decorate([
(0, common_1.Post)('click'),
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
__param(0, (0, common_1.Body)()),
__param(1, (0, common_1.Headers)('x-signature')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, String]),
__metadata("design:returntype", Promise)
], WebhookController.prototype, "handleClickWebhook", null);
__decorate([
(0, common_1.Post)('uzcard'),
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
__param(0, (0, common_1.Body)()),
__param(1, (0, common_1.Headers)('authorization')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, String]),
__metadata("design:returntype", Promise)
], WebhookController.prototype, "handleUzcardWebhook", null);
__decorate([
(0, common_1.Post)('humo'),
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], WebhookController.prototype, "handleHumoWebhook", null);
__decorate([
(0, common_1.Post)('apelsin'),
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], WebhookController.prototype, "handleApelsinWebhook", null);
exports.WebhookController = WebhookController = __decorate([
(0, common_1.Controller)('webhooks'),
__metadata("design:paramtypes", [webhook_service_1.WebhookService])
], WebhookController);
//# sourceMappingURL=webhook.controller.js.map