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>
335 lines (303 loc) • 10.8 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: {
anypay: {
merchantId: '16219', // Merchant ID
secretKey: 'xxx', // Gizli anahtar
apiId: 'xxxx', // API ID (isteğe bağlı)
apiKey: 'xxx', // API anahtarı (isteğe bağlı)
debug: true // Geliştirme aşamasında hata ayıklama için
}
}
});
app.use(quickPos.middleware());
// Ana sayfa - Ödeme formları
app.get('/', (req, res) => {
res.send(`
<h1>AnyPay Ödeme Testi</h1>
<h2>Form Yöntemi ile Ödeme</h2>
<form action="/create-payment-form" method="post">
<div>
<label>Miktar:</label>
<input type="text" name="amount" value="10.00" required>
</div>
<div>
<label>Para Birimi:</label>
<select name="currency" required>
<option value="RUB">RUB</option>
<option value="USD">USD</option>
<option value="EUR">EUR</option>
<option value="UAH">UAH</option>
<option value="BYN">BYN</option>
<option value="KZT">KZT</option>
</select>
</div>
<div>
<label>Ödeme Yöntemi:</label>
<select name="method" required>
<option value="card">Kredi Kartı</option>
<option value="qiwi">Qiwi</option>
<option value="payeer">Payeer</option>
<option value="btc">Bitcoin</option>
<option value="eth">Ethereum</option>
<option value="ltc">Litecoin</option>
</select>
</div>
<div>
<label>Email:</label>
<input type="email" name="email" value="customer@example.com" required>
</div>
<div>
<label>Açıklama:</label>
<input type="text" name="desc" value="Test ürünü" required>
</div>
<button type="submit">Form ile Ödeme Oluştur</button>
</form>
<hr>
<h2>API Yöntemi ile Ödeme (API Key gerektirir)</h2>
<form action="/create-payment-api" method="post">
<div>
<label>Miktar:</label>
<input type="text" name="amount" value="10.00" required>
</div>
<div>
<label>Para Birimi:</label>
<select name="currency" required>
<option value="RUB">RUB</option>
<option value="USD">USD</option>
</select>
</div>
<div>
<label>Ödeme Yöntemi:</label>
<select name="method" required>
<option value="card">Kredi Kartı</option>
<option value="qiwi">Qiwi</option>
</select>
</div>
<div>
<label>Email:</label>
<input type="email" name="email" value="customer@example.com" required>
</div>
<div>
<label>Açıklama:</label>
<input type="text" name="desc" value="API Test ürünü" required>
</div>
<button type="submit">API ile Ödeme Oluştur</button>
</form>
<hr>
<h3>Diğer İşlemler</h3>
<ul>
<li><a href="/balance">Bakiye Görüntüle</a></li>
<li><a href="/rates">Döviz Kurları</a></li>
<li><a href="/commissions">Komisyon Oranları</a></li>
<li><a href="/notification-ips">Bildirim IP Adresleri</a></li>
<li><a href="/payments">Son Ödemeler</a></li>
</ul>
`);
});
// Form yöntemiyle ödeme oluşturma
app.post('/create-payment-form', async (req, res) => {
try {
const result = await quickPos.providers['anypay'].createPayment({
amount: req.body.amount,
currency: req.body.currency,
orderId: `ORDER${Date.now()}`,
desc: req.body.desc,
method: req.body.method,
email: req.body.email,
successUrl: `http://${req.headers.host}/success`,
failUrl: `http://${req.headers.host}/fail`,
notificationUrl: `http://${req.headers.host}/webhook/anypay`,
returnFormHtml: true // Form HTML'ini döndür
});
if (result.status === 'success') {
// HTML formunu doğrudan göster
console.log('Ödeme formu oluşturuldu');
res.send(`
<h1>AnyPay Ödeme Formu</h1>
<p>Sipariş No: ${result.data.pay_id}</p>
<div id="payment-form">${result.data.formHtml}</div>
<p><a href="/">Ana Sayfaya Dön</a></p>
<script>
// Form otomatik olarak gönderilsin
document.addEventListener('DOMContentLoaded', function() {
document.querySelector('form').submit();
});
</script>
`);
} else {
res.status(400).json({ error: 'Ödeme formu oluşturulamadı', details: result });
}
} catch (error) {
console.error('Ödeme hatası:', error);
res.status(500).json({ error: error.message });
}
});
// API yöntemiyle ödeme oluşturma
app.post('/create-payment-api', async (req, res) => {
try {
const result = await quickPos.providers['anypay'].createPayment({
amount: req.body.amount,
currency: req.body.currency,
orderId: `ORDER${Date.now()}`,
desc: req.body.desc,
method: req.body.method,
email: req.body.email,
successUrl: `http://${req.headers.host}/success`,
failUrl: `http://${req.headers.host}/fail`,
notificationUrl: `http://${req.headers.host}/webhook/anypay`,
useApi: true // API yöntemini kullan
});
if (result.status === 'success') {
console.log('API ile ödeme bağlantısı oluşturuldu:', result.data.url);
res.redirect(result.data.url);
} else {
res.status(400).json({ error: 'API ile ödeme oluşturulamadı', details: result });
}
} catch (error) {
console.error('API ödeme hatası:', error);
res.status(500).json({ error: error.message });
}
});
// Webhook işleme
app.post('/webhook/anypay', async (req, res) => {
try {
const notification = req.body;
const ipAddress = req.ip;
console.log('Webhook çağrısı alındı:', notification);
console.log('IP Adresi:', ipAddress);
// IP adresini kontrol et (isteğe bağlı)
const validIPs = ['185.162.128.38', '185.162.128.39', '185.162.128.88'];
if (!validIPs.includes(ipAddress)) {
console.warn('Uyarı: İstek bilinen bir Anypay IP adresinden gelmiyor');
}
// İmza doğrulaması
const isValid = quickPos.providers['anypay'].validateNotification(notification, ipAddress);
if (!isValid) {
console.error('Geçersiz imza veya IP adresi');
return res.status(400).send('Invalid signature or IP');
}
// İşlemi doğrula ve işle
const paymentResult = await quickPos.providers['anypay'].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}`);
// AnyPay başarılı yanıt bekliyor
res.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><a href="/">Ana Sayfaya Dön</a>');
});
// Başarısız ödeme sayfası
app.get('/fail', (req, res) => {
res.send('<h1>Ödeme işlemi başarısız oldu!</h1><a href="/">Tekrar Deneyin</a>');
});
// Bakiye sorgulama
app.get('/balance', async (req, res) => {
try {
const balance = await quickPos.providers['anypay'].getBalance();
res.json(balance);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Döviz kurları
app.get('/rates', async (req, res) => {
try {
const rates = await quickPos.providers['anypay'].getRates();
res.send(`
<h1>AnyPay Döviz Kurları</h1>
<h2>Giriş Kurları (In)</h2>
<pre>${JSON.stringify(rates.in, null, 2)}</pre>
<h2>Çıkış Kurları (Out)</h2>
<pre>${JSON.stringify(rates.out, null, 2)}</pre>
<p><a href="/">Ana Sayfaya Dön</a></p>
`);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Komisyon oranları
app.get('/commissions', async (req, res) => {
try {
const commissions = await quickPos.providers['anypay'].getCommissions();
res.send(`
<h1>AnyPay Komisyon Oranları</h1>
<pre>${JSON.stringify(commissions, null, 2)}</pre>
<p><a href="/">Ana Sayfaya Dön</a></p>
`);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Bildirim IP adresleri
app.get('/notification-ips', async (req, res) => {
try {
const ips = await quickPos.providers['anypay'].getNotificationIPs();
res.send(`
<h1>AnyPay Bildirim IP Adresleri</h1>
<p>Şu IP adreslerinden gelen bildirimler kabul edilmeli:</p>
<ul>
${ips.ip.map(ip => `<li>${ip}</li>`).join('')}
</ul>
<p><a href="/">Ana Sayfaya Dön</a></p>
`);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Ödemeleri listeleme
app.get('/payments', async (req, res) => {
try {
const payments = await quickPos.providers['anypay'].getPayments({
offset: 0,
count: 10
});
res.send(`
<h1>Son Ödemeler</h1>
<p>Toplam Ödeme: ${payments.total}</p>
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<th>İşlem ID</th>
<th>Sipariş ID</th>
<th>Tutar</th>
<th>Para Birimi</th>
<th>Durum</th>
<th>Tarih</th>
</tr>
${payments.payments.map(p => `
<tr>
<td>${p.transaction_id}</td>
<td>${p.pay_id}</td>
<td>${p.amount}</td>
<td>${p.currency}</td>
<td>${p.status}</td>
<td>${p.date}</td>
</tr>
`).join('')}
</table>
<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`);
});