{"id":15,"date":"2026-09-23T20:40:53","date_gmt":"2026-09-23T20:40:53","guid":{"rendered":"https:\/\/www.akifsen.com.tr\/blog\/?p=15"},"modified":"2026-09-23T20:40:53","modified_gmt":"2026-09-23T20:40:53","slug":"odeme-api-idempotency-payment-intent","status":"publish","type":"post","link":"https:\/\/www.akifsen.com.tr\/blog\/2026\/09\/23\/odeme-api-idempotency-payment-intent\/","title":{"rendered":"\u00d6deme API&#8217;lerinde Idempotency: Kullan\u0131c\u0131 Ayn\u0131 \u00d6demeyi \u0130ki Kez Yapmas\u0131n"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Bir \u00f6deme sisteminde en tehlikeli bug&#8217;lardan biri uygulaman\u0131n \u00e7\u00f6kmesi de\u011fildir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6deme ba\u015far\u0131l\u0131 oldu\u011fu halde uygulaman\u0131n <strong>ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 bilmemesidir.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kullan\u0131c\u0131 \u201c\u00d6de\u201d butonuna bast\u0131.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Backend bankaya iste\u011fi g\u00f6nderdi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Banka paray\u0131 \u00e7ekti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tam o anda network ba\u011flant\u0131s\u0131 koptu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Backend response alamad\u0131.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u015eimdi ne yapaca\u011f\u0131z?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tekrar g\u00f6ndermek mant\u0131kl\u0131 g\u00f6r\u00fcn\u00fcr. Fakat ilk i\u015flem ba\u015far\u0131l\u0131ysa m\u00fc\u015fteriden ikinci kez para \u00e7ekme riski do\u011far.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130\u015fte idempotency burada devreye girer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ayn\u0131 niyet, ayn\u0131 sonu\u00e7<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Idempotent bir \u00f6deme endpoint&#8217;i ayn\u0131 mant\u0131ksal i\u015flemi tekrar ald\u0131\u011f\u0131nda yeni bir \u00f6deme olu\u015fturmak yerine \u00f6nceki i\u015flemin sonucunu d\u00f6nd\u00fcrmelidir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe&#8217;\u0131n API tasar\u0131m\u0131 da bu yakla\u015f\u0131m\u0131 kullan\u0131yor. Ayn\u0131 idempotency key ile tekrar edilen i\u015flemlerde ilk \u00e7a\u011fr\u0131n\u0131n sonucunun tekrar d\u00f6nd\u00fcr\u00fclmesi, ba\u011flant\u0131 problemlerinde request&#8217;in g\u00fcvenle yeniden denenebilmesini sa\u011fl\u0131yor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6rne\u011fin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/api\/payments\n\nIdempotency-Key: 78be9f63-...\n\n{\n  \"paymentIntentId\": \"PI-2026-000184\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Backend&#8217;de anahtar ve request fingerprint saklanabilir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>idempotency_key\nrequest_hash\npayment_id\nstatus\nresponse\ncreated_at<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ayn\u0131 key yeniden geldi\u011finde yeni banka i\u015flemi ba\u015flat\u0131lmaz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tutar\u0131 URL&#8217;den almak iyi bir \u00f6deme tasar\u0131m\u0131 de\u011fildir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u015e\u00f6yle bir ak\u0131\u015f d\u00fc\u015f\u00fcn\u00fcn:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/pay?student=123&amp;amount=12750<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kullan\u0131c\u0131n\u0131n browser&#8217;dan de\u011fi\u015ftirebildi\u011fi bir de\u011fer \u00f6deme sisteminin source of truth&#8217;u olamaz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Daha sa\u011fl\u0131kl\u0131 tasar\u0131m \u015fudur:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ana uygulama server-to-server ileti\u015fimle bir payment intent olu\u015fturur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/payment-intents<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6deme sistemi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"paymentIntent\": \"PI_X8A2...\",\n  \"expiresAt\": \"...\",\n  \"redirectToken\": \"...\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00fcretir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kullan\u0131c\u0131 browser \u00fczerinden yaln\u0131zca opaque token ile y\u00f6nlendirilir.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/pay\/PI_X8A2...?token=...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ger\u00e7ek tutar payment sisteminin kendi g\u00fcvenilir storage&#8217;\u0131ndan okunur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Client hi\u00e7bir zaman \u00f6deme tutar\u0131n\u0131n otoritesi de\u011fildir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Callback de ayn\u0131 derecede \u00f6nemlidir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6deme tamamland\u0131ktan sonra kullan\u0131c\u0131 browser&#8217;\u0131n\u0131n ba\u015far\u0131 sayfas\u0131na gelmesini transaction sonucu olarak kabul etmek do\u011fru de\u011fildir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Browser kapanabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0130nternet kesilebilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kullan\u0131c\u0131 redirect olmadan sekmeyi kapatabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ger\u00e7ek settlement bilgisi banka\/provider taraf\u0131ndan server-to-server callback veya webhook ile do\u011frulanmal\u0131d\u0131r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Webhook&#8217;un kendisi de duplicate gelebilece\u011finden callback consumer&#8217;\u0131 idempotent olmal\u0131d\u0131r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu nedenle \u00f6deme sistemlerinde idempotency sadece API tasar\u0131m\u0131 de\u011fildir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">U\u00e7tan uca bir ilkedir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AWS&#8217;nin g\u00fcvenli retry tasar\u0131m\u0131 hakk\u0131ndaki dok\u00fcmantasyonu da ayn\u0131 noktaya dikkat \u00e7ekiyor: retry i\u015fleminin g\u00fcvenli olabilmesi i\u00e7in \u00e7a\u011fr\u0131n\u0131n yan etkilerinin tekrar olu\u015fmamas\u0131 gerekir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6deme sistemlerinin g\u00fcvenilirli\u011fi \u201ciste\u011fi g\u00f6nderdim\u201d noktas\u0131nda ba\u015flamaz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As\u0131l soru \u015fudur:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ayn\u0131 i\u015flem \u00fc\u00e7 farkl\u0131 sebeple \u00fc\u00e7 kez gelirse sistem h\u00e2l\u00e2 do\u011fru sonucu \u00fcretir mi?<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bir \u00f6deme sisteminde en tehlikeli bug&#8217;lardan biri uygulaman\u0131n \u00e7\u00f6kmesi de\u011fildir. \u00d6deme ba\u015far\u0131l\u0131 oldu\u011fu halde uygulaman\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 bilmemesidir. Kullan\u0131c\u0131 \u201c\u00d6de\u201d butonuna bast\u0131. Backend bankaya iste\u011fi g\u00f6nderdi. Banka paray\u0131 \u00e7ekti. Tam o anda network ba\u011flant\u0131s\u0131 koptu. Backend response alamad\u0131. \u015eimdi ne yapaca\u011f\u0131z? Tekrar g\u00f6ndermek mant\u0131kl\u0131 g\u00f6r\u00fcn\u00fcr. Fakat ilk i\u015flem ba\u015far\u0131l\u0131ysa m\u00fc\u015fteriden ikinci kez para \u00e7ekme [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-15","post","type-post","status-publish","format-standard","hentry","category-mimari"],"_links":{"self":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":1,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/15\/revisions"}],"predecessor-version":[{"id":16,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/15\/revisions\/16"}],"wp:attachment":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/media?parent=15"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/categories?post=15"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/tags?post=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}