{"id":34761,"date":"2025-11-21T18:40:45","date_gmt":"2025-11-21T15:40:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34761"},"modified":"2025-11-21T18:40:45","modified_gmt":"2025-11-21T15:40:45","slug":"node-js-ve-express-ile-stripe-odemelerine-giris","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/","title":{"rendered":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f"},"content":{"rendered":"<p><body><\/p>\n<h2>Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f<\/h2>\n<p>Stripe, modern web uygulamalar\u0131nda \u00f6deme i\u015flemlerini entegre etmek i\u00e7in en pop\u00fcler ve g\u00fc\u00e7l\u00fc platformlardan biridir. Geli\u015ftiricilere sundu\u011fu esneklik, kapsaml\u0131 API&#8217;ler ve g\u00fc\u00e7l\u00fc g\u00fcvenlik \u00f6zellikleriyle, e-ticaret sitelerinden abonelik tabanl\u0131 hizmetlere kadar geni\u015f bir yelpazede finansal i\u015flemleri kolayca y\u00f6netmeyi sa\u011flar. Bu makalede, Node.js ve Express kullanarak bir web uygulamas\u0131nda Stripe \u00f6demelerini nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. Temel bir \u00f6deme ak\u0131\u015f\u0131ndan ba\u015flayarak, g\u00fcvenlik ipu\u00e7lar\u0131na ve en iyi uygulamalara kadar bir\u00e7ok konuya de\u011finece\u011fiz.<\/p>\n<h3>Stripe Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>Stripe, i\u015fletmelerin \u00e7evrimi\u00e7i \u00f6deme almas\u0131n\u0131 sa\u011flayan bir finansal altyap\u0131 platformudur. Kredi kart\u0131 i\u015flemleri, mobil \u00f6demeler, banka transferleri ve di\u011fer bir\u00e7ok \u00f6deme y\u00f6ntemini destekler. Geli\u015ftiriciler i\u00e7in tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc API&#8217;leri ve SDK&#8217;lar\u0131 sayesinde, \u00f6zel \u00f6deme deneyimleri olu\u015fturmak olduk\u00e7a basittir.<\/p>\n<p><strong>Stripe&#8217;\u0131n Ba\u015fl\u0131ca Avantajlar\u0131:<\/strong><\/p>\n<p>*   <strong>Geli\u015ftirici Dostu:<\/strong> Kapsaml\u0131 dok\u00fcmantasyon, zengin API&#8217;ler ve \u00e7e\u015fitli programlama dilleri i\u00e7in SDK&#8217;lar sunar. Node.js i\u00e7in \u00f6zel bir <code>stripe<\/code> paketi bulunur.<br \/>\n*   <strong>K\u00fcresel Destek:<\/strong> D\u00fcnya genelinde bir\u00e7ok para birimini ve \u00f6deme y\u00f6ntemini destekler.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> PCI DSS uyumlulu\u011fu, geli\u015fmi\u015f sahtekarl\u0131k tespiti (Radar) ve tokenizasyon gibi \u00f6zelliklerle \u00f6deme verilerini g\u00fcvende tutar. Hassas kart bilgileri hi\u00e7bir zaman sunucunuzda tutulmaz.<br \/>\n*   <strong>Esneklik:<\/strong> Tek seferlik \u00f6demelerden aboneliklere, pazar yeri \u00e7\u00f6z\u00fcmlerinden iadelere kadar geni\u015f bir yelpazede finansal i\u015flemi destekler.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> K\u00fc\u00e7\u00fck ba\u015flang\u0131\u00e7lardan b\u00fcy\u00fck kurumsal uygulamalara kadar her \u00f6l\u00e7ekteki i\u015fletme i\u00e7in uygundur.<br \/>\n*   <strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> \u00d6zelle\u015ftirilebilir \u00f6deme formlar\u0131 (Stripe Elements) ile sorunsuz bir kullan\u0131c\u0131 deneyimi sunar.<\/p>\n<p>Bu makalede, Stripe&#8217;\u0131n temel \u00f6deme ak\u0131\u015f\u0131n\u0131 Node.js ve Express ile nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 \u00f6\u011frenece\u011fiz.<\/p>\n<h3>Ba\u015flarken: Gerekli \u00d6n Haz\u0131rl\u0131klar<\/h3>\n<p>Stripe ile entegrasyona ba\u015flamadan \u00f6nce baz\u0131 temel ad\u0131mlar\u0131 tamamlamam\u0131z gerekiyor.<\/p>\n<h4>Stripe Hesab\u0131 Olu\u015fturma ve API Anahtarlar\u0131<\/h4>\n<p>\u0130lk olarak, bir Stripe hesab\u0131na ihtiyac\u0131n\u0131z var. Stripe&#8217;\u0131n web sitesine giderek (stripe.com) kolayca bir hesap olu\u015fturabilirsiniz. Hesap olu\u015fturduktan sonra, geli\u015ftirici panelinize eri\u015feceksiniz.<\/p>\n<p>Geli\u015ftirici panelinde, &#8220;Developers&#8221; (Geli\u015ftiriciler) men\u00fcs\u00fc alt\u0131nda &#8220;API keys&#8221; (API anahtarlar\u0131) b\u00f6l\u00fcm\u00fcn\u00fc bulacaks\u0131n\u0131z. Burada iki t\u00fcr anahtar bulunur:<\/p>\n<p>*   <strong>Publishable Key (Yay\u0131nlanabilir Anahtar):<\/strong> <code>pk_test_...<\/code> ile ba\u015flar. Bu anahtar, istemci taraf\u0131nda (taray\u0131c\u0131da) Stripe.js k\u00fct\u00fcphresi ile kullan\u0131l\u0131r. G\u00fcvenli bir \u015fekilde herkese a\u00e7\u0131k olabilir.<br \/>\n*   <strong>Secret Key (Gizli Anahtar):<\/strong> <code>sk_test_...<\/code> ile ba\u015flar. Bu anahtar, sunucu taraf\u0131nda (Node.js uygulaman\u0131zda) Stripe API \u00e7a\u011fr\u0131lar\u0131 yapmak i\u00e7in kullan\u0131l\u0131r. <strong>Bu anahtar kesinlikle gizli tutulmal\u0131 ve asla istemci taraf\u0131na if\u015fa edilmemelidir.<\/strong><\/p>\n<p>Geli\u015ftirme a\u015famas\u0131nda test anahtarlar\u0131n\u0131 kullanaca\u011f\u0131z. Canl\u0131ya ge\u00e7ti\u011finizde, canl\u0131 anahtarlar\u0131 kullanman\u0131z gerekecektir.<\/p>\n<h4>Geli\u015ftirme Ortam\u0131 Kurulumu<\/h4>\n<p>Node.js ve Express tabanl\u0131 bir uygulama geli\u015ftirece\u011fimiz i\u00e7in a\u015fa\u011f\u0131daki ara\u00e7lar\u0131n sisteminizde kurulu olmas\u0131 gerekir:<\/p>\n<p>1.  <strong>Node.js ve npm:<\/strong> Node.js&#8217;in resmi web sitesinden (nodejs.org) indirip kurabilirsiniz. npm (Node Package Manager) Node.js ile birlikte gelir.<br \/>\n2.  <strong>Metin D\u00fczenleyici\/IDE:<\/strong> VS Code, Sublime Text gibi bir d\u00fczenleyici kullanabilirsiniz.<\/p>\n<p>\u015eimdi projemizi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">mkdir stripe-payment-app\ncd stripe-payment-app\nnpm init -y<\/code><\/pre>\n<p>Bu komutlar, projemiz i\u00e7in bir dizin olu\u015fturacak ve <code>package.json<\/code> dosyas\u0131n\u0131 ba\u015flatacakt\u0131r.<\/p>\n<p>Gerekli paketleri kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npm install express stripe dotenv<\/code><\/pre>\n<p>*   <code>express<\/code>: Web sunucumuzu olu\u015fturmak i\u00e7in.<br \/>\n*   <code>stripe<\/code>: Stripe API ile etkile\u015fim kurmak i\u00e7in resmi Node.js k\u00fct\u00fcphanesi.<br \/>\n*   <code>dotenv<\/code>: API anahtarlar\u0131m\u0131z\u0131 ve di\u011fer hassas bilgileri g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in ortam de\u011fi\u015fkenlerini kullanmam\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Temel Stripe \u00d6deme Ak\u0131\u015f\u0131<\/h3>\n<p>Stripe ile tek seferlik bir \u00f6deme i\u015flemi genellikle a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<p>1.  <strong>M\u00fc\u015fteri Taraf\u0131 (Frontend):<\/strong><br \/>\n    *   M\u00fc\u015fteri, uygulaman\u0131zdaki bir \u00f6deme formuna kart bilgilerini girer.<br \/>\n    *   Stripe.js k\u00fct\u00fcphanesi, bu kart bilgilerini do\u011frudan Stripe&#8217;a g\u00f6nderir ve hassas bilgileri sunucunuza asla dokundurmadan bir &#8220;Payment Method&#8221; veya &#8220;Token&#8221; olu\u015fturur.<br \/>\n    *   Bu g\u00fcvenli referans (Payment Method ID veya Token ID) sunucunuza g\u00f6nderilir.<br \/>\n2.  <strong>Sunucu Taraf\u0131 (Backend):<\/strong><br \/>\n    *   Sunucunuz, istemciden gelen Payment Method ID&#8217;sini al\u0131r.<br \/>\n    *   Stripe Node.js k\u00fct\u00fcphanesini kullanarak, bu Payment Method ID&#8217;si ve \u00f6deme miktar\u0131 ile bir &#8220;Payment Intent&#8221; (\u00d6deme Niyeti) olu\u015fturur.<br \/>\n    *   Stripe, \u00f6deme i\u015flemini ger\u00e7ekle\u015ftirmeye \u00e7al\u0131\u015f\u0131r. Baz\u0131 durumlarda ek kimlik do\u011frulama (3D Secure gibi) gerekebilir.<br \/>\n    *   Sunucunuz, \u00f6deme i\u015fleminin sonucunu (ba\u015far\u0131l\u0131, ba\u015far\u0131s\u0131z, ek do\u011frulama gerekli) istemciye bildirir.<br \/>\n3.  <strong>M\u00fc\u015fteri Taraf\u0131 (Frontend &#8211; Devam):<\/strong><br \/>\n    *   E\u011fer ek do\u011frulama gerekiyorsa, Stripe.js bu do\u011frulamay\u0131 y\u00f6netir ve \u00f6deme ak\u0131\u015f\u0131n\u0131 tamamlar.<br \/>\n    *   \u00d6deme ba\u015far\u0131l\u0131 olduktan sonra, m\u00fc\u015fteriye onay mesaj\u0131 g\u00f6sterilir.<\/p>\n<h3>M\u00fc\u015fteri Taraf\u0131 Entegrasyonu (Frontend)<\/h3>\n<p>M\u00fc\u015fteri taraf\u0131nda, \u00f6deme formunu olu\u015fturmak ve kart bilgilerini g\u00fcvenli bir \u015fekilde Stripe&#8217;a g\u00f6ndermek i\u00e7in Stripe.js k\u00fct\u00fcphanesini kullan\u0131r\u0131z.<\/p>\n<h4>Stripe.js Y\u00fckleme ve Elemanlar<\/h4>\n<p><code>index.html<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m (veya React, Vue gibi bir frontend framework kullan\u0131yorsan\u0131z ilgili bile\u015feninizde).<\/p>\n<pre><code class=\"language-html\"><!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Stripe \u00d6deme Sayfas\u0131<\/title>\n    <script src=\"https:\/\/js.stripe.com\/v3\/\"><\/script>\n    <style>\n        body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f7f6; }\n        .container { max-width: 500px; margin: 0 auto; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }\n        h1 { text-align: center; color: #333; margin-bottom: 30px; }\n        .form-group { margin-bottom: 20px; }\n        label { display: block; margin-bottom: 8px; font-weight: bold; color: #555; }\n        .StripeElement {\n            box-sizing: border-box;\n            height: 40px;\n            padding: 10px 12px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            background-color: white;\n            box-shadow: 0 1px 3px 0 #e6ebf1;\n            -webkit-transition: box-shadow 150ms ease;\n            transition: box-shadow 150ms ease;\n        }\n        .StripeElement--focus {\n            box-shadow: 0 1px 3px 0 #cfd7df;\n        }\n        .StripeElement--invalid {\n            border-color: #fa755a;\n        }\n        .StripeElement--webkit-autofill {\n            background-color: #fefde5 !important;\n        }\n        button {\n            background-color: #6772e5;\n            color: white;\n            padding: 12px 20px;\n            border: none;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 16px;\n            width: 100%;\n            transition: background-color 0.3s ease;\n        }\n        button:hover {\n            background-color: #5469d4;\n        }\n        #card-errors {\n            color: #fa755a;\n            margin-top: 10px;\n            text-align: center;\n        }\n        #payment-status {\n            margin-top: 20px;\n            font-weight: bold;\n            text-align: center;\n        }\n        .success { color: green; }\n        .error { color: red; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        \n        <form id=\"payment-form\">\n            <div class=\"form-group\">\n                <label for=\"card-element\">Kredi Kart\u0131 Bilgileri<\/label>\n                <div id=\"card-element\" class=\"StripeElement\">\n                    <!-- Stripe Elements burada kart bilgilerini otomatik olarak yerle\u015ftirecek -->\n                <\/div>\n                <div id=\"card-errors\" role=\"alert\"><\/div>\n            <\/div>\n            <button type=\"submit\">\u00d6deme Yap (10.00 TL)<\/button>\n            <div id=\"payment-status\"><\/div>\n        <\/form>\n    <\/div>\n\n    <script>\n        const stripe = Stripe('YOUR_STRIPE_PUBLISHABLE_KEY'); \/\/ Kendi yay\u0131nlanabilir anahtar\u0131n\u0131z\u0131 buraya ekleyin\n        const elements = stripe.elements();\n\n        \/\/ Kart eleman\u0131n\u0131 olu\u015ftur ve 'card-element' div'ine ba\u011fla\n        const card = elements.create('card', {\n            style: {\n                base: {\n                    iconColor: '#666EE8',\n                    color: '#313259',\n                    fontWeight: '300',\n                    fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\n                    fontSize: '18px',\n                    '::placeholder': {\n                        color: '#CFD7E0',\n                    },\n                },\n                invalid: {\n                    iconColor: '#FA755A',\n                    color: '#FA755A',\n                }\n            }\n        });\n        card.mount('#card-element');\n\n        \/\/ Kart eleman\u0131ndaki hatalar\u0131 dinle\n        card.on('change', function(event) {\n            const displayError = document.getElementById('card-errors');\n            if (event.error) {\n                displayError.textContent = event.error.message;\n            } else {\n                displayError.textContent = '';\n            }\n        });\n\n        const form = document.getElementById('payment-form');\n        const paymentStatus = document.getElementById('payment-status');\n\n        form.addEventListener('submit', async function(event) {\n            event.preventDefault();\n            paymentStatus.textContent = '\u00d6deme i\u015fleniyor...';\n            paymentStatus.className = '';\n\n            \/\/ Sunucudan bir Payment Intent olu\u015fturma iste\u011fi g\u00f6nder\n            const response = await fetch('\/create-payment-intent', {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json'\n                },\n                body: JSON.stringify({ amount: 1000 }) \/\/ 1000 kuru\u015f = 10 TL\n            });\n            const { clientSecret, error: backendError } = await response.json();\n\n            if (backendError) {\n                paymentStatus.textContent = backendError.message;\n                paymentStatus.className = 'error';\n                return;\n            }\n\n            \/\/ Payment Intent'i kart bilgileriyle onayla\n            const { paymentIntent, error } = await stripe.confirmCardPayment(clientSecret, {\n                payment_method: {\n                    card: card,\n                    billing_details: {\n                        name: 'Deneme M\u00fc\u015fteri', \/\/ Buraya ger\u00e7ek m\u00fc\u015fteri ad\u0131 gelebilir\n                    },\n                },\n            });\n\n            if (error) {\n                \/\/ Hata olu\u015ftu\n                paymentStatus.textContent = error.message;\n                paymentStatus.className = 'error';\n            } else if (paymentIntent.status === 'succeeded') {\n                \/\/ \u00d6deme ba\u015far\u0131l\u0131!\n                paymentStatus.textContent = '\u00d6deme ba\u015far\u0131yla tamamland\u0131!';\n                paymentStatus.className = 'success';\n                console.log('Payment Intent:', paymentIntent);\n            } else {\n                paymentStatus.textContent = <code>\u00d6deme durumu: ${paymentIntent.status}. L\u00fctfen tekrar deneyin.<\/code>;\n                paymentStatus.className = 'error';\n            }\n        });\n    <\/script>\n<\/body>\n<\/html><\/code><\/pre>\n<p>Yukar\u0131daki kodda <code>YOUR_STRIPE_PUBLISHABLE_KEY<\/code> k\u0131sm\u0131n\u0131 kendi Stripe yay\u0131nlanabilir anahtar\u0131n\u0131zla de\u011fi\u015ftirmeniz gerekmektedir.<\/p>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>Stripe(YOUR_STRIPE_PUBLISHABLE_KEY)<\/code>: Stripe.js k\u00fct\u00fcphanesini yay\u0131nlanabilir anahtar\u0131n\u0131zla ba\u015flat\u0131r.<br \/>\n*   <code>elements.create('card')<\/code>: Kart numaras\u0131, son kullanma tarihi ve CVC alanlar\u0131n\u0131 i\u00e7eren entegre bir UI bile\u015feni olan &#8220;Card Element&#8221; olu\u015fturur. Bu, PCI DSS uyumlulu\u011funu sa\u011flaman\u0131n en kolay yoludur, \u00e7\u00fcnk\u00fc hassas kart bilgileri do\u011frudan Stripe&#8217;a g\u00f6nderilir.<br \/>\n*   <code>card.mount('#card-element')<\/code>: Olu\u015fturulan Card Element&#8217;i HTML&#8217;deki belirli bir <code>div<\/code> elementine ba\u011flar.<br \/>\n*   <code>form.addEventListener('submit')<\/code>: Form g\u00f6nderildi\u011finde tetiklenen bir olay dinleyicisi ekler.<br \/>\n*   <code>fetch('\/create-payment-intent', ...)<\/code>: \u00d6deme i\u015flemi i\u00e7in sunucumuza bir istek g\u00f6nderir. Bu istek sonucunda sunucu, Stripe API&#8217;yi kullanarak bir Payment Intent olu\u015fturur ve <code>clientSecret<\/code> de\u011ferini geri d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>stripe.confirmCardPayment(clientSecret, { payment_method: { card: card, ... } })<\/code>: Stripe.js&#8217;in en kritik fonksiyonlar\u0131ndan biridir. Sunucudan al\u0131nan <code>clientSecret<\/code> ve Card Element&#8217;ten al\u0131nan kart bilgileri ile \u00f6deme i\u015flemini onaylamaya \u00e7al\u0131\u015f\u0131r. Gerekirse 3D Secure gibi ek do\u011frulamalar\u0131 otomatik olarak y\u00f6netir.<\/p>\n<h3>Sunucu Taraf\u0131 Entegrasyonu (Backend &#8211; Node.js\/Express)<\/h3>\n<p>\u015eimdi s\u0131ra sunucu taraf\u0131na geldi. Burada <code>express<\/code> ile bir web sunucusu kuracak, <code>dotenv<\/code> ile API anahtarlar\u0131m\u0131z\u0131 g\u00fcvenli bir \u015fekilde y\u00f6netecek ve <code>stripe<\/code> paketi ile Stripe API \u00e7a\u011fr\u0131lar\u0131 yapaca\u011f\u0131z.<\/p>\n<p><code>server.js<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">require('dotenv').config(); \/\/ Ortam de\u011fi\u015fkenlerini .env dosyas\u0131ndan y\u00fckle\n\nconst express = require('express');\nconst stripe = require('stripe')(process.env.STRIPE_SECRET_KEY); \/\/ Gizli anahtar\u0131m\u0131z\u0131 .env'den al\nconst path = require('path');\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\n\/\/ Middleware'ler\napp.use(express.json()); \/\/ JSON istek g\u00f6vdelerini ayr\u0131\u015ft\u0131rmak i\u00e7in\napp.use(express.static('public')); \/\/ Frontend dosyalar\u0131m\u0131z\u0131 sunmak i\u00e7in (index.html)\n\n\/\/ Ana dizine yap\u0131lan isteklerde index.html dosyas\u0131n\u0131 g\u00f6nder\napp.get('\/', (req, res) => {\n    res.sendFile(path.join(__dirname, 'public', 'index.html'));\n});\n\n\/\/ \u00d6deme niyeti (Payment Intent) olu\u015fturma endpoint'i\napp.post('\/create-payment-intent', async (req, res) => {\n    const { amount } = req.body; \/\/ \u0130stemciden gelen miktar (kuru\u015f cinsinden)\n\n    try {\n        const paymentIntent = await stripe.paymentIntents.create({\n            amount: amount, \/\/ \u00d6deme miktar\u0131 (en k\u00fc\u00e7\u00fck birim, \u00f6rn. 1000 kuru\u015f = 10 TL)\n            currency: 'try', \/\/ T\u00fcrk Liras\u0131\n            payment_method_types: ['card'], \/\/ Desteklenen \u00f6deme y\u00f6ntemleri\n            \/\/ description: 'Test \u00fcr\u00fcn sat\u0131n alma', \/\/ Opsiyonel\n            \/\/ metadata: { order_id: '12345' }, \/\/ Opsiyonel: Kendi verilerinizi ekleyebilirsiniz\n        });\n\n        res.status(200).json({\n            clientSecret: paymentIntent.client_secret\n        });\n    } catch (error) {\n        console.error('Error creating payment intent:', error);\n        res.status(500).json({ error: { message: error.message } });\n    }\n});\n\n\/\/ Webhook endpoint'i (Opsiyonel ama \u00f6nemlidir)\n\/\/ Stripe, \u00f6deme durumu g\u00fcncellemelerini bu endpoint'e g\u00f6nderir\napp.post('\/webhook', express.raw({type: 'application\/json'}), async (req, res) => {\n    const sig = req.headers['stripe-signature'];\n    let event;\n\n    try {\n        \/\/ Webhook imzas\u0131n\u0131 do\u011frulayarak iste\u011fin Stripe'tan geldi\u011finden emin ol\n        event = stripe.webhooks.constructEvent(req.body, sig, process.env.STRIPE_WEBHOOK_SECRET);\n    } catch (err) {\n        console.error('Webhook signature verification failed.', err.message);\n        return res.status(400).send(<code>Webhook Error: ${err.message}<\/code>);\n    }\n\n    \/\/ Olay t\u00fcr\u00fcne g\u00f6re i\u015flem yap\n    switch (event.type) {\n        case 'payment_intent.succeeded':\n            const paymentIntentSucceeded = event.data.object;\n            console.log(<code>PaymentIntent for ${paymentIntentSucceeded.amount} was successful!<\/code>);\n            \/\/ Sipari\u015finizi veritaban\u0131nda g\u00fcncelleyin, m\u00fc\u015fteriye e-posta g\u00f6nderin vb.\n            break;\n        case 'payment_intent.payment_failed':\n            const paymentIntentFailed = event.data.object;\n            console.log(<code>PaymentIntent for ${paymentIntentFailed.amount} failed! Reason: ${paymentIntentFailed.last_payment_error?.message}<\/code>);\n            \/\/ M\u00fc\u015fteriye hata bildirimi yap\u0131n, sipari\u015f durumunu g\u00fcncelleyin vb.\n            break;\n        \/\/ Di\u011fer olay t\u00fcrlerini burada i\u015fleyebilirsiniz (\u00f6rn. charge.refunded)\n        default:\n            console.log(<code>Unhandled event type ${event.type}<\/code>);\n    }\n\n    \/\/ Stripe'a ba\u015far\u0131l\u0131 yan\u0131t g\u00f6nder\n    res.status(200).json({ received: true });\n});\n\n\n\/\/ Sunucuyu ba\u015flat\napp.listen(PORT, () => {\n    console.log(<code>Sunucu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p><code>public<\/code> ad\u0131nda bir klas\u00f6r olu\u015fturun ve <code>index.html<\/code> dosyas\u0131n\u0131 bu klas\u00f6r\u00fcn i\u00e7ine ta\u015f\u0131y\u0131n.<\/p>\n<p>\u015eimdi bir <code>.env<\/code> dosyas\u0131 olu\u015ftural\u0131m ve Stripe API anahtarlar\u0131m\u0131z\u0131 buraya ekleyelim:<\/p>\n<pre><code class=\"language-\">STRIPE_SECRET_KEY=sk_test_YOUR_SECRET_KEY\nSTRIPE_PUBLISHABLE_KEY=pk_test_YOUR_PUBLISHABLE_KEY\nSTRIPE_WEBHOOK_SECRET=whsec_YOUR_WEBHOOK_SECRET\nPORT=3000<\/code><\/pre>\n<p><code>STRIPE_SECRET_KEY<\/code> ve <code>STRIPE_PUBLISHABLE_KEY<\/code> yerine kendi anahtarlar\u0131n\u0131z\u0131 girin. <code>STRIPE_WEBHOOK_SECRET<\/code> anahtar\u0131n\u0131 daha sonra Stripe panelinden alaca\u011f\u0131z.<\/p>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <code>require('dotenv').config()<\/code>: <code>.env<\/code> dosyas\u0131ndaki de\u011fi\u015fkenleri <code>process.env<\/code> objesine y\u00fckler.<br \/>\n*   <code>stripe = require('stripe')(process.env.STRIPE_SECRET_KEY)<\/code>: Stripe k\u00fct\u00fcphanesini gizli anahtar\u0131m\u0131zla ba\u015flat\u0131r.<br \/>\n*   <code>app.use(express.json())<\/code>: Express&#8217;in gelen JSON istek g\u00f6vdelerini ayr\u0131\u015ft\u0131rmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>app.use(express.static('public'))<\/code>: <code>public<\/code> klas\u00f6r\u00fcndeki statik dosyalar\u0131 (\u00f6rn. <code>index.html<\/code>) sunucudan eri\u015filebilir hale getirir.<br \/>\n*   <code>\/create-payment-intent<\/code> endpoint&#8217;i:<br \/>\n    *   \u0130stemciden gelen <code>amount<\/code> de\u011ferini al\u0131r.<br \/>\n    *   <code>stripe.paymentIntents.create()<\/code> fonksiyonu ile bir Payment Intent olu\u015fturur. <code>amount<\/code> de\u011feri, Stripe API&#8217;sinde en k\u00fc\u00e7\u00fck para birimi cinsinden (\u00f6rn. 1000 kuru\u015f = 10 TL) belirtilmelidir.<br \/>\n    *   Olu\u015fturulan Payment Intent&#8217;in <code>client_secret<\/code> de\u011ferini istemciye geri g\u00f6nderir. Bu de\u011fer, istemcinin \u00f6deme i\u015flemini tamamlamas\u0131 i\u00e7in gereklidir.<br \/>\n*   <code>\/webhook<\/code> endpoint&#8217;i:<br \/>\n    *   Bu endpoint, Stripe taraf\u0131ndan \u00f6deme durum g\u00fcncellemelerini almak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>stripe.webhooks.constructEvent()<\/code> fonksiyonu ile gelen iste\u011fin Stripe&#8217;tan geldi\u011fi do\u011frulan\u0131r. Bu, g\u00fcvenlik i\u00e7in kritik bir ad\u0131md\u0131r.<br \/>\n    *   <code>event.type<\/code>&#8216;a g\u00f6re farkl\u0131 i\u015flemler yap\u0131l\u0131r. \u00d6rne\u011fin, <code>payment_intent.succeeded<\/code> olay\u0131 tetiklendi\u011finde, veritaban\u0131n\u0131zdaki sipari\u015fin durumunu g\u00fcncelleyebilir, m\u00fc\u015fteriye onay e-postas\u0131 g\u00f6nderebilirsiniz.<\/p>\n<p><strong>Webhooks Kurulumu:<\/strong><\/p>\n<p>Webhook&#8217;lar, uygulaman\u0131z\u0131n \u00f6deme ak\u0131\u015f\u0131ndaki asenkron olaylar\u0131 (\u00f6rn. \u00f6demenin ba\u015far\u0131l\u0131 olmas\u0131, iade edilmesi) g\u00fcvenilir bir \u015fekilde takip etmesi i\u00e7in hayati \u00f6neme sahiptir.<br \/>\nGeli\u015ftirme ortam\u0131nda webhook&#8217;lar\u0131 test etmek i\u00e7in <code>stripe listen<\/code> komutunu kullanabilirsiniz.<\/p>\n<p>1.  <strong>Stripe CLI&#8217;\u0131 Kurun:<\/strong> [https:\/\/stripe.com\/docs\/stripe-cli](https:\/\/stripe.com\/docs\/stripe-cli) adresinden Stripe CLI&#8217;\u0131 indirip kurun.<br \/>\n2.  <strong>Giri\u015f Yap\u0131n:<\/strong> Terminalinizde <code>stripe login<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n ve talimatlar\u0131 izleyerek Stripe hesab\u0131n\u0131za giri\u015f yap\u0131n.<br \/>\n3.  <strong>Webhook Dinlemeye Ba\u015flay\u0131n:<\/strong> <code>server.js<\/code> dosyan\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 dizinde yeni bir terminal a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">stripe listen --forward-to localhost:3000\/webhook<\/code><\/pre>\n<p>    Bu komut, Stripe&#8217;tan gelen webhook olaylar\u0131n\u0131 <code>localhost:3000\/webhook<\/code> adresine iletecektir. Komut \u00e7al\u0131\u015ft\u0131ktan sonra size bir <code>whsec_...<\/code> ile ba\u015flayan &#8220;Webhook secret&#8221; verecektir. Bu anahtar\u0131 <code>.env<\/code> dosyan\u0131zdaki <code>STRIPE_WEBHOOK_SECRET<\/code> de\u011fi\u015fkenine ekleyin.<\/p>\n<p>Art\u0131k her \u015fey haz\u0131r! Projenizi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalde <code>node server.js<\/code> komutunu kullanabilirsiniz. Ard\u0131ndan taray\u0131c\u0131n\u0131zdan <code>http:\/\/localhost:3000<\/code> adresine gidin.<\/p>\n<p><strong>Test Kartlar\u0131:<\/strong><\/p>\n<p>Stripe, test ortam\u0131nda kullanabilece\u011finiz \u00f6zel kart numaralar\u0131 sa\u011flar. Bu kartlarla ger\u00e7ek para harcamadan \u00f6deme ak\u0131\u015f\u0131n\u0131 test edebilirsiniz.<br \/>\n\u00d6rne\u011fin:<br \/>\n*   Ba\u015far\u0131l\u0131 bir \u00f6deme i\u00e7in: <code>4242 4242 4242 4242<\/code> (herhangi bir gelecek tarih ve CVC ile)<br \/>\n*   Ba\u015far\u0131s\u0131z bir \u00f6deme i\u00e7in: <code>4000 0000 0000 0002<\/code> (yetersiz bakiye)<br \/>\nDaha fazla test kart\u0131 i\u00e7in Stripe dok\u00fcmantasyonuna bakabilirsiniz.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Temel \u00f6deme ak\u0131\u015f\u0131n\u0131 kurduktan sonra, uygulaman\u0131z\u0131n daha sa\u011flam ve kullan\u0131c\u0131 dostu olmas\u0131 i\u00e7in baz\u0131 geli\u015fmi\u015f konular\u0131 ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z.<\/p>\n<h4>M\u00fc\u015fteri Y\u00f6netimi (Customers API)<\/h4>\n<p>Tekrar eden m\u00fc\u015fteriler i\u00e7in her \u00f6demede kart bilgilerini tekrar istemek yerine, Stripe&#8217;\u0131n M\u00fc\u015fteri API&#8217;sini kullanabilirsiniz. Bir m\u00fc\u015fteri ilk kez \u00f6deme yapt\u0131\u011f\u0131nda, onun i\u00e7in bir <code>Customer<\/code> objesi olu\u015fturabilir ve \u00f6deme y\u00f6ntemini bu m\u00fc\u015fteriye ba\u011flayabilirsiniz. Gelecekteki \u00f6demelerde sadece <code>Customer ID<\/code> ve kay\u0131tl\u0131 \u00f6deme y\u00f6ntemini kullanarak h\u0131zl\u0131ca i\u015flem yapabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek: M\u00fc\u015fteri olu\u015fturma ve \u00f6deme y\u00f6ntemini ba\u011flama\nconst customer = await stripe.customers.create({\n    email: 'customer@example.com',\n    name: 'Deneme M\u00fc\u015fteri',\n    payment_method: 'pm_card_visa', \/\/ \u0130stemciden gelen Payment Method ID\n    invoice_settings: { default_payment_method: 'pm_card_visa' },\n});\n\n\/\/ \u00d6rnek: Kay\u0131tl\u0131 m\u00fc\u015fteriden \u00f6deme alma\nconst paymentIntent = await stripe.paymentIntents.create({\n    amount: 2000,\n    currency: 'try',\n    customer: customer.id, \/\/ Kay\u0131tl\u0131 m\u00fc\u015fterinin ID'si\n    payment_method: 'pm_card_visa', \/\/ M\u00fc\u015fteriye ba\u011fl\u0131 \u00f6deme y\u00f6ntemi ID'si\n    off_session: true, \/\/ M\u00fc\u015fteri oturum d\u0131\u015f\u0131 \u00f6deme yap\u0131yor\n    confirm: true,\n});<\/code><\/pre>\n<h4>Abonelikler (Subscriptions)<\/h4>\n<p>Stripe, abonelik tabanl\u0131 hizmetler i\u00e7in g\u00fc\u00e7l\u00fc bir API sunar. \u00dcr\u00fcnler (Products) ve Fiyatland\u0131rmalar (Prices) tan\u0131mlayarak, m\u00fc\u015fterileri belirli bir plana abone edebilir ve d\u00fczenli \u00f6demeleri otomatik olarak tahsil edebilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek: Abonelik olu\u015fturma\nconst subscription = await stripe.subscriptions.create({\n    customer: 'cus_xyz', \/\/ M\u00fc\u015fteri ID'si\n    items: [{ price: 'price_abc' }], \/\/ Fiyatland\u0131rma ID'si\n    expand: ['latest_invoice.payment_intent'],\n});<\/code><\/pre>\n<h4>\u0130ade \u0130\u015flemleri (Refunds)<\/h4>\n<p>M\u00fc\u015fteri memnuniyeti i\u00e7in iade i\u015flemleri de \u00f6nemlidir. Stripe API \u00fczerinden kolayca iade yapabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek: Tam iade\nconst refund = await stripe.refunds.create({\n    payment_intent: 'pi_xyz', \/\/ \u0130ade edilecek Payment Intent ID'si\n});\n\n\/\/ \u00d6rnek: K\u0131smi iade\nconst partialRefund = await stripe.refunds.create({\n    payment_intent: 'pi_xyz',\n    amount: 500, \/\/ 5 TL iade\n});<\/code><\/pre>\n<h4>G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h4>\n<p>*   <strong>API Anahtarlar\u0131n\u0131 G\u00fcvende Tutun:<\/strong> Gizli anahtarlar\u0131n\u0131z\u0131 asla istemci taraf\u0131na if\u015fa etmeyin ve ortam de\u011fi\u015fkenleri (<code>.env<\/code>) kullanarak y\u00f6netin. Git&#8217;e <code>.env<\/code> dosyas\u0131n\u0131 dahil etmeyin (<code>.gitignore<\/code> kullan\u0131n).<br \/>\n*   <strong>HTTPS Kullan\u0131n:<\/strong> Canl\u0131 ortamda t\u00fcm ileti\u015fim HTTPS \u00fczerinden yap\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>Webhook \u0130mza Do\u011frulamas\u0131:<\/strong> Webhook endpoint&#8217;inize gelen isteklerin ger\u00e7ekten Stripe&#8217;tan geldi\u011fini do\u011frulamak i\u00e7in imza kontrol\u00fcn\u00fc mutlaka kullan\u0131n. Bu, k\u00f6t\u00fc niyetli ki\u015filerin sahte olaylar g\u00f6ndererek uygulaman\u0131z\u0131 manip\u00fcle etmesini engeller.<br \/>\n*   <strong>PCI DSS Uyumlulu\u011fu:<\/strong> Stripe.js Elemanlar\u0131&#8217;n\u0131 kullanarak hassas kart bilgilerini do\u011frudan Stripe&#8217;a g\u00f6nderdi\u011finizden emin olun. Kendi sunucunuzda kart bilgileri depolamaktan ka\u00e7\u0131n\u0131n.<br \/>\n*   <strong>Idempotency Keys:<\/strong> \u00d6zellikle \u00f6deme olu\u015fturma gibi i\u015flemlerde, ayn\u0131 iste\u011fin birden fazla kez i\u015flenmesini \u00f6nlemek i\u00e7in Idempotency Keys kullan\u0131n. Bu, a\u011f sorunlar\u0131 veya zaman a\u015f\u0131m\u0131 durumunda ayn\u0131 i\u015flemi tekrar g\u00f6ndermeniz gerekti\u011finde, i\u015flemin sadece bir kez ger\u00e7ekle\u015fmesini sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek: Idempotency Key kullan\u0131m\u0131\nconst paymentIntent = await stripe.paymentIntents.create({\n    amount: 1000,\n    currency: 'try',\n    \/\/ ... di\u011fer parametreler\n}, {\n    idempotencyKey: 'unique_order_id_123' \/\/ Her istek i\u00e7in benzersiz bir anahtar\n});<\/code><\/pre>\n<h4>Test S\u00fcreci<\/h4>\n<p>*   <strong>Test Anahtarlar\u0131:<\/strong> Geli\u015ftirme ve test a\u015famas\u0131nda daima test anahtarlar\u0131n\u0131z\u0131 kullan\u0131n.<br \/>\n*   <strong>Test Kartlar\u0131:<\/strong> Stripe&#8217;\u0131n sa\u011flad\u0131\u011f\u0131 \u00e7e\u015fitli test kartlar\u0131n\u0131 kullanarak ba\u015far\u0131l\u0131, ba\u015far\u0131s\u0131z, 3D Secure gerektiren senaryolar\u0131 test edin.<br \/>\n*   <strong>Stripe CLI ve Webhook&#8217;lar:<\/strong> Webhook&#8217;lar\u0131n\u0131z\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in Stripe CLI&#8217;\u0131 kullanarak olaylar\u0131 sim\u00fcle edin.<br \/>\n*   <strong>Stripe Dashboard:<\/strong> Geli\u015ftirici panelindeki g\u00fcnl\u00fckleri ve olaylar\u0131 inceleyerek i\u015flemlerinizi takip edin ve hatalar\u0131 ay\u0131klay\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Node.js ve Express kullanarak Stripe \u00f6demelerini bir web uygulamas\u0131na nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frendik. Stripe.js ile istemci taraf\u0131 entegrasyonundan, Node.js ile sunucu taraf\u0131nda Payment Intent olu\u015fturmaya ve webhook&#8217;lar\u0131 i\u015flemeye kadar temel bir \u00f6deme ak\u0131\u015f\u0131n\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde kurduk.<\/p>\n<p>Stripe, sundu\u011fu zengin API&#8217;ler, g\u00fc\u00e7l\u00fc g\u00fcvenlik \u00f6nlemleri ve kapsaml\u0131 dok\u00fcmantasyon ile geli\u015ftiricilerin \u00f6deme \u00e7\u00f6z\u00fcmleri olu\u015fturmas\u0131n\u0131 son derece kolayla\u015ft\u0131r\u0131r. Tek seferlik \u00f6demelerin \u00f6tesinde, abonelikler, m\u00fc\u015fteri y\u00f6netimi, iadeler ve \u00e7ok daha fazlas\u0131 i\u00e7in geni\u015f olanaklar sunar. Uygulaman\u0131z\u0131n gereksinimlerine g\u00f6re bu geli\u015fmi\u015f \u00f6zellikleri ke\u015ffetmek, daha sa\u011flam ve esnek bir \u00f6deme sistemi olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>Unutmay\u0131n, canl\u0131ya ge\u00e7meden \u00f6nce t\u00fcm g\u00fcvenlik \u00f6nlemlerini ald\u0131\u011f\u0131n\u0131zdan, test senaryolar\u0131n\u0131z\u0131 titizlikle uygulad\u0131\u011f\u0131n\u0131zdan ve PCI DSS uyumlulu\u011funu sa\u011flad\u0131\u011f\u0131n\u0131zdan emin olun. \u0130yi kodlamalar!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f\nStripe, modern web uygulamalar\u0131nda \u00f6deme i\u015flemlerini entegre etmek i\u00e7in en pop\u00fcler ve g\u00fc\u00e7l\u00fc","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[136],"tags":[],"class_list":{"0":"post-34761","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f\" \/>\n<meta property=\"og:description\" content=\"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f Stripe, modern web uygulamalar\u0131nda \u00f6deme i\u015flemlerini entegre etmek i\u00e7in en pop\u00fcler ve g\u00fc\u00e7l\u00fc\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-21T15:40:45+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f\",\"datePublished\":\"2025-11-21T15:40:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/\"},\"wordCount\":2080,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/\",\"name\":\"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-21T15:40:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f","og_description":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f Stripe, modern web uygulamalar\u0131nda \u00f6deme i\u015flemlerini entegre etmek i\u00e7in en pop\u00fcler ve g\u00fc\u00e7l\u00fc","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-21T15:40:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f","datePublished":"2025-11-21T15:40:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/"},"wordCount":2080,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/","name":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-21T15:40:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ve-express-ile-stripe-odemelerine-giris\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js ve Express ile Stripe \u00d6demelerine Giri\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34761"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34761\/revisions"}],"predecessor-version":[{"id":34762,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34761\/revisions\/34762"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}