Paylaşım Kanal Ayarlı PayTR Entegrasyonlu Bot

BloodyX

Seçkin madenci.
Forum Yöneticisi
Moderatör Şefi
Ayın En Çok Mesaj Atanı
Katılım
26 Şubat 2020
Mesajlar
74
En iyi cevaplar
1
Tepki puanı
15
Puanları
1,080
Discord.js kullanarak kanal ayarlı ürün satın alma sistemi oluşturabilir ve PayTR ödeme sistemi ile entegre edebilirsiniz. Bu, kullanıcıların ürün satın alma işlemlerini bir Discord botu üzerinden başlatmasına ve ödemenin başarıyla tamamlanıp tamamlanmadığını kontrol etmesine olanak tanır.


---

Çalışma Mantığı

1. Discord Üzerinden İşlem Başlatma:

Kullanıcı, botun komutuyla satın almak istediği ürünü seçer.

Bot, kullanıcı için bir ödeme bağlantısı oluşturur ve gönderir.



2. PayTR Ödeme Entegrasyonu:

PayTR API'si kullanılarak ödeme işlemi başlatılır.

Ödemenin başarılı olup olmadığını doğrulamak için PayTR'nin Bildirim API'si (IPN) kullanılır.



3. Satın Alma Tamamlama:

Ödeme başarılı olduğunda, kullanıcıya satın aldığı ürün verilir ve işlem logları Discord'da belirtilen kanala gönderilir.



Gereksinimler

1. Discord.js: Bot geliştirme için gerekli.

Kod:
npm install discord.js

2. Node.js: Bot için çalıştırma ortamı.


3. PayTR API Anahtarları:

PayTR hesabından API bilgilerinizi alın.



4. Express.js (IPN için):





---




---
Kod:
npm install express body-parser

JavaScript:
const { Client, Intents } = require('discord.js');
const axios = require('axios');
const express = require('express');
const bodyParser = require('body-parser');

const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] });

const app = express();
app.use(bodyParser.urlencoded({ extended: true }));

// Ayarlar
const ayarliKanal = 'urun-satin-alma'; // Ürün satın alma işlemlerinin yapılacağı kanal
const logKanal = 'log-kanali'; // İşlem loglarının gönderileceği kanal
const urunler = {
    "vip": { fiyat: 100, aciklama: "VIP Üyelik (1 Ay)" },
    "elmas": { fiyat: 50, aciklama: "50x Elmas" },
    "kılıç": { fiyat: 30, aciklama: "Keskinlik 5 Kılıç" }
};

// PayTR Ayarları
const merchant_id = 'MERCHANT_ID'; // PayTR mağaza ID
const merchant_key = 'MERCHANT_KEY'; // PayTR API Anahtar
const merchant_salt = 'MERCHANT_SALT'; // PayTR Salt Anahtarı

// Kullanıcı İşlemleri
const aktifIslemler = {}; // Kullanıcı işlemlerini takip etmek için

client.on('messageCreate', async (message) => {
    if (message.author.bot) return;

    const args = message.content.slice(1).trim().split(/ +/);
    const komut = args.shift().toLowerCase();

    // Ürün listesi komutu
    if (komut === 'urunler') {
        let urunListesi = "**Mevcut Ürünler:**\n";
        for (const [urun, detaylar] of Object.entries(urunler)) {
            urunListesi += `**${urun}** - ${detaylar.fiyat} TL (${detaylar.aciklama})\n`;
        }
        return message.reply(urunListesi);
    }

    // Ürün satın alma komutu
    if (komut === 'satinal') {
        if (message.channel.name !== ayarliKanal) {
            return message.reply(`❌ Bu komutu yalnızca **#${ayarliKanal}** kanalında kullanabilirsiniz.`);
        }

        const urunAdi = args[0];
        if (!urunAdi || !urunler[urunAdi]) {
            return message.reply("❌ Geçersiz ürün! `!urunler` komutuyla mevcut ürünleri görebilirsiniz.");
        }

        const urun = urunler[urunAdi];
        const userId = message.author.id;

        // PayTR Ödeme Linki Oluşturma
        const paymentData = {
            merchant_id,
            user_ip: message.author.client.ws.gateway, // Kullanıcının IP adresini alın
            merchant_oid: `DISCORD_${userId}_${Date.now()}`, // Benzersiz işlem ID
            email: `${message.author.username}@discord.com`,
            payment_amount: urun.fiyat * 100, // TL -> Kuruş dönüşümü
            currency: 'TRY',
            test_mode: 1, // Test modu için 1. Gerçek ödeme için 0.
            user_name: message.author.username,
            user_address: 'Discord Kullanıcısı',
            user_phone: '0000000000',
            merchant_ok_url: 'http://localhost:3000/odeme-basarili',
            merchant_fail_url: 'http://localhost:3000/odeme-basarisiz',
            timeout_limit: '30',
            debug_on: 1,
            lang: 'tr'
        };

        // PayTR API ile Ödeme Başlatma
        try {
            const response = await axios.post('https://www.paytr.com/odeme/api/get-token', paymentData, {
                headers: { 'Content-Type': 'application/json' }
            });

            if (response.data.status === 'success') {
                const paymentToken = response.data.token;
                const paymentUrl = `https://www.paytr.com/odeme/guvenli/${paymentToken}`;
                aktifIslemler[userId] = { urun: urunAdi, oid: paymentData.merchant_oid };

                message.reply(`✅ **${urunAdi}** ürünü için ödeme linkiniz oluşturuldu:\n${paymentUrl}`);
            } else {
                message.reply('❌ Ödeme işlemi başlatılamadı. Daha sonra tekrar deneyin.');
            }
        } catch (err) {
            console.error(err);
            message.reply('❌ Ödeme işlemi sırasında bir hata oluştu.');
        }
    }
});

// PayTR IPN (Ödeme Bildirimi)
app.post('/paytr-ipn', (req, res) => {
    const post = req.body;
    const hashStr = `${post.merchant_oid}${merchant_salt}${post.status}${post.total_amount}`;
    const calcHash = require('crypto').createHash('sha256').update(hashStr).digest('base64');

    if (post.hash !== calcHash) {
        return res.sendStatus(403); // Geçersiz hash
    }

    if (post.status === 'success') {
        const userId = post.merchant_oid.split('_')[1];
        const urunAdi = aktifIslemler[userId]?.urun;

        if (!urunAdi) return res.sendStatus(404);

        const logChannel = client.channels.cache.find(channel => channel.name === logKanal);
        if (logChannel) {
            logChannel.send(` **${userId}** adlı kullanıcı **${urunAdi}** ürününü başarıyla satın aldı.`);
        }

        delete aktifIslemler[userId];
        res.sendStatus(200);
    } else {
        res.sendStatus(400);
    }
});

// Bot ve IPN Başlatma
client.on('ready', () => {
    console.log(`${client.user.tag} başarıyla giriş yaptı!`);
    app.listen(3000, () => console.log('IPN sunucusu 3000 portunda çalışıyor.'));
});

client.login('YOUR_BOT_TOKEN');

Komutlar

1. !urunler

Mevcut ürünlerin listesini gösterir.



2. !satinal <ürün>

Seçilen ürün için ödeme linki oluşturur ve kullanıcıya gönderir.





---

Notlar

1. Güvenlik:

PayTR hash kontrolü ile işlemler doğrulanır.

Test modu için test_mode: 1 kullanılır. Gerçek ödemelerde 0 yapmayı unutmayın.



2. Loglama:

İşlem başarıyla tamamlandığında log kanalı belirtilir.



3. Yerel IPN Testi:

Yerel sunucuda test etmek için bir tünelleme aracı kullanabilirsiniz (ör. ngrok).
 

Üst