UNPKG

quickpos

Version:

QuickPos, farklı ödeme sağlayıcılarını destekleyen güçlü bir ödeme entegrasyon modülüdür. Şu anda PayTR, Shopier, Cryptomus, Payeer, Papara, Anypay, EsnekPos, İyzico, PayMaya, FedaPay, Heleket, Paydisini sağlayıcısını desteklemektedir ve gelecekte birçok

181 lines (162 loc) 6.93 kB
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;