{"id":32885,"date":"2025-10-27T01:31:21","date_gmt":"2025-10-26T22:31:21","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/"},"modified":"2025-10-27T01:31:21","modified_gmt":"2025-10-26T22:31:21","slug":"mtn-mobile-money-php-entegrasyonu-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/","title":{"rendered":"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Afrika&#8217;n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN&#8217;in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital finansal i\u015flemleri kolayca yapmas\u0131n\u0131 sa\u011fl\u0131yor. Peki, bir web sitesi veya uygulaman\u0131z varsa ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme yapma imkan\u0131 sunmak istiyorsan\u0131z ne yapmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, PHP kullanarak MTN Mobile Money API&#8217;sini sisteminize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m, s\u0131f\u0131rdan ileri d\u00fczeye kadar \u00f6\u011frenecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla entegrasyonun inceliklerini ke\u015ffedeceksiniz.<\/p>\n<p>G\u00fcn\u00fcm\u00fczde mobil \u00f6demeler, \u00f6zellikle geli\u015fmekte olan pazarlarda, nakit kullan\u0131m\u0131n\u0131n yerini h\u0131zla almaktad\u0131r. Bu d\u00f6n\u00fc\u015f\u00fcm\u00fcn \u00f6nc\u00fclerinden biri olan MTN Mobile Money (MoMo), milyonlarca kullan\u0131c\u0131ya banka hesab\u0131 olmaks\u0131z\u0131n para transferi, fatura \u00f6deme, mal ve hizmet sat\u0131n alma gibi finansal i\u015flemleri cep telefonlar\u0131 arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirme imkan\u0131 sunar. Temelinde bir dijital c\u00fczdan hizmeti olan MoMo, kullan\u0131c\u0131lar\u0131n telefon numaralar\u0131n\u0131 bir banka hesab\u0131 gibi kullanmalar\u0131na olanak tan\u0131r. Bu sayede, finansal hizmetlere eri\u015fimi olmayan veya geleneksel bankac\u0131l\u0131k y\u00f6ntemlerini tercih etmeyen geni\u015f kitlelere ula\u015f\u0131m kolayla\u015f\u0131r.<\/p>\n<p>\u0130\u015fletmeler i\u00e7in MTN MoMo entegrasyonu, \u00f6zellikle e-ticaret siteleri, online hizmet sa\u011flay\u0131c\u0131lar\u0131 ve dijital i\u00e7erik platformlar\u0131 i\u00e7in kritik bir \u00f6neme sahiptir. M\u00fc\u015fterilerin b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131n mobil \u00f6deme y\u00f6ntemlerini tercih etti\u011fi pazarlarda, MoMo entegrasyonu sunmak, m\u00fc\u015fteri taban\u0131n\u0131z\u0131 geni\u015fletmenin ve sat\u0131\u015flar\u0131n\u0131z\u0131 art\u0131rman\u0131n do\u011frudan bir yoludur. Ayr\u0131ca, \u00f6deme s\u00fcre\u00e7lerini basitle\u015ftirerek kullan\u0131c\u0131 deneyimini iyile\u015ftirir ve sepet terk oranlar\u0131n\u0131 d\u00fc\u015f\u00fcrmeye yard\u0131mc\u0131 olur.<\/p>\n<p>Peki, bu entegrasyon i\u00e7in neden PHP&#8217;yi tercih etmelisiniz? PHP, web geli\u015ftirmede en yayg\u0131n kullan\u0131lan dillerden biridir ve geni\u015f bir geli\u015ftirici toplulu\u011funa sahiptir. Bu da demektir ki, PHP ile \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z herhangi bir sorun i\u00e7in kolayca destek bulabilir, zengin k\u00fct\u00fcphane ve \u00e7er\u00e7eve (framework) ekosisteminden faydalanabilirsiniz. \u00d6zellikle cURL gibi HTTP isteklerini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc yerle\u015fik fonksiyonlar\u0131 sayesinde, RESTful API&#8217;lerle etkile\u015fim kurmak olduk\u00e7a pratiktir. Ayr\u0131ca, PHP&#8217;nin esnek yap\u0131s\u0131, farkl\u0131 sunucu ortamlar\u0131nda kolayca da\u011f\u0131t\u0131labilir olmas\u0131n\u0131 sa\u011flar. G\u00fcvenilir ve h\u0131zl\u0131 bir \u015fekilde mobil \u00f6deme altyap\u0131s\u0131n\u0131 kurmak isteyen i\u015fletmeler i\u00e7in PHP, MTN MoMo API&#8217;siyle kusursuz bir uyum i\u00e7indedir. Bu entegrasyon sayesinde, i\u015fletmeniz dijital \u00f6deme ekosistemine sorunsuz bir \u015fekilde dahil olabilir ve rekabet avantaj\u0131 elde edebilir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: MTN MoMo entegrasyonu sadece \u00f6deme almakla kalmaz, ayn\u0131 zamanda API&#8217;nin &#8220;Disbursement&#8221; (para g\u00f6nderme) \u00f6zelli\u011fini kullanarak tedarik\u00e7ilere \u00f6deme yapabilir veya m\u00fc\u015fteri iadelerini otomatikle\u015ftirebilirsiniz. Bu, i\u015f s\u00fcre\u00e7lerinizi ba\u015ftan sona dijitalle\u015ftirmenizi sa\u011flar.\n<\/div>\n<p>MTN Mobile Money&#8217;nin i\u015fletmeniz i\u00e7in sundu\u011fu baz\u0131 temel avantajlar:<\/p>\n<ul>\n<li><strong>Geni\u015f Kitleye Eri\u015fim:<\/strong> Banka hesab\u0131 olmayan veya mobil \u00f6demeyi tercih eden milyonlarca MTN kullan\u0131c\u0131s\u0131na ula\u015f\u0131m.<\/li>\n<li><strong>Kolay ve H\u0131zl\u0131 \u0130\u015flemler:<\/strong> M\u00fc\u015fterileriniz saniyeler i\u00e7inde \u00f6deme yapabilir, bu da i\u015flem tamamlama oranlar\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>G\u00fcvenli \u00d6deme Ortam\u0131:<\/strong> MTN&#8217;in sa\u011flam g\u00fcvenlik altyap\u0131s\u0131 sayesinde i\u015flemler g\u00fcvence alt\u0131ndad\u0131r.<\/li>\n<li><strong>D\u00fc\u015f\u00fck \u0130\u015flem \u00dccretleri:<\/strong> Geleneksel bankac\u0131l\u0131k y\u00f6ntemlerine k\u0131yasla genellikle daha uygun i\u015flem maliyetleri.<\/li>\n<li><strong>Otomatik Mutabakat:<\/strong> API sayesinde t\u00fcm i\u015flemlerin kayd\u0131 tutulabilir ve finansal raporlama kolayla\u015f\u0131r.<\/li>\n<\/ul>\n<p>Bu nedenlerden \u00f6t\u00fcr\u00fc, MTN MoMo entegrasyonu, PHP&#8217;nin sundu\u011fu kolayl\u0131klarla birle\u015fti\u011finde, i\u015fletmeler i\u00e7in ka\u00e7\u0131r\u0131lmamas\u0131 gereken bir f\u0131rsatt\u0131r. \u00d6zellikle hedef pazar\u0131n\u0131zda mobil \u00f6demelerin a\u011f\u0131rl\u0131\u011f\u0131 fazlaysa, bu entegrasyon sizi rakiplerinizin \u00f6n\u00fcne ge\u00e7irecektir.<\/p>\n<h2>MTN MoMo API Entegrasyonuna Ba\u015flarken Temel Ad\u0131mlar Nelerdir?<\/h2>\n<p>MTN Mobile Money API&#8217;sini PHP projenize entegre etmek, belirli bir dizi ad\u0131m\u0131 takip etmeyi gerektirir. Bu s\u00fcre\u00e7, kimlik do\u011frulama, g\u00fcvenlik ve veri al\u0131\u015fveri\u015fi prensiplerine dayan\u0131r. Ba\u015far\u0131l\u0131 bir entegrasyon i\u00e7in \u00f6ncelikle MTN Developer Portal&#8217;da hesap olu\u015fturman\u0131z ve gerekli API kimlik bilgilerini edinmeniz \u015fartt\u0131r. Bu kimlik bilgileri, uygulaman\u0131z\u0131n MTN MoMo sistemleriyle g\u00fcvenli bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. Ard\u0131ndan, PHP ortam\u0131n\u0131zda API \u00e7a\u011fr\u0131lar\u0131n\u0131 yapacak ara\u00e7lar\u0131 haz\u0131rlamal\u0131 ve ad\u0131m ad\u0131m \u00f6deme ak\u0131\u015f\u0131n\u0131 kurgulamal\u0131s\u0131n\u0131z. Unutmay\u0131n ki, her ad\u0131mda hata y\u00f6netimi ve g\u00fcvenlik en \u00f6ncelikli konular olmal\u0131d\u0131r.<\/p>\n<h3>MTN Developer Portal&#8217;da Hesap Olu\u015fturma ve API Kimlik Bilgilerini Edinme Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Entegrasyonun ilk ve en kritik ad\u0131m\u0131, MTN Developer Portal&#8217;a kaydolmakt\u0131r. Bu portal, API&#8217;lere eri\u015fim sa\u011flamak, uygulamalar\u0131n\u0131z\u0131 kaydetmek ve test ortam\u0131nda denemeler yapmak i\u00e7in merkezi bir noktad\u0131r. Kay\u0131t i\u015flemi genellikle e-posta do\u011frulama ve temel \u015firket bilgilerini girmeyi i\u00e7erir. Ba\u015far\u0131l\u0131 bir kayd\u0131n ard\u0131ndan, bir &#8220;Uygulama&#8221; (Application) olu\u015fturman\u0131z gerekecektir. Bu uygulama i\u00e7in bir &#8220;Subscription Key&#8221; (Abonelik Anahtar\u0131) ve &#8220;API User&#8221; (API Kullan\u0131c\u0131s\u0131) kimlik bilgileri alacaks\u0131n\u0131z. Bu bilgiler, API isteklerinizi yetkilendirmek i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<ol>\n<li><strong>MTN Developer Portal&#8217;a Kaydolun:<\/strong> Resmi MTN Developer Portal web sitesini ziyaret edin ve bir hesap olu\u015fturun.<\/li>\n<li><strong>Yeni Uygulama Olu\u015fturun:<\/strong> Geli\u015ftirici panelinizden &#8220;Uygulamalar\u0131m&#8221; (My Applications) b\u00f6l\u00fcm\u00fcne gidin ve yeni bir uygulama olu\u015fturun. Uygulaman\u0131za a\u00e7\u0131klay\u0131c\u0131 bir isim verin.<\/li>\n<li><strong>API \u00dcr\u00fcnlerine Abone Olun:<\/strong> Olu\u015fturdu\u011funuz uygulama i\u00e7in Collection ve\/veya Disbursement API&#8217;lerine abone olun. Bu abonelik, size bir &#8220;Subscription Key&#8221; sa\u011flayacakt\u0131r.<\/li>\n<li><strong>API Kullan\u0131c\u0131s\u0131 ve API Anahtar\u0131 Olu\u015fturun:<\/strong> API User b\u00f6l\u00fcm\u00fcnden yeni bir API kullan\u0131c\u0131s\u0131 olu\u015fturun. Bu i\u015flem s\u0131ras\u0131nda size bir &#8220;API Key&#8221; (API Anahtar\u0131) veya &#8220;Client Secret&#8221; verilecektir. Bu anahtar genellikle tek seferlik g\u00f6sterilir, bu y\u00fczden g\u00fcvenli bir yere kaydetti\u011finizden emin olun.<\/li>\n<li><strong>Environment Se\u00e7imi:<\/strong> Sandbox (test) ortam\u0131 ile ba\u015flay\u0131n. Canl\u0131 (live) ortama ge\u00e7i\u015f i\u00e7in ek do\u011frulamalar gerekebilir.<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, PHP projenizde kullanaca\u011f\u0131n\u0131z temel kimlik bilgilerine sahip olacaks\u0131n\u0131z. Bunlar genellikle <code>X-Reference-Id<\/code> (benzersiz i\u015flem kimli\u011fi), <code>X-Target-Environment<\/code> (sandbox\/live), <code>Ocp-Apim-Subscription-Key<\/code> ve API User ile API Key (veya Client ID\/Secret) kombinasyonudur.<\/p>\n<h3>PHP Ortam\u0131 Nas\u0131l Haz\u0131rlan\u0131r ve Token Alma \u0130\u015flemi Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>PHP projenizde MTN MoMo API&#8217;siyle ileti\u015fim kurmak i\u00e7in <a href=\"https:\/\/www.php.net\/manual\/en\/book.curl.php\" target=\"_blank\">cURL<\/a> k\u00fct\u00fcphanesini kullanaca\u011f\u0131z. cURL, farkl\u0131 protokoller \u00fczerinden sunucu taraf\u0131 istekleri yapmak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Ayr\u0131ca, API yan\u0131tlar\u0131 genellikle JSON format\u0131nda olaca\u011f\u0131ndan, PHP&#8217;nin yerle\u015fik JSON fonksiyonlar\u0131na ihtiyac\u0131m\u0131z olacak.<\/p>\n<p>\u0130lk olarak, API&#8217;ye yapaca\u011f\u0131m\u0131z her istek i\u00e7in bir eri\u015fim token&#8217;\u0131 (Access Token) almam\u0131z gerekir. Bu token, sonraki t\u00fcm yetkili istekler i\u00e7in kullan\u0131lacakt\u0131r ve belirli bir s\u00fcre sonra ge\u00e7erlili\u011fini yitirecektir. Token yenileme mekanizmas\u0131n\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Eri\u015fim token&#8217;\u0131n\u0131z\u0131 g\u00fcvenli bir \u015fekilde saklay\u0131n (\u00f6rne\u011fin veritaban\u0131nda veya Redis gibi bir \u00f6nbellekte) ve s\u00fcresi dolmadan \u00f6nce otomatik olarak yenileyecek bir mekanizma kurun. Her istekte yeni bir token almak performans\u0131 d\u00fc\u015f\u00fcrecektir.\n<\/div>\n<p>\u0130\u015fte bir eri\u015fim token&#8217;\u0131 almak i\u00e7in PHP kodu:<\/p>\n<pre><code class=\"language-php\">\n<?php\n\n\/\/ MTN MoMo API yap\u0131land\u0131rma bilgileri\n$apiUser = 'sizin_api_kullanici_idiniz'; \/\/ UUID format\u0131nda\n$apiKey = 'sizin_api_anahtar\u0131n\u0131z'; \/\/ API User olu\u015ftururken verilen anahtar\n$subscriptionKey = 'sizin_abonelik_anahtar\u0131n\u0131z';\n$targetEnvironment = 'sandbox'; \/\/ veya 'production'\n\n\/\/ API base URL'leri\n$baseUrl = 'https:\/\/sandbox.momodeveloper.mtn.com'; \/\/ Sandbox i\u00e7in\n\/\/ $baseUrl = 'https:\/\/live.momodeveloper.mtn.com'; \/\/ Canl\u0131 ortam i\u00e7in\n\n\/\/ Benzersiz bir i\u015flem referans\u0131 olu\u015ftur\n$xReferenceId = generateUuid(); \/\/ Kendi UUID olu\u015fturma fonksiyonunuzu kullan\u0131n\n\nfunction generateUuid() {\n    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',\n        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),\n        mt_rand( 0, 0xffff ),\n        mt_rand( 0, 0x0fff ) | 0x4000,\n        mt_rand( 0, 0x3fff ) | 0x8000,\n        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )\n    );\n}\n\n\/\/ 1. API Kullan\u0131c\u0131s\u0131 Olu\u015fturma (Genellikle bir kerelik yap\u0131l\u0131r)\n\/\/ Bu ad\u0131m genellikle bir kerelik bir i\u015flemdir ve API portal\u0131ndan da yap\u0131labilir.\n\/\/ Sadece API User ID'nizin sisteme kaydedildi\u011finden emin olmak i\u00e7in bir \u00f6rnektir.\n\/\/ Bu kodu canl\u0131 ortamda tekrar tekrar \u00e7al\u0131\u015ft\u0131rmamal\u0131s\u0131n\u0131z.\nfunction createApiUser($apiUser, $apiKey, $subscriptionKey, $baseUrl, $targetEnvironment, $xReferenceId) {\n    $url = $baseUrl . '\/v1_0\/apiuser';\n    $headers = [\n        'X-Reference-Id: ' . $xReferenceId,\n        'X-Target-Environment: ' . $targetEnvironment,\n        'Content-Type: application\/json',\n        'Ocp-Apim-Subscription-Key: ' . $subscriptionKey\n    ];\n    $data = [\n        'providerCallbackHost' => 'https:\/\/sizin-webhook-urliniz.com\/mtn-callback' \/\/ Webhook URL'nizi buraya yaz\u0131n\n    ];\n\n    $ch = curl_init($url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');\n    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));\n    $response = curl_exec($ch);\n    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n    curl_close($ch);\n\n    if ($httpCode == 201 || $httpCode == 409) { \/\/ 201 Created veya 409 Conflict (zaten var)\n        echo \"API User olu\u015fturuldu veya zaten mevcut. Referans ID: \" . $xReferenceId . \"\\n\";\n        return true;\n    } else {\n        echo \"API User olu\u015fturulurken hata olu\u015ftu: \" . $httpCode . \" \" . $response . \"\\n\";\n        return false;\n    }\n}\n\n\/\/ API User'\u0131 ve Key'i ba\u011flama (Genellikle bir kerelik yap\u0131l\u0131r)\nfunction createApiKey($apiUser, $subscriptionKey, $baseUrl, $targetEnvironment, $xReferenceId) {\n    $url = $baseUrl . '\/v1_0\/apiuser\/' . $apiUser . '\/apikey';\n    $headers = [\n        'X-Target-Environment: ' . $targetEnvironment,\n        'Ocp-Apim-Subscription-Key: ' . $subscriptionKey\n    ];\n\n    $ch = curl_init($url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');\n    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n    $response = curl_exec($ch);\n    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n    curl_close($ch);\n\n    if ($httpCode == 201) {\n        $responseData = json_decode($response, true);\n        echo \"API Key ba\u015far\u0131yla olu\u015fturuldu\/yenilendi: \" . $responseData['apiKey'] . \"\\n\";\n        return $responseData['apiKey'];\n    } else {\n        echo \"API Key olu\u015fturulurken hata olu\u015ftu: \" . $httpCode . \" \" . $response . \"\\n\";\n        return null;\n    }\n}\n\n\/\/ 2. Eri\u015fim Token'\u0131 Alma\nfunction getAccessToken($apiUser, $apiKey, $subscriptionKey, $baseUrl, $targetEnvironment) {\n    $url = $baseUrl . '\/collection\/token\/'; \/\/ Collection veya Disbursement i\u00e7in ayr\u0131 token URL'leri olabilir\n    $credentials = base64_encode($apiUser . ':' . $apiKey);\n    $headers = [\n        'Authorization: Basic ' . $credentials,\n        'Ocp-Apim-Subscription-Key: ' . $subscriptionKey,\n        'X-Target-Environment: ' . $targetEnvironment\n    ];\n\n    $ch = curl_init($url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n    curl_setopt($ch, CURLOPT_POST, true);\n    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n    $response = curl_exec($ch);\n    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n    curl_close($ch);\n\n    if ($httpCode == 200) {\n        $responseData = json_decode($response, true);\n        return $responseData['access_token'];\n    } else {\n        echo \"Token al\u0131rken hata olu\u015ftu: \" . $httpCode . \" \" . $response . \"\\n\";\n        return null;\n    }\n}\n\n\/\/ \u00d6rnek kullan\u0131m:\n\/\/ createApiUser($apiUser, $apiKey, $subscriptionKey, $baseUrl, $targetEnvironment, $xReferenceId); \/\/ Yaln\u0131zca bir kez \u00e7al\u0131\u015ft\u0131r\u0131n\n\/\/ $newlyGeneratedApiKey = createApiKey($apiUser, $subscriptionKey, $baseUrl, $targetEnvironment, $xReferenceId); \/\/ Bu, portalda ald\u0131\u011f\u0131n\u0131z 'apiKey' yerine ge\u00e7ebilir\n\/\/ if ($newlyGeneratedApiKey) {\n\/\/     $apiKey = $newlyGeneratedApiKey; \/\/ E\u011fer yeni bir API Key olu\u015fturduysak bunu kullan\n\/\/ }\n\n$accessToken = getAccessToken($apiUser, $apiKey, $subscriptionKey, $baseUrl, $targetEnvironment);\n\nif ($accessToken) {\n    echo \"Eri\u015fim Token'\u0131: \" . $accessToken . \"\\n\";\n    \/\/ Bu token'\u0131 sonraki API \u00e7a\u011fr\u0131lar\u0131nda kullanabilirsiniz.\n} else {\n    echo \"Eri\u015fim token'\u0131 al\u0131namad\u0131.\\n\";\n}\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<h3>PHP ile \u00d6deme Ba\u015flatma (Collection) ve Durum Sorgulama Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Eri\u015fim token'\u0131n\u0131z\u0131 ald\u0131ktan sonra, m\u00fc\u015fterilerinizden \u00f6deme almak i\u00e7in Collection API'sini kullanabilirsiniz. Bu i\u015flem genellikle iki ad\u0131mdan olu\u015fur: \u00f6deme talebi olu\u015fturma ve ard\u0131ndan \u00f6deme durumunu takip etme. MTN MoMo API'sinde \u00f6deme talebi asenkron bir i\u015flemdir, yani bir talep g\u00f6nderirsiniz ve sistem size bir i\u015flem referans ID'si d\u00f6nd\u00fcr\u00fcr. M\u00fc\u015fteri \u00f6demeyi tamamlad\u0131\u011f\u0131nda veya reddetti\u011finde, MTN sizin belirledi\u011finiz bir \"callback URL\" (webhook) \u00fczerinden sizi bilgilendirir.<\/p>\n<h4>\u00d6deme Talebi Olu\u015fturma<\/h4>\n<p>M\u00fc\u015fteriden bir \u00f6deme almak i\u00e7in Collection API'sinin <code>\/requesttopay<\/code> endpoint'ine bir POST iste\u011fi g\u00f6ndermeniz gerekir. Bu istek, m\u00fc\u015fterinin telefon numaras\u0131n\u0131, \u00f6denecek miktar\u0131 ve i\u015flemi a\u00e7\u0131klayan bir mesaj\u0131 i\u00e7ermelidir.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\n\/\/ \u00d6nceki token alma kodunuzdan $accessToken, $baseUrl, $subscriptionKey, $targetEnvironment al\u0131nm\u0131\u015f olmal\u0131.\n\/\/ Fonksiyonlar ve de\u011fi\u015fkenler yukar\u0131daki \u00f6rnekten devam ediyor varsayal\u0131m.\n\n\/\/ 3. \u00d6deme Talebi Olu\u015fturma (Collection)\nfunction requestToPay($accessToken, $amount, $currency, $payerPhoneNumber, $payerMessage, $payeeNote, $subscriptionKey, $baseUrl, $targetEnvironment) {\n    $url = $baseUrl . '\/collection\/v1_0\/requesttopay';\n    $xReferenceId = generateUuid(); \/\/ Her istek i\u00e7in yeni bir referans ID\n\n    $headers = [\n        'Authorization: Bearer ' . $accessToken,\n        'X-Reference-Id: ' . $xReferenceId,\n        'X-Target-Environment: ' . $targetEnvironment,\n        'Content-Type: application\/json',\n        'Ocp-Apim-Subscription-Key: ' . $subscriptionKey\n    ];\n\n    $data = [\n        'amount' => (string)$amount, \/\/ Miktar string olarak g\u00f6nderilmeli\n        'currency' => $currency, \/\/ \u00d6rn: \"EUR\", \"USD\" veya yerel para birimi (GHs, UGX, RWF vb.)\n        'externalId' => 'ORDER12345', \/\/ Kendi sisteminizdeki benzersiz sipari\u015f ID'si\n        'payer' => [\n            'partyIdType' => 'MSISDN',\n            'partyId' => $payerPhoneNumber \/\/ M\u00fc\u015fterinin MTN MoMo telefon numaras\u0131\n        ],\n        'payerMessage' => $payerMessage,\n        'payeeNote' => $payeeNote\n    ];\n\n    $ch = curl_init($url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');\n    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));\n    $response = curl_exec($ch);\n    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n    curl_close($ch);\n\n    if ($httpCode == 202) { \/\/ 202 Accepted, i\u015flem ba\u015far\u0131yla ba\u015flat\u0131ld\u0131\n        echo \"\u00d6deme talebi ba\u015far\u0131yla olu\u015fturuldu. \u0130\u015flem Referans\u0131: \" . $xReferenceId . \"\\n\";\n        return $xReferenceId;\n    } else {\n        echo \"\u00d6deme talebi olu\u015fturulurken hata olu\u015ftu: \" . $httpCode . \" \" . $response . \"\\n\";\n        return null;\n    }\n}\n\n\/\/ \u00d6rnek kullan\u0131m:\n\/\/ if ($accessToken) {\n\/\/     $transactionId = requestToPay($accessToken, 10.50, 'EUR', '46733123454', 'Online Al\u0131\u015fveri\u015f', '\u00dcr\u00fcn Sat\u0131n Alma', $subscriptionKey, $baseUrl, $targetEnvironment);\n\/\/     if ($transactionId) {\n\/\/         \/\/ \u0130\u015flem ba\u015far\u0131l\u0131, bu transactionId'yi veritaban\u0131n\u0131za kaydedin.\n\/\/         \/\/ M\u00fc\u015fteri bu noktada telefonunda bir bildirim alacak ve \u00f6demeyi onaylamas\u0131 beklenecek.\n\/\/         \/\/ Sonucu webhook \u00fczerinden takip edece\u011fiz.\n\/\/     }\n\/\/ }\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<h4>\u00d6deme Durumu Sorgulama<\/h4>\n<p>\u00d6deme talebini ba\u015flatt\u0131ktan sonra, m\u00fc\u015fterinin \u00f6demeyi onaylay\u0131p onaylamad\u0131\u011f\u0131n\u0131 do\u011frudan API \u00fczerinden de sorgulayabilirsiniz. Bu genellikle webhook'unuz yan\u0131t vermezse veya ek bir do\u011frulama gerekti\u011finde kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\n\/\/ \u00d6nceki token alma kodunuzdan $accessToken, $baseUrl, $subscriptionKey, $targetEnvironment al\u0131nm\u0131\u015f olmal\u0131.\n\n\/\/ 4. \u00d6deme Durumu Sorgulama\nfunction getTransactionStatus($accessToken, $transactionId, $subscriptionKey, $baseUrl, $targetEnvironment) {\n    $url = $baseUrl . '\/collection\/v1_0\/requesttopay\/' . $transactionId;\n\n    $headers = [\n        'Authorization: Bearer ' . $accessToken,\n        'X-Target-Environment: ' . $targetEnvironment,\n        'Ocp-Apim-Subscription-Key: ' . $subscriptionKey\n    ];\n\n    $ch = curl_init($url);\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n    $response = curl_exec($ch);\n    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n    curl_close($ch);\n\n    if ($httpCode == 200) {\n        $responseData = json_decode($response, true);\n        echo \"\u0130\u015flem Durumu (\" . $transactionId . \"): \" . $responseData['status'] . \"\\n\";\n        return $responseData;\n    } else {\n        echo \"\u0130\u015flem durumu sorgulan\u0131rken hata olu\u015ftu: \" . $httpCode . \" \" . $response . \"\\n\";\n        return null;\n    }\n}\n\n\/\/ \u00d6rnek kullan\u0131m:\n\/\/ if (isset($transactionId) &#038;&#038; $transactionId) {\n\/\/     sleep(5); \/\/ K\u0131sa bir bekleme s\u00fcresi, m\u00fc\u015fteri onaylayana kadar\n\/\/     $status = getTransactionStatus($accessToken, $transactionId, $subscriptionKey, $baseUrl, $targetEnvironment);\n\/\/     if ($status) {\n\/\/         \/\/ \u0130\u015flem durumunu kontrol edin ve veritaban\u0131n\u0131z\u0131 g\u00fcncelleyin.\n\/\/         \/\/ \u00d6rne\u011fin: if ($status['status'] == 'SUCCESSFUL') { ... }\n\/\/     }\n\/\/ }\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<h3>Webhook (Callback URL) Ayarlar\u0131 ve G\u00fcvenli\u011fi Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>MTN MoMo API'sinde \u00f6deme i\u015flemlerinin sonucunu \u00f6\u011frenmenin en g\u00fcvenilir ve ger\u00e7ek zamanl\u0131 yolu webhook kullanmakt\u0131r. Webhook, MTN'in sunucunuzdaki belirli bir URL'ye (callback URL) HTTP POST iste\u011fi g\u00f6ndererek sizi bir i\u015flemin sonucu hakk\u0131nda bilgilendirmesidir. Bu, uygulaman\u0131z\u0131n s\u00fcrekli API'yi sorgulamas\u0131na gerek kalmadan g\u00fcncel i\u015flem durumunu almas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Webhook URL'nizi MTN Developer Portal'da API User olu\u015ftururken belirlemi\u015f olmal\u0131s\u0131n\u0131z. E\u011fer belirlenmediyse, API User'\u0131 g\u00fcncelleyerek veya ba\u015ftan olu\u015fturarak bu URL'yi ekleyebilirsiniz. \u00d6nemli olan, bu URL'nin d\u0131\u015far\u0131dan eri\u015filebilir (public) olmas\u0131 ve gelen POST isteklerini do\u011fru bir \u015fekilde i\u015fleyebilmesidir.<\/p>\n<pre><code class=\"language-php\">\n<?php\n\/\/ mtn-callback.php (\u00f6rnek bir webhook i\u015fleyici)\n\nheader('Content-Type: application\/json');\n\n\/\/ Gelen JSON verisini al\n$input = file_get_contents('php:\/\/input');\n$event = json_decode($input, true);\n\n\/\/ G\u00fcnl\u00fck kayd\u0131 tutmak g\u00fcvenlik ve hata ay\u0131klama i\u00e7in \u00e7ok \u00f6nemlidir\nfile_put_contents('webhook_log.txt', date('Y-m-d H:i:s') . \" - Gelen Webhook: \" . $input . \"\\n\", FILE_APPEND);\n\nif ($event) {\n    $status = $event['status'] ?? 'UNKNOWN';\n    $externalId = $event['externalId'] ?? 'N\/A';\n    $financialTransactionId = $event['financialTransactionId'] ?? 'N\/A';\n    $transactionId = $event['referenceId'] ?? 'N\/A'; \/\/ MTN taraf\u0131ndaki referans ID\n\n    \/\/ Veritaban\u0131n\u0131zda ilgili i\u015flemi bulun ve g\u00fcncelleyin\n    \/\/ \u00d6rne\u011fin: UPDATE orders SET status = ?, financial_id = ? WHERE order_id = ?\n    \/\/ Bu k\u0131s\u0131mda SQL enjeksiyonlar\u0131na kar\u015f\u0131 dikkatli olun ve Prepared Statements kullan\u0131n!\n\n    switch ($status) {\n        case 'SUCCESSFUL':\n            \/\/ \u00d6deme ba\u015far\u0131l\u0131, sipari\u015fi tamamla, m\u00fc\u015fteriye bildirim g\u00f6nder vb.\n            echo json_encode(['message' => '\u00d6deme ba\u015far\u0131l\u0131 olarak kaydedildi.', 'status' => 'OK']);\n            break;\n        case 'FAILED':\n            \/\/ \u00d6deme ba\u015far\u0131s\u0131z, sipari\u015fi iptal et veya beklemeye al.\n            echo json_encode(['message' => '\u00d6deme ba\u015far\u0131s\u0131z oldu.', 'status' => 'FAILED']);\n            break;\n        case 'PENDING':\n            \/\/ \u00d6deme hala beklemede, hen\u00fcz sonu\u00e7lanmad\u0131.\n            echo json_encode(['message' => '\u00d6deme beklemede.', 'status' => 'PENDING']);\n            break;\n        default:\n            echo json_encode(['message' => 'Bilinmeyen durum.', 'status' => 'UNKNOWN']);\n            break;\n    }\n} else {\n    \/\/ Ge\u00e7ersiz veya bo\u015f webhook iste\u011fi\n    http_response_code(400);\n    echo json_encode(['error' => 'Ge\u00e7ersiz webhook verisi.']);\n}\n\n?>\n<\/pre>\n<p><\/code><\/p>\n<p>Webhook g\u00fcvenli\u011fi son derece \u00f6nemlidir. Herhangi bir k\u00f6t\u00fc niyetli ki\u015finin sahte \u00f6deme bildirimleri g\u00f6ndermesini engellemek i\u00e7in \u015fu \u00f6nlemleri almal\u0131s\u0131n\u0131z:<\/p>\n<ol>\n<li><strong>Sadece POST \u0130steklerini Kabul Edin:<\/strong> Webhook URL'nizin sadece POST isteklerine yan\u0131t verdi\u011finden emin olun.<\/li>\n<li><strong>\u0130stek Origin Do\u011frulamas\u0131:<\/strong> Gelen iste\u011fin ger\u00e7ekten MTN'den geldi\u011fini do\u011frulamak i\u00e7in IP adreslerini kontrol edebilirsiniz (MTN'in belirledi\u011fi IP aral\u0131klar\u0131).<\/li>\n<li><strong>\u0130mza Do\u011frulamas\u0131:<\/strong> MTN API'si genellikle webhook istekleriyle birlikte bir imza (signature) g\u00f6nderir. Bu imzay\u0131 kendi sisteminizde do\u011frulayarak verinin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve kayna\u011f\u0131n\u0131 teyit edebilirsiniz. (MTN MoMo API belgelerini kontrol edin, baz\u0131 s\u00fcr\u00fcmlerde veya \u00fclkelerde bu \u00f6zellik olmayabilir.)<\/li>\n<li><strong>SSL\/TLS Kullan\u0131m\u0131:<\/strong> Webhook URL'nizin HTTPS ile g\u00fcvence alt\u0131na al\u0131nd\u0131\u011f\u0131ndan emin olun.<\/li>\n<li><strong>Idempotency Kontrol\u00fc:<\/strong> Ayn\u0131 i\u015flem referans ID'si ile birden fazla bildirim gelme ihtimaline kar\u015f\u0131, her bir i\u015flemin sadece bir kez i\u015flendi\u011finden emin olun. Bu, veritaban\u0131n\u0131zda benzersiz k\u0131s\u0131tlamalar kullanarak veya i\u015flem ID'sini kontrol ederek yap\u0131labilir.<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar, MTN MoMo entegrasyonunuzun temelini olu\u015fturur. API kullan\u0131c\u0131 ve anahtar y\u00f6netimi, token alma ve \u00f6deme ba\u015flatma s\u00fcre\u00e7lerini do\u011fru bir \u015fekilde kurgulamak, sorunsuz bir operasyon i\u00e7in hayati \u00f6neme sahiptir. Webhook entegrasyonu ise, \u00f6deme sonu\u00e7lar\u0131n\u0131 ger\u00e7ek zamanl\u0131 olarak takip etmenizi ve m\u00fc\u015fteri deneyimini an\u0131nda g\u00fcncellemenizi sa\u011flar. Dolay\u0131s\u0131yla, bu ad\u0131mlar\u0131n her biri \u00fczerinde titizlikle durulmal\u0131d\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda MTN MoMo Entegrasyonu ve \u0130leri Optimizasyonlar<\/h2>\n<p>MTN MoMo entegrasyonu sadece \u00f6deme almakla s\u0131n\u0131rl\u0131 de\u011fildir; ayn\u0131 zamanda i\u015f s\u00fcre\u00e7lerinizi otomatikle\u015ftirmek ve optimize etmek i\u00e7in bir\u00e7ok f\u0131rsat sunar. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda kar\u015f\u0131la\u015fabilece\u011finiz durumlar\u0131 ele alarak entegrasyonunuzu nas\u0131l daha sa\u011flam, g\u00fcvenli ve verimli hale getirebilece\u011finizi inceleyece\u011fiz. Bu b\u00f6l\u00fcmde, vaka analizleri, g\u00fcvenlik \u00f6nlemleri, hata y\u00f6netimi ve performans ipu\u00e7lar\u0131 gibi ileri d\u00fczey konulara odaklanaca\u011f\u0131z. Bu sayede, entegrasyonunuzun sadece \u00e7al\u0131\u015fmakla kalmay\u0131p, ayn\u0131 zamanda i\u015f gereksinimlerinizi tam olarak kar\u015f\u0131lamas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<h3>Vaka Analizi: E-ticaret Sitesinde MTN MoMo \u00d6deme Ak\u0131\u015f\u0131 Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>Bir e-ticaret sitesi i\u015fletti\u011finizi ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme se\u00e7ene\u011fi sunmak istedi\u011finizi varsayal\u0131m. Bu senaryoda ideal bir \u00f6deme ak\u0131\u015f\u0131 \u015fu \u015fekilde olacakt\u0131r:<\/p>\n<ol>\n<li><strong>Sepet ve Sipari\u015f Olu\u015fturma:<\/strong> M\u00fc\u015fteri \u00fcr\u00fcnleri sepetine ekler ve \u00f6deme sayfas\u0131na gider. \u00d6deme se\u00e7enekleri aras\u0131nda \"MTN Mobile Money\" se\u00e7ene\u011fini g\u00f6r\u00fcr.<\/li>\n<li><strong>Telefon Numaras\u0131 Giri\u015fi:<\/strong> M\u00fc\u015fteri MTN MoMo'yu se\u00e7ti\u011finde, \u00f6deme yapmak istedi\u011fi telefon numaras\u0131n\u0131 girer. Bu numara, MTN MoMo hesab\u0131na ba\u011fl\u0131 olmal\u0131d\u0131r.<\/li>\n<li><strong>\u00d6deme Talebi Ba\u015flatma (Backend):<\/strong> M\u00fc\u015fteri \"\u00d6demeyi Tamamla\" butonuna t\u0131klad\u0131\u011f\u0131nda, PHP backend'iniz MTN MoMo API'sine <code>requesttopay<\/code> \u00e7a\u011fr\u0131s\u0131 yapar. Bu \u00e7a\u011fr\u0131, m\u00fc\u015fterinin telefon numaras\u0131n\u0131, sipari\u015f tutar\u0131n\u0131, para birimini ve benzersiz bir <code>externalId<\/code> (kendi sipari\u015f ID'niz) i\u00e7erir. Bu noktada, sipari\u015finiz veritaban\u0131nda \"Beklemede\" (Pending) stat\u00fcs\u00fcnde kaydedilir.<\/li>\n<li><strong>M\u00fc\u015fteri Onay\u0131 (Mobil Cihaz):<\/strong> MTN sistemi, m\u00fc\u015fterinin telefonuna bir \u00f6deme onay\u0131 bildirimi g\u00f6nderir. M\u00fc\u015fteri, telefonunda PIN'ini girerek i\u015flemi onaylar veya reddeder.<\/li>\n<li><strong>Webhook Bildirimi (Backend):<\/strong> M\u00fc\u015fteri i\u015flemi onaylad\u0131\u011f\u0131nda veya reddetti\u011finde, MTN sizin belirledi\u011finiz webhook URL'sine bir POST iste\u011fi g\u00f6nderir. Bu istek, i\u015flemin sonucunu (ba\u015far\u0131l\u0131\/ba\u015far\u0131s\u0131z\/beklemede), MTN'in finansal i\u015flem ID'sini (<code>financialTransactionId<\/code>) ve sizin g\u00f6nderdi\u011finiz <code>externalId<\/code>'yi i\u00e7erir.<\/li>\n<li><strong>Sipari\u015f Durum G\u00fcncellemesi:<\/strong> Webhook i\u015fleyiciniz, gelen bildirimi al\u0131r, <code>externalId<\/code>'yi kullanarak veritaban\u0131n\u0131zdaki ilgili sipari\u015fi bulur ve sipari\u015f durumunu g\u00fcnceller (\u00f6rne\u011fin, \"Tamamland\u0131\" veya \"\u0130ptal Edildi\"). Ba\u015far\u0131l\u0131 bir \u00f6demede, m\u00fc\u015fteriye bir sipari\u015f onay\u0131 e-postas\u0131 g\u00f6nderilir ve \u00fcr\u00fcn sevk s\u00fcrecine al\u0131n\u0131r. Ba\u015far\u0131s\u0131z \u00f6demede, m\u00fc\u015fteriye bilgilendirme yap\u0131l\u0131r ve tekrar denemesi istenir.<\/li>\n<li><strong>Hata Y\u00f6netimi ve Loglama:<\/strong> Her ad\u0131mda olas\u0131 hatalar (API yan\u0131t hatalar\u0131, a\u011f sorunlar\u0131 vb.) i\u00e7in uygun hata y\u00f6netimi ve detayl\u0131 loglama mekanizmalar\u0131 devreye al\u0131n\u0131r.<\/li>\n<\/ol>\n<p>Bu ak\u0131\u015f, m\u00fc\u015fteriye sorunsuz bir deneyim sunarken, i\u015fletmenizin de \u00f6demeleri g\u00fcvenli ve otomatik bir \u015fekilde y\u00f6netmesini sa\u011flar.<\/p>\n<h3>G\u00fcvenlik, Hata Y\u00f6netimi ve Performans \u0130pu\u00e7lar\u0131 Nelerdir?<\/h3>\n<h4>API G\u00fcvenli\u011fi Nas\u0131l Sa\u011flan\u0131r?<\/h4>\n<ul>\n<li><strong>SSL\/TLS Kullan\u0131m\u0131:<\/strong> T\u00fcm API isteklerinizin ve webhook URL'nizin HTTPS \u00fczerinden yap\u0131ld\u0131\u011f\u0131ndan emin olun. Bu, verilerin \u015fifrelenmesini ve \u00fc\u00e7\u00fcnc\u00fc taraflarca ele ge\u00e7irilmesini \u00f6nler.<\/li>\n<li><strong>API Anahtar\u0131 ve Token Y\u00f6netimi:<\/strong> API anahtarlar\u0131n\u0131z\u0131 ve eri\u015fim token'lar\u0131n\u0131z\u0131 asla a\u00e7\u0131k metin olarak depolamay\u0131n. Ortam de\u011fi\u015fkenleri, g\u00fcvenli konfig\u00fcrasyon dosyalar\u0131 veya gizli y\u00f6neticileri (Vault gibi) kullan\u0131n. Eri\u015fim token'\u0131n\u0131n s\u00fcresi doldu\u011funda yenileme mekanizmas\u0131n\u0131 otomatikle\u015ftirin.<\/li>\n<li><strong>Webhook Do\u011frulamas\u0131:<\/strong> MTN'den gelen webhook isteklerinin ger\u00e7ekten MTN'den geldi\u011fini do\u011frulay\u0131n. IP whitelisting veya imza do\u011frulama gibi y\u00f6ntemler kullan\u0131n.<\/li>\n<li><strong>Giri\u015f Do\u011frulamas\u0131 ve Temizli\u011fi:<\/strong> M\u00fc\u015fteriden gelen t\u00fcm verileri (telefon numaras\u0131, miktar vb.) sunucu taraf\u0131nda mutlaka do\u011frulay\u0131n ve zararl\u0131 karakterlerden temizleyin (SQL enjeksiyonu, XSS sald\u0131r\u0131lar\u0131 vb. \u00f6nlemek i\u00e7in).<\/li>\n<\/ul>\n<h4>Etkili Hata Y\u00f6netimi Nas\u0131l Uygulan\u0131r?<\/h4>\n<p>API entegrasyonlar\u0131nda hatalar ka\u00e7\u0131n\u0131lmazd\u0131r. Bu hatalar\u0131 etkin bir \u015fekilde y\u00f6netmek, uygulaman\u0131z\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve m\u00fc\u015fteri deneyimini olumsuz etkilemez.<\/p>\n<ul>\n<li><strong>HTTP Durum Kodlar\u0131n\u0131 \u0130zleme:<\/strong> MTN API'si taraf\u0131ndan d\u00f6nd\u00fcr\u00fclen HTTP durum kodlar\u0131n\u0131 (\u00f6rn: 200 OK, 202 Accepted, 400 Bad Request, 401 Unauthorized, 500 Internal Server Error) dikkatlice i\u015fleyin. Her koda g\u00f6re farkl\u0131 bir yan\u0131t mekanizmas\u0131 geli\u015ftirin.<\/li>\n<li><strong>API Yan\u0131tlar\u0131n\u0131 Analiz Etme:<\/strong> MTN API'si genellikle hata durumlar\u0131nda detayl\u0131 JSON yan\u0131tlar\u0131 d\u00f6nd\u00fcr\u00fcr. Bu yan\u0131tlar\u0131 ayr\u0131\u015ft\u0131rarak hatan\u0131n nedenini anlay\u0131n ve buna g\u00f6re kullan\u0131c\u0131ya geri bildirimde bulunun veya i\u00e7 sistemlerinizi g\u00fcncelleyin.<\/li>\n<li><strong>Tekrar Deneme Mekanizmalar\u0131 (Retry Logic):<\/strong> Ge\u00e7ici a\u011f hatalar\u0131 veya API taraf\u0131ndaki k\u0131sa s\u00fcreli kesintiler i\u00e7in, belirli bir gecikmeyle (exponential backoff) istekleri tekrar deneme mant\u0131\u011f\u0131 uygulay\u0131n. Ancak, idempotent olmayan (birden fazla \u00e7a\u011fr\u0131da farkl\u0131 sonu\u00e7 verebilen) istekler i\u00e7in bu yakla\u015f\u0131m\u0131 dikkatli kullan\u0131n.<\/li>\n<li><strong>Kapsaml\u0131 Loglama:<\/strong> T\u00fcm API isteklerini, yan\u0131tlar\u0131n\u0131 ve hata mesajlar\u0131n\u0131 detayl\u0131 bir \u015fekilde loglay\u0131n. Bu loglar, sorun giderme ve olas\u0131 entegrasyon sorunlar\u0131n\u0131 te\u015fhis etme konusunda paha bi\u00e7ilmezdir. Loglar\u0131 merkezi bir log y\u00f6netimi sistemine (\u00f6rn: ELK Stack, Graylog) g\u00f6ndermek, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in faydal\u0131d\u0131r.<\/li>\n<\/ul>\n<h4>Performans Optimizasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h4>\n<ul>\n<li><strong>Token \u00d6nbelle\u011fe Alma:<\/strong> Eri\u015fim token'lar\u0131n\u0131 ald\u0131ktan sonra, bunlar\u0131 belirli bir s\u00fcre i\u00e7in \u00f6nbelle\u011fe al\u0131n (Redis, Memcached veya veritaban\u0131). Her API \u00e7a\u011fr\u0131s\u0131nda yeni token almak yerine, \u00f6nbellekteki ge\u00e7erli token'\u0131 kullan\u0131n.<\/li>\n<li><strong>Asenkron \u0130\u015flemler:<\/strong> \u00d6zellikle webhook'lar gibi zaman a\u00e7\u0131s\u0131ndan kritik olmayan veya uzun s\u00fcrebilecek i\u015flemler i\u00e7in asenkron i\u015fleme (background jobs, kuyruk sistemleri - RabbitMQ, Redis Queue) kullan\u0131n. Bu, ana uygulaman\u0131z\u0131n performans\u0131n\u0131 ve yan\u0131t s\u00fcresini etkilemez.<\/li>\n<li><strong>Ba\u011flant\u0131 Havuzu (Connection Pooling):<\/strong> cURL gibi HTTP istemcileriyle \u00e7al\u0131\u015f\u0131rken, e\u011fer m\u00fcmk\u00fcnse ba\u011flant\u0131lar\u0131 yeniden kullanmak (keep-alive) i\u00e7in ayarlamalar yap\u0131n.<\/li>\n<li><strong>Minimal Veri Aktar\u0131m\u0131:<\/strong> API isteklerinde sadece gerekli verileri g\u00f6nderin ve al\u0131n. Gereksiz veri transferi a\u011f gecikmesine neden olabilir.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: \u0130\u015flem mutabakat\u0131 (reconciliation) i\u00e7in, MTN MoMo panelinden periyodik olarak i\u015flem raporlar\u0131n\u0131 \u00e7ekmeyi veya API \u00fczerinden i\u015flem listesi almay\u0131 otomatikle\u015ftirebilirsiniz. Bu, sisteminizdeki i\u015flemlerle MTN'deki kay\u0131tlar\u0131n e\u015fle\u015fti\u011finden emin olman\u0131z\u0131 sa\u011flar ve olas\u0131 tutars\u0131zl\u0131klar\u0131 erken tespit etmenize yard\u0131mc\u0131 olur.\n<\/div>\n<h3>Mobil Uyumlu HTML ve Responsive Tasar\u0131m \u0130pu\u00e7lar\u0131 (PHP Entegrasyon Ba\u011flam\u0131nda)<\/h3>\n<p>MTN MoMo entegrasyonu backend'de ger\u00e7ekle\u015fse de, kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) taraf\u0131nda mobil uyumluluk modern web uygulamalar\u0131 i\u00e7in vazge\u00e7ilmezdir. Kullan\u0131c\u0131lar\u0131n\u0131z\u0131n mobil cihazlar\u0131ndan \u00f6deme yapma s\u00fcrecini ba\u015flatacaklar\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcrsek, web sayfan\u0131z\u0131n veya uygulaman\u0131z\u0131n bu cihazlarda sorunsuz \u00e7al\u0131\u015fmas\u0131 kritik \u00f6neme sahiptir.<\/p>\n<pre><code class=\"language-html\">\n<!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>MTN MoMo \u00d6deme - Mobil Uyumlu<\/title>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            margin: 0;\n            padding: 20px;\n            background-color: #f4f4f4;\n            color: #333;\n        }\n        .container {\n            max-width: 600px;\n            margin: 20px auto;\n            background-color: #fff;\n            padding: 30px;\n            border-radius: 8px;\n            box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n        }\n        h2 {\n            color: #2c3e50;\n            text-align: center;\n            margin-bottom: 25px;\n        }\n        .form-group {\n            margin-bottom: 20px;\n        }\n        label {\n            display: block;\n            margin-bottom: 8px;\n            font-weight: bold;\n        }\n        input[type=\"tel\"],\n        input[type=\"number\"],\n        input[type=\"text\"] {\n            width: calc(100% - 20px);\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 16px;\n        }\n        button {\n            width: 100%;\n            padding: 12px;\n            background-color: #fccb03; \/* MTN sar\u0131s\u0131 *\/\n            color: #333;\n            border: none;\n            border-radius: 4px;\n            font-size: 18px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: background-color 0.3s ease;\n        }\n        button:hover {\n            background-color: #e0b400;\n        }\n        .message {\n            margin-top: 20px;\n            padding: 15px;\n            border-radius: 4px;\n            text-align: center;\n        }\n        .message.success {\n            background-color: #d4edda;\n            color: #155724;\n            border: 1px solid #c3e6cb;\n        }\n        .message.error {\n            background-color: #f8d7da;\n            color: #721c24;\n            border: 1px solid #f5c6cb;\n        }\n\n        \/* Mobil uyumluluk i\u00e7in Media Query *\/\n        @media (max-width: 768px) {\n            .container {\n                margin: 10px;\n                padding: 20px;\n            }\n            h2 {\n                font-size: 24px;\n            }\n            button {\n                font-size: 16px;\n            }\n        }\n        @media (max-width: 480px) {\n            body {\n                padding: 10px;\n            }\n            .container {\n                border-radius: 0; \/* Mobil ekranlarda k\u00f6\u015feleri yuvarlamay\u0131 kald\u0131r *\/\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h2>MTN Mobile Money ile \u00d6deme Yap<\/h2>\n        <form action=\"process_payment.php\" method=\"POST\">\n            <div class=\"form-group\">\n                <label for=\"amount\">\u00d6denecek Tutar:<\/label>\n                <input type=\"number\" id=\"amount\" name=\"amount\" value=\"10.50\" step=\"0.01\" required>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"phone_number\">MTN MoMo Telefon Numaras\u0131:<\/label>\n                <input type=\"tel\" id=\"phone_number\" name=\"phone_number\" placeholder=\"\u00d6rn: 233241234567\" required>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"order_id\">Sipari\u015f Referans\u0131:<\/label>\n                <input type=\"text\" id=\"order_id\" name=\"order_id\" value=\"ORDER_<?php echo uniqid(); ?>\" readonly>\n            <\/div>\n            <button type=\"submit\">\u00d6deme Talebi Olu\u015ftur<\/button>\n        <\/form>\n        <!-- PHP taraf\u0131nda i\u015flendikten sonra mesajlar burada g\u00f6r\u00fcnt\u00fclenebilir -->\n        <?php\n            \/\/ \u00d6rnek bir PHP mesaj\u0131\n            if (isset($_GET['status']) &#038;&#038; $_GET['status'] == 'success') {\n                echo '<div class=\"message success\">\u00d6deme talebiniz ba\u015far\u0131yla g\u00f6nderildi! Telefonunuzu kontrol edin.<\/div>';\n            } elseif (isset($_GET['status']) && $_GET['status'] == 'error') {\n                echo '<div class=\"message error\">\u00d6deme talebi olu\u015fturulurken bir hata olu\u015ftu. L\u00fctfen tekrar deneyin.<\/div>';\n            }\n        ?>\n    <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnek HTML ve CSS, temel bir MTN MoMo \u00f6deme formunun nas\u0131l responsive olabilece\u011fini g\u00f6stermektedir. <code><meta name=\"viewport\"><\/code> etiketi, mobil cihazlarda do\u011fru \u00f6l\u00e7eklendirme i\u00e7in hayati \u00f6neme sahiptir. <code>@media<\/code> sorgular\u0131 ise, ekran boyutuna g\u00f6re stil de\u011fi\u015fiklikleri yaparak i\u00e7eri\u011fin farkl\u0131 cihazlarda daha iyi g\u00f6r\u00fcnmesini sa\u011flar. Bu sayede, m\u00fc\u015fterileriniz hangi cihaz\u0131 kullan\u0131rlarsa kullans\u0131nlar, sorunsuz bir \u00f6deme deneyimi ya\u015farlar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 rehberde, MTN Mobile Money API'sini PHP ile entegre etmenin temel ad\u0131mlar\u0131ndan ileri d\u00fczey optimizasyonlara kadar bir\u00e7ok konuyu ele ald\u0131k. MTN Developer Portal'da hesap olu\u015fturmaktan API kimlik bilgilerini edinmeye, token almaktan \u00f6deme talebi olu\u015fturmaya ve webhook ile i\u015flem sonu\u00e7lar\u0131n\u0131 i\u015flemeye kadar her a\u015famay\u0131 detayl\u0131ca inceledik. Ayr\u0131ca, e-ticaret siteleri i\u00e7in bir vaka analizi yaparak ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu entegrasyonun nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterdik. G\u00fcvenlik, hata y\u00f6netimi ve performans ipu\u00e7lar\u0131yla entegrasyonunuzu daha sa\u011flam hale getirme yollar\u0131n\u0131 ara\u015ft\u0131rd\u0131k ve mobil uyumlu bir kullan\u0131c\u0131 deneyimi i\u00e7in HTML ve CSS \u00f6rnekleri sunduk.<\/p>\n<p>MTN MoMo entegrasyonu, i\u015fletmelerin Afrika pazar\u0131nda mobil \u00f6deme ekosistemine sorunsuz bir \u015fekilde kat\u0131lmas\u0131 i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. PHP'nin esnekli\u011fi ve geni\u015f k\u00fct\u00fcphane deste\u011fi sayesinde bu entegrasyonu kolayca hayata ge\u00e7irebilirsiniz. Unutmay\u0131n, ba\u015far\u0131l\u0131 bir entegrasyon sadece kod yazmaktan ibaret de\u011fildir; ayn\u0131 zamanda g\u00fcvenlik, hata y\u00f6netimi, performans optimizasyonu ve s\u00fcrekli izleme gerektirir. Bu rehberdeki bilgileri uygulayarak, i\u015fletmenizin dijital \u00f6deme altyap\u0131s\u0131n\u0131 g\u00fc\u00e7lendirecek ve m\u00fc\u015fteri memnuniyetini art\u0131racaks\u0131n\u0131z.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. MTN MoMo API'siyle entegrasyon i\u00e7in hangi programlama dillerini kullanabilirim?<\/strong><\/p>\n<p>MTN MoMo API'si bir RESTful API oldu\u011fu i\u00e7in HTTP istekleri yapabilen herhangi bir programlama diliyle entegre edilebilir. PHP'nin yan\u0131 s\u0131ra Python, Node.js, Java, C# ve Ruby gibi diller de kullan\u0131labilir. Rehberimizde PHP'ye odaklanmam\u0131z\u0131n nedeni, web geli\u015ftirme alan\u0131ndaki yayg\u0131nl\u0131\u011f\u0131 ve cURL gibi g\u00fc\u00e7l\u00fc yerle\u015fik \u00f6zellikleridir.<\/p>\n<p><strong>2. Sandbox ortam\u0131 nedir ve neden \u00f6nemlidir?<\/strong><\/p>\n<p>Sandbox ortam\u0131, ger\u00e7ek para birimi kullan\u0131lmadan API entegrasyonunuzu test etmeniz i\u00e7in MTN taraf\u0131ndan sa\u011flanan bir test ortam\u0131d\u0131r. Canl\u0131 (production) ortama ge\u00e7meden \u00f6nce t\u00fcm entegrasyon ad\u0131mlar\u0131n\u0131, \u00f6deme ak\u0131\u015flar\u0131n\u0131 ve hata senaryolar\u0131n\u0131 bu ortamda kapsaml\u0131 bir \u015fekilde test etmek, olas\u0131 hatalar\u0131n \u00f6n\u00fcne ge\u00e7mek ve uygulaman\u0131z\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><strong>3. Webhook'lar ne i\u015fe yarar ve entegrasyonda neden bu kadar \u00f6nemlidir?<\/strong><\/p>\n<p>Webhook'lar (veya callback URL'leri), MTN gibi \u00fc\u00e7\u00fcnc\u00fc taraf bir servisin, uygulaman\u0131zda belirli bir olay (\u00f6rne\u011fin, bir \u00f6demenin tamamlanmas\u0131 veya ba\u015far\u0131s\u0131z olmas\u0131) ger\u00e7ekle\u015fti\u011finde sizi otomatik olarak bilgilendirmesini sa\u011flayan HTTP POST istekleridir. Bu sayede uygulaman\u0131z\u0131n s\u00fcrekli API'yi sorgulamas\u0131na gerek kalmaz, ger\u00e7ek zamanl\u0131 g\u00fcncellemeler al\u0131r ve sistem kaynaklar\u0131ndan tasarruf edersiniz. \u00d6deme ak\u0131\u015f\u0131n\u0131n asenkron do\u011fas\u0131 gere\u011fi, webhook'lar i\u015flem sonu\u00e7lar\u0131n\u0131 g\u00fcvenilir ve an\u0131nda almak i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<p><strong>4. API anahtar\u0131m\u0131 ve token'\u0131m\u0131 nas\u0131l g\u00fcvenli bir \u015fekilde saklamal\u0131y\u0131m?<\/strong><\/p>\n<p>API anahtarlar\u0131 ve eri\u015fim token'lar\u0131, sisteminize yetkisiz eri\u015fimi sa\u011flayabilecek hassas bilgilerdir. Bunlar\u0131 asla genel depolarda (\u00f6rne\u011fin Git depolar\u0131) veya do\u011frudan istemci taraf\u0131 kodunuzda saklamay\u0131n. Ortam de\u011fi\u015fkenleri, sunucu yap\u0131land\u0131rma dosyalar\u0131 (\u00f6rn: Apache veya Nginx ayarlar\u0131), bulut sa\u011flay\u0131c\u0131lar\u0131n\u0131n gizli y\u00f6neticileri (AWS Secrets Manager, Azure Key Vault) veya \u015fifrelenmi\u015f veritaban\u0131 kay\u0131tlar\u0131 gibi g\u00fcvenli y\u00f6ntemler kullan\u0131n. Ayr\u0131ca, eri\u015fim token'lar\u0131n\u0131z\u0131n k\u0131sa \u00f6m\u00fcrl\u00fc oldu\u011fundan ve s\u00fcresi doldu\u011funda otomatik olarak yenilendi\u011finden emin olun.<\/p>\n<p><strong>5. MTN MoMo entegrasyonunda s\u0131k kar\u015f\u0131la\u015f\u0131lan hatalar nelerdir ve nas\u0131l \u00e7\u00f6z\u00fcl\u00fcr?<\/strong><\/p>\n<p>S\u0131k kar\u015f\u0131la\u015f\u0131lan hatalar genellikle \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Kimlik Do\u011frulama Hatalar\u0131 (401 Unauthorized):<\/strong> Yanl\u0131\u015f API anahtar\u0131, ge\u00e7ersiz eri\u015fim token'\u0131 veya yanl\u0131\u015f <code>X-Target-Environment<\/code> gibi nedenlerden kaynaklan\u0131r. API User ID, API Key ve Subscription Key'lerinizi dikkatlice kontrol edin.<\/li>\n<li><strong>Ge\u00e7ersiz \u0130stek Hatalar\u0131 (400 Bad Request):<\/strong> API'ye g\u00f6nderilen JSON verisinin format\u0131 veya i\u00e7eri\u011fi yanl\u0131\u015ft\u0131r. Alanlar\u0131n do\u011fru t\u00fcrde (\u00f6rn: miktar string olmal\u0131) ve do\u011fru de\u011fer aral\u0131\u011f\u0131nda g\u00f6nderildi\u011finden emin olun.<\/li>\n<li><strong>A\u011f Hatalar\u0131:<\/strong> Sunucunuzun MTN API'sine eri\u015fim sorunlar\u0131 ya\u015famas\u0131 veya g\u00fcvenlik duvar\u0131 engellemeleri olabilir. Sunucu loglar\u0131n\u0131 ve a\u011f ba\u011flant\u0131s\u0131n\u0131 kontrol edin.<\/li>\n<li><strong>\u0130\u015flem Reddi (Webhook'ta FAILED durumu):<\/strong> M\u00fc\u015fterinin \u00f6demeyi onaylamamas\u0131, bakiyesinin yetersiz olmas\u0131 veya MoMo hesab\u0131n\u0131n aktif olmamas\u0131 gibi nedenlerle ortaya \u00e7\u0131kar. Bu durumlarda m\u00fc\u015fteriye net geri bildirimde bulunmal\u0131s\u0131n\u0131z.<\/li>\n<\/ol>\n<p>Her hatada, API'nin d\u00f6nd\u00fcrd\u00fc\u011f\u00fc detayl\u0131 hata mesajlar\u0131n\u0131 (JSON yan\u0131t\u0131 i\u00e7indeki) dikkatlice incelemek, sorunun k\u00f6k nedenini bulmak i\u00e7in en iyi yakla\u015f\u0131md\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Afrika&#8217;n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN&#8217;in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital&hellip;","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":[133],"tags":[],"class_list":{"0":"post-32885","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","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>MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Afrika&#039;n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN&#039;in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital finansal i\u015flemleri kolayca yapmas\u0131n\u0131 sa\u011fl\u0131yor. Peki, bir web sitesi veya uygulaman\u0131z varsa ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme yapma imkan\u0131 sunmak istiyorsan\u0131z ne yapmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, PHP kullanarak MTN Mobile Money API&#039;sini sisteminize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m, s\u0131f\u0131rdan ileri d\u00fczeye kadar \u00f6\u011frenecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla entegrasyonun inceliklerini ke\u015ffedeceksiniz.\" \/>\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\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Afrika&#039;n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN&#039;in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital finansal i\u015flemleri kolayca yapmas\u0131n\u0131 sa\u011fl\u0131yor. Peki, bir web sitesi veya uygulaman\u0131z varsa ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme yapma imkan\u0131 sunmak istiyorsan\u0131z ne yapmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, PHP kullanarak MTN Mobile Money API&#039;sini sisteminize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m, s\u0131f\u0131rdan ileri d\u00fczeye kadar \u00f6\u011frenecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla entegrasyonun inceliklerini ke\u015ffedeceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-26T22:31:21+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\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-10-26T22:31:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/\"},\"wordCount\":3764,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PHP\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/\",\"name\":\"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-26T22:31:21+00:00\",\"description\":\"Afrika'n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN'in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital finansal i\u015flemleri kolayca yapmas\u0131n\u0131 sa\u011fl\u0131yor. Peki, bir web sitesi veya uygulaman\u0131z varsa ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme yapma imkan\u0131 sunmak istiyorsan\u0131z ne yapmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, PHP kullanarak MTN Mobile Money API'sini sisteminize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m, s\u0131f\u0131rdan ileri d\u00fczeye kadar \u00f6\u011frenecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla entegrasyonun inceliklerini ke\u015ffedeceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber\"}]},{\"@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":"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber","description":"Afrika'n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN'in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital finansal i\u015flemleri kolayca yapmas\u0131n\u0131 sa\u011fl\u0131yor. Peki, bir web sitesi veya uygulaman\u0131z varsa ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme yapma imkan\u0131 sunmak istiyorsan\u0131z ne yapmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, PHP kullanarak MTN Mobile Money API'sini sisteminize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m, s\u0131f\u0131rdan ileri d\u00fczeye kadar \u00f6\u011frenecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla entegrasyonun inceliklerini ke\u015ffedeceksiniz.","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\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber","og_description":"Afrika'n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN'in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital finansal i\u015flemleri kolayca yapmas\u0131n\u0131 sa\u011fl\u0131yor. Peki, bir web sitesi veya uygulaman\u0131z varsa ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme yapma imkan\u0131 sunmak istiyorsan\u0131z ne yapmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, PHP kullanarak MTN Mobile Money API'sini sisteminize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m, s\u0131f\u0131rdan ileri d\u00fczeye kadar \u00f6\u011frenecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla entegrasyonun inceliklerini ke\u015ffedeceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-26T22:31:21+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\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber","datePublished":"2025-10-26T22:31:21+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/"},"wordCount":3764,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PHP"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/","name":"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-26T22:31:21+00:00","description":"Afrika'n\u0131n en b\u00fcy\u00fck mobil operat\u00f6rlerinden MTN'in sundu\u011fu mobil \u00f6deme sistemi MTN Mobile Money (MoMo), i\u015fletmelerin ve bireylerin dijital finansal i\u015flemleri kolayca yapmas\u0131n\u0131 sa\u011fl\u0131yor. Peki, bir web sitesi veya uygulaman\u0131z varsa ve m\u00fc\u015fterilerinize MTN MoMo ile \u00f6deme yapma imkan\u0131 sunmak istiyorsan\u0131z ne yapmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, PHP kullanarak MTN Mobile Money API'sini sisteminize nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m, s\u0131f\u0131rdan ileri d\u00fczeye kadar \u00f6\u011frenecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla entegrasyonun inceliklerini ke\u015ffedeceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mtn-mobile-money-php-entegrasyonu-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MTN Mobile Money PHP Entegrasyonu: Kapsaml\u0131 Rehber"}]},{"@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\/32885","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=32885"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32885\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}