quickpos
Version:
<div align="center"> <h1>💳 QuickPos 🚀</h1> <p><strong>A powerful, multi-gateway payment integration module for Node.js</strong></p> <p>Seamlessly integrate with 50+ payment providers worldwide</p>
181 lines (162 loc) • 6.93 kB
JavaScript
const Iyzipay = require('iyzipay');
const uuid = require('uuid');
const dayjs = require('dayjs');
class Iyzico {
constructor(config) {
this.config = config || {};
const requiredFields = ['apiKey', 'secretKey', 'uri'];
for (let field of requiredFields) {
if (!config[field]) throw new Error(`Missing required field: ${field}`);
}
this.iyzipay = new Iyzipay({
apiKey: config.apiKey,
secretKey: config.secretKey,
uri: config.uri || 'https://sandbox-api.iyzipay.com'
});
}
async createPayment(paymentDetails) {
try {
// Zorunlu alanları kontrol et
const requiredData = ['name', 'amount', 'currency', 'callbackUrl', 'email'];
for (let data of requiredData) {
if (!paymentDetails[data]) throw new Error(`Missing required data: ${data}`);
}
const price = parseFloat(paymentDetails.amount).toFixed(2);
const paidPrice = price; // Fiyatı ayarla, vergi/komisyon eklenecekse burada değiştirebilirsin
const currency = this.getCurrencyCode(paymentDetails.currency);
// Benzersiz sipariş ID oluştur
const conversationId = paymentDetails.conversationId || `conv_${Date.now()}_${Math.floor(Math.random() * 1000)}`;
const basketId = paymentDetails.orderId || `order_${Date.now()}`;
// Ödeme formu oluşturma isteği
const request = {
locale: paymentDetails.locale || Iyzipay.LOCALE.TR,
conversationId: conversationId,
price: price,
paidPrice: paidPrice,
currency: currency,
basketId: basketId,
paymentGroup: Iyzipay.PAYMENT_GROUP.PRODUCT,
callbackUrl: paymentDetails.callbackUrl,
enabledInstallments: paymentDetails.enabledInstallments || [1, 2, 3, 6, 9],
buyer: {
id: paymentDetails.buyerId || 'BY789',
name: paymentDetails.buyerName || 'John',
surname: paymentDetails.buyerSurname || 'Doe',
gsmNumber: paymentDetails.buyerPhone || '+905350000000',
email: paymentDetails.email,
identityNumber: paymentDetails.identityNumber || '74300864791',
lastLoginDate: paymentDetails.lastLoginDate || dayjs().format('YYYY-MM-DD HH:mm:ss'),
registrationDate: paymentDetails.registrationDate || dayjs().format('YYYY-MM-DD HH:mm:ss'),
registrationAddress: paymentDetails.address || 'Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1',
ip: paymentDetails.ip || '85.34.78.112',
city: paymentDetails.city || 'Istanbul',
country: paymentDetails.country || 'Turkey',
zipCode: paymentDetails.zipCode || '34732'
},
shippingAddress: {
contactName: paymentDetails.buyerName ? `${paymentDetails.buyerName} ${paymentDetails.buyerSurname}` : 'John Doe',
city: paymentDetails.city || 'Istanbul',
country: paymentDetails.country || 'Turkey',
address: paymentDetails.address || 'Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1',
zipCode: paymentDetails.zipCode || '34732'
},
billingAddress: {
contactName: paymentDetails.buyerName ? `${paymentDetails.buyerName} ${paymentDetails.buyerSurname}` : 'John Doe',
city: paymentDetails.city || 'Istanbul',
country: paymentDetails.country || 'Turkey',
address: paymentDetails.address || 'Nidakule Göztepe, Merdivenköy Mah. Bora Sok. No:1',
zipCode: paymentDetails.zipCode || '34732'
},
basketItems: [
{
id: paymentDetails.itemId || `ITEM${Date.now()}`,
name: paymentDetails.name,
category1: paymentDetails.category || 'Digital',
category2: paymentDetails.subCategory || 'Service',
itemType: Iyzipay.BASKET_ITEM_TYPE.VIRTUAL,
price: price
}
]
};
// Önce checkoutFormInitialize ile ödeme formu oluşturalım
return new Promise((resolve, reject) => {
this.iyzipay.checkoutFormInitialize.create(request, (err, result) => {
if (err) {
return reject(new Error(`Iyzico error: ${err.message}`));
}
if (result.status === 'success') {
resolve({
status: 'success',
data: {
token: result.token,
url: result.paymentPageUrl, // Ödeme sayfası linki
status: result.status
}
});
} else {
reject(new Error(`Iyzico payment creation failed: ${result.errorMessage}`));
}
});
});
} catch (error) {
throw new Error(`Error in Iyzico payment creation: ${error.message}`);
}
}
async handleCallback(callbackData) {
try {
if (!callbackData || !callbackData.token) {
throw new Error('Invalid callback data: token is missing');
}
const request = {
locale: Iyzipay.LOCALE.TR,
conversationId: `retrieve_${Date.now()}`,
token: callbackData.token
};
return new Promise((resolve, reject) => {
// checkout form ile ödeme sonucunu kontrol et
this.iyzipay.checkoutForm.retrieve(request, (err, result) => {
if (err) {
return reject(new Error(`Iyzico retrieval error: ${err.message}`));
}
console.log(result)
if (result.status === 'success' && result.paymentStatus === 'SUCCESS') {
resolve({
status: 'success',
orderId: result.basketId,
amount: parseFloat(result.price),
currency: this.getCurrencyName(result.currency),
paymentId: result.paymentId,
paymentType: result.cardType || 'Unknown',
paymentTransactionId: result.token,
installment: result.installment
});
} else {
reject(new Error(`Payment failed: ${result.errorMessage || 'Unknown error'}`));
}
});
});
} catch (error) {
throw new Error(`Error in Iyzico callback handling: ${error.message}`);
}
}
getCurrencyCode(currency) {
const currencyMap = {
'TRY': Iyzipay.CURRENCY.TRY,
'TL': Iyzipay.CURRENCY.TRY,
'USD': Iyzipay.CURRENCY.USD,
'EUR': Iyzipay.CURRENCY.EUR,
'GBP': Iyzipay.CURRENCY.GBP
};
return currencyMap[currency.toUpperCase()] || Iyzipay.CURRENCY.TRY;
}
getCurrencyName(currencyCode) {
const currencyMap = {
[Iyzipay.CURRENCY.TRY]: 'TRY',
[Iyzipay.CURRENCY.USD]: 'USD',
[Iyzipay.CURRENCY.EUR]: 'EUR',
[Iyzipay.CURRENCY.GBP]: 'GBP'
};
return currencyMap[currencyCode] || 'TRY';
}
}
module.exports = Iyzico;