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>
218 lines (197 loc) • 7.21 kB
JavaScript
const express = require('express');
const bodyParser = require('body-parser');
const QuickPos = require('./app');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const quickPos = new QuickPos({
providers: {
fedapay: {
apiKey: 'sk_sandbd_92HEJoHiqT3g9dS6', // Sandbox API Key
environment: 'sandbox', // 'sandbox' veya 'live'
debug: true // Geliştirme aşamasında hata ayıklama için
}
}
});
// QuickPos middleware'ini ekle
app.use(quickPos.middleware());
// Ana sayfa - Ödeme form sayfası
app.get('/', (req, res) => {
res.send(`
<h1>FedaPay Ödeme Testi</h1>
<form action="/create-payment" method="post">
<div>
<label>Tutar:</label>
<input type="text" name="amount" value="1000" required>
</div>
<div>
<label>Para Birimi:</label>
<select name="currency" required>
<option value="XOF">XOF (West African CFA franc)</option>
<option value="USD">USD (US Dollar)</option>
<option value="EUR">EUR (Euro)</option>
</select>
</div>
<div>
<label>Ödeme Modu:</label>
<select name="mode">
<option value="">Seçiniz (Opsiyonel)</option>
<option value="mtn">MTN Mobile Money</option>
<option value="moov">Moov Money</option>
<option value="mtn_open">MTN Open API</option>
<option value="moov_open">Moov Open API</option>
<option value="card">Kredi Kartı</option>
</select>
</div>
<div>
<label>Sipariş No:</label>
<input type="text" name="orderId" value="ORDER-${Date.now()}" required>
</div>
<div>
<label>Açıklama:</label>
<input type="text" name="description" value="Test Ödemesi" required>
</div>
<div>
<label>E-posta:</label>
<input type="email" name="email" value="customer@example.com">
</div>
<div>
<label>İsim:</label>
<input type="text" name="firstName" value="John">
</div>
<div>
<label>Soyisim:</label>
<input type="text" name="lastName" value="Doe">
</div>
<div>
<label>Telefon Numarası:</label>
<input type="text" name="phone" value="90090909">
</div>
<div>
<label>Telefon Ülkesi:</label>
<select name="phoneCountry">
<option value="BJ">Benin (BJ)</option>
<option value="TG">Togo (TG)</option>
<option value="CI">Côte d'Ivoire (CI)</option>
<option value="SN">Senegal (SN)</option>
</select>
</div>
<button type="submit">Ödeme Oluştur</button>
</form>
`);
});
// Ödeme oluşturma rotası
app.post('/create-payment', async (req, res) => {
try {
const result = await quickPos.providers['fedapay'].createPayment({
amount: req.body.amount,
currency: req.body.currency,
description: req.body.description,
orderId: req.body.orderId,
email: req.body.email,
firstName: req.body.firstName,
lastName: req.body.lastName,
phone: req.body.phone,
phoneCountry: req.body.phoneCountry,
mode: req.body.mode || null,
successUrl: `http://${req.headers.host}/success`,
failUrl: `http://${req.headers.host}/cancel`,
notificationUrl: `http://${req.headers.host}/webhook/fedapay`
});
if (result.status === 'success') {
console.log('Ödeme başarıyla oluşturuldu:', result.data);
// Ödeme başarıyla oluşturuldu: {
// id: 307688,
// transactionId: 307688,
// reference: 'trx_Q6E_1742143079406',
// url: 'https://sandbox-process.fedapay.com/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjMwNzY4OCwiZXhwIjoxNzQyMjI5NDgwfQ.ZaGo6MmkdLf1eeYKH7KhnjFBBYKaiGhYOWQ9aSy8b38',
// token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjMwNzY4OCwiZXhwIjoxNzQyMjI5NDgwfQ.ZaGo6MmkdLf1eeYKH7KhnjFBBYKaiGhYOWQ9aSy8b38'
// }
// Ödeme sayfasına yönlendir
res.redirect(result.data.url);
} else {
res.status(400).json({ error: 'Ödeme oluşturulamadı', details: result });
}
} catch (error) {
console.error('Ödeme oluşturma hatası:', error);
res.status(500).json({ error: error.message });
}
});
// Webhook işleme rotası
app.post('/webhook/fedapay', async (req, res) => {
try {
const notification = req.body;
console.log('Webhook çağrısı alındı:', notification);
// FedaPay tarafından gönderilen signature header'i kontrol et
const signature = req.headers['fedapay-signature'];
if (signature) {
const isValidSignature = await quickPos.providers['fedapay'].verifySignature(
req.body,
signature
);
if (!isValidSignature) {
console.error('Geçersiz imza');
return res.status(400).send('Invalid signature');
}
}
// İşlemi doğrula ve işle
const paymentResult = await quickPos.providers['fedapay'].handleCallback(notification);
console.log('Ödeme sonucu:', paymentResult);
if (paymentResult.status === 'success') {
// Burada sipariş durumunu güncelleyebilir, veritabanı işlemleri yapabilirsiniz
console.log(`Ödeme başarılı: Sipariş #${paymentResult.orderId}, Tutar: ${paymentResult.amount} ${paymentResult.currency}`);
// FedaPay başarılı yanıt bekliyor
res.status(200).send('OK');
} else {
// Başarısız işlem
res.status(400).send('FAIL');
}
} catch (error) {
console.error('Webhook hatası:', error);
res.status(500).send('ERROR');
}
});
// Başarılı ödeme sayfası
app.get('/success', (req, res) => {
res.send(`
<h1>Ödemeniz başarıyla tamamlandı!</h1>
<p>İşlem numarası: ${req.query.transaction_id || 'Belirtilmedi'}</p>
<a href="/">Ana Sayfaya Dön</a>
`);
});
// İptal edilen/başarısız ödeme sayfası
app.get('/cancel', (req, res) => {
res.send(`
<h1>Ödeme işlemi iptal edildi veya başarısız oldu!</h1>
<a href="/">Tekrar Deneyin</a>
`);
});
// İşlem sorgulama
app.get('/transaction/:id', async (req, res) => {
try {
const result = await quickPos.providers['fedapay'].getTransaction(req.params.id);
res.json(result);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// İşlem listesi
app.get('/transactions', async (req, res) => {
try {
const result = await quickPos.providers['fedapay'].listTransactions({
page: req.query.page || 1,
per_page: req.query.per_page || 10
});
res.send(`
<h1>Son İşlemler</h1>
<pre>${JSON.stringify(result.data, null, 2)}</pre>
<p><a href="/">Ana Sayfaya Dön</a></p>
`);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
const PORT = process.env.PORT || 80;
app.listen(PORT, () => {
console.log(`Server ${PORT} portunda çalışıyor`);
});