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
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`);
});