> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tahsilat.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 3DS Ödeme

> Modern ödeme altyapısı için güçlü ve esnek API çözümü

3DS (3D Secure) ödeme, güvenli kart ödemelerini desteklemek için geliştirilmiş bir protokoldür. Tahsilat API'de 3DS ödemeler, tek bir istek ile başlatılır.

<Note>
  Ödeme tutarı ile ürünler arasındaki toplam tutarın eşleşmesi gerekmektedir. Aksi takdirde, ödeme reddedilir.
</Note>

<Warning>
  Ödeme işlemi başlatırken products parametresi yerine product\_ids ya da customer\_id kullanarak tanımlı ürün ya da müşteri bilgilerini kullanabilirsiniz.
</Warning>

### 1. Doğrudan Ödeme

Ürün ya da müşteri bilgisi belirtmeden doğrudan ödeme isteği tanımlayabilirsiniz:

<CodeGroup>
  ```php PHP theme={null}
  $tahsilat = new TahsilatClient('sk_test_rwwg...');

  $payment = $tahsilat->payments->create([
      'currency' => 'TRY',
      'amount' => 1000,
      'metadata' => [
          'order_id' => 123456,
          'customer_type' => "premium"
      ],
  ]);
  ```

  ```javascript JS theme={null}
  const tahsilat = new TahsilatSDK('pk_test_wsg...');
  const elements = tahsilat.elements();

  const paymentElement = elements.create('payment', {
      amount: 1000,
      metadata: [
          { key: "order_id", value: "123456" },
          { key: "customer_type", value: "premium" }
      ],
  });

  paymentElement.mount('#payment-element');
  ```

  ```c# .NET theme={null}
  var tahsilat = new TahsilatClient("sk_test_rwwg...");

  var request = new PaymentCreateRequest
  {
      Currency = "TRY",
      Amount = 1000,
      Metadata = new()
      {
          new Dictionary<string, object>
          {
              ["order_id"] = 123456,
              ["customer_type"] = "premium"
          }
      }
  };

  var response = await tahsilat.Payments.CreateAsync(request);
  ```

  ```bash cURL theme={null}
  curl -L 'https://api.tahsilat.com/v1/payment/3ds' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Accept-Language: tr' \
  -H 'Authorization: Bearer {access_token}' \
  -d 'amount=2000' \
  -d 'currency=TRY' \
  -d 'redirect_url=https://example.com' \
  -d 'metadata[0][key]=order_id' \
  -d 'metadata[0][value]=order_521234125' \
  -d 'metadata[1][key]=description' \
  -d 'metadata[1][value]=Test'
  ```
</CodeGroup>

### 2. Doğrudan Ürün Bilgileri ile Ödeme

Ürün bilgilerini doğrudan ödeme isteği içerisinde tanımlayabilirsiniz:

<CodeGroup>
  ```php PHP theme={null}
  $tahsilat = new TahsilatClient('sk_test_rwwg...');

  $payment = $tahsilat->payments->create([
      'currency' => 'TRY',
      'amount' => 1000,
      'products' => [
  		[
  			'product_name' => 'Test Product',
  			'price' => 1000,
  			'description' => 'This is a test product',
  		],
  	],
      'metadata' => [
          'order_id' => 123456,
          'customer_type' => "premium"
      ],
  ]);
  ```

  ```js JS theme={null}
  const tahsilat = new TahsilatSDK('pk_test_wsg...');
  const elements = tahsilat.elements();

  const paymentElement = elements.create('payment', {
      amount: 1000,
      products: [
          {
              product_name: 'Test Product',
              price: 1000,
              description: "This is a test product"
          }
      ],
      metadata: [
          { key: "order_id", value: "123456" },
          { key: "customer_type", value: "premium" }
      ],
  });

  paymentElement.mount('#payment-element');
  ```

  ```c# .NET theme={null}
  var tahsilat = new TahsilatClient("sk_test_rwwg...");

  var request = new PaymentCreateRequest
  {
      Currency = "TRY",
      Amount = 1000,
      Products = new List<ProductItem>
      {
          new ProductItem
          {
              ProductName = "Test Product",
              Price = 1000,
              Description = "This is a test product"
          },
      },
      Metadata = new()
      {
          new Dictionary<string, object>
          {
              ["order_id"] = 123456,
              ["customer_type"] = "premium"
          },
      },
  };

  var response = await tahsilat.Payments.CreateAsync(request);
  ```

  ```curl cURL theme={null}
  curl -L 'https://api.tahsilat.com/v1/payment/3ds' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Accept-Language: tr' \
  -H 'Authorization: Bearer {access_token}' \
  -d 'amount=2000' \
  -d 'currency=TRY' \
  -d 'redirect_url=https://example.com' \
  -d 'products=[{"product_name": "test", "price": 1000, "description": "Test Açıklaması 1" }, { "product_name": "Test Ürünü 2", "price": 1000, "description": "Test Açıklaması 2" }]' \
  -d 'metadata[0][key]=order_id' \
  -d 'metadata[0][value]=order_521234125' \
  -d 'metadata[1][key]=description' \
  -d 'metadata[1][value]=Test'
  ```
</CodeGroup>

### 3. Ürün ID'leri ile Ödeme

Önceden oluşturulmuş ürünlerin ID'lerini kullanarak ödeme başlatabilirsiniz bu durumda ürünleriniz hakkında raporlama ve analiz yapabilirsiniz:

Ürünlerin toplam tutarı, ödeme tutarı ile eşleşmelidir. Eğer ürünlerinizin toplam tutarı ödeme tutarından düşükse, ödeme reddedilir.

Ürün oluşturmak için [Ürünler](../api-reference/products) sayfasını ziyaret edebilirsiniz.

<CodeGroup>
  ```php PHP theme={null}
  $payment = $tahsilat->payments->create([
      'currency' => 'TRY',
      'amount' => 1000,
      'product_ids' => ['11111111111111', '2222222222222'],
      'metadata' => [
          'order_id' => 123456,
          'customer_type' => "premium"
      ],
  ]);
  ```

  ```js JS theme={null}
  const tahsilat = new TahsilatSDK('pk_test_wsg...');
  const elements = tahsilat.elements();

  const paymentElement = elements.create('payment', {
      amount: 1000,
      product_ids: ['11111111111111', '2222222222222'],
      metadata: [
          { key: "order_id", value: "123456" },
          { key: "customer_type", value: "premium" }
      ],
  });

  paymentElement.mount('#payment-element');
  ```

  ```curl cURL theme={null}
  curl -L 'https://api.tahsilat.com/v1/payment/3ds' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Accept-Language: tr' \
  -H 'Authorization: Bearer {access_token}' \
  -d 'amount=2000' \
  -d 'currency=TRY' \
  -d 'redirect_url=https://example.com' \
  -d 'product_ids[0]=55437751141488' \
  -d 'product_ids[1]=84920468860151' \
  -d 'metadata[0][key]=order_id' \
  -d 'metadata[0][value]=order_521234125' \
  -d 'metadata[1][key]=description' \
  -d 'metadata[1][value]=Test'
  ```

  ```csharp .NET theme={null}
  var tahsilat = new TahsilatClient("sk_test_rwwg...");

  var request = new PaymentCreateRequest
  {
      Amount = 1000,
      Currency = "TRY",
      ProductIds = new List<long>
      {
          11111111111111,
          22222222222222
      },
      Metadata = new()
      {
          new Dictionary<string, object>
          {
              ["order_id"] = 123456,
              ["customer_type"] = "premium"
          },
      },
  };

  var response = await tahsilat.Payments.CreateAsync(request);
  ```
</CodeGroup>

### 4. Müşteri ile İlişkilendirilmiş Ödeme

Mevcut bir müşteriyi ödeme ile ilişkilendirmek için `customer_id` parametresini kullanabilirsiniz. Bu durumda ödeme esnasında müşteri bilgileri tekrardan alınmaz:

Müşteri oluşturmak için [Müşteriler](../api-reference/customers) sayfasını ziyaret edebilirsiniz.

<CodeGroup>
  ```php PHP theme={null}
  $payment = $tahsilat->payments->create([
      'currency' => 'TRY',
      'amount' => 1000,
      'customer_id' => '99999999999999',
      'product_ids' => ['12345678901234', '23456789012345'],
  ]);
  ```

  ```js JS theme={null}
  const tahsilat = new TahsilatSDK('pk_test_wsg...');
  const elements = tahsilat.elements();

  const paymentElement = elements.create('payment', {
      amount: 1000,
      customer_id: '99999999999999',
      product_ids: ['11111111111111', '2222222222222'],
      metadata: [
          { key: "order_id", value: "123456" },
          { key: "customer_type", value: "premium" }
      ],
  });

  paymentElement.mount('#payment-element');
  ```

  ```curl cURL theme={null}
  curl -L 'https://api.tahsilat.com/v1/payment/3ds' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Accept-Language: tr' \
  -H 'Authorization: Bearer {access_token}' \
  -d 'customer_id=20585467989184' \
  -d 'amount=2000' \
  -d 'currency=TRY' \
  -d 'redirect_url=https://example.com' \
  -d 'product_ids[0]=55437751141488' \
  -d 'product_ids[1]=84920468860151' \
  -d 'metadata[0][key]=order_id' \
  -d 'metadata[0][value]=order_521234125' \
  -d 'metadata[1][key]=description' \
  -d 'metadata[1][value]=Test'
  ```

  ```csharp .NET theme={null}
  var tahsilat = new TahsilatClient("sk_test_rwwg...");

  var request = new PaymentCreateRequest
  {
      Amount = 1000,
      Currency = "TRY",
      CustomerId = 99999999999999,
      ProductIds = new List<long>
      {
          11111111111111,
          22222222222222
      },
      Metadata = new()
      {
          new Dictionary<string, object>
          {
              ["order_id"] = 123456,
              ["customer_type"] = "premium"
          },
      },
  };

  var response = await tahsilat.Payments.CreateAsync(request);
  ```
</CodeGroup>

<Warning>
  Ödeme isteği oluşturulurken customer\_id gönderilmemesi durumunda her ödeme için müşteri bilgileri tekrar alınır ve yeni bir müşteri oluşturulur. Bu durumda müşteri takibi ve raporlama süreci zorlaşabilir.

  Üye işyeri arayüzünden ya da [Müşteriler](../api-reference/customers) sayfasından api aracılığı ile müşteri oluşturarak customer\_id parametresini kullanabilirsiniz.
</Warning>

## Zorunlu ve İsteğe Bağlı Parametreler

<ResponseField name="customer_id" type="integer">
  Ödeme ile ilişkilendirilecek müşteri ID'si. Bu parametre isteğe bağlıdır, ancak müşteri takibi için önerilir.
</ResponseField>

<ResponseField name="amount" type="integer" required>
  Ödeme tutarı, kuruş cinsinden belirtilmelidir. Örneğin, 10.00 TL için 1000 olarak girilmelidir. Son 2 hane her zaman kuruş olarak kabul edilir.
</ResponseField>

<ResponseField name="currency" type="string" required>
  Ödeme para birimi. 3 haneli ISO 4217 kodu olarak belirtilmelidir (örn. "TRY" - Türk Lirası).
</ResponseField>

<ResponseField name="redirect_url" type="string">
  Ödeme sonrası yönlendirilecek URL. Bu parametre boş bırakılır ya da gönderilmezse, varsayılan olarak Tahsilat ödeme sonuç sayfasına yönlendirilir.

  Query paremetresi olarak sadece "transaction\_id" içermelidir. Örneğin: `https://www.example.com/odeme-sonucu?transaction_id=1234567890`
</ResponseField>

<ResponseField name="pre_auth" type="bool">
  Ödeme ön provizyon olarak başlatılacaksa true, normal ödeme için false olarak belirtilmelidir. Varsayılan değer false'dir.
</ResponseField>

<ResponseField name="products" type="array" required>
  Ödeme ile ilişkilendirilecek ürünlerin bilgilerini içeren dizi. Eğer product\_ids gönderilmiyorsa, bu parametre zorunludur. Her ürün için aşağıdaki alanlar belirtilmelidir:

  * `product_name`: Ürün adı (string)
  * `price`: Ürün fiyatı (integer) (kuruş cinsinden)
  * `description`: Ürün açıklaması (string) (isteğe bağlı)
</ResponseField>

<ResponseField name="product_ids" type="array" required>
  Ödeme ile ilişkilendirilecek ürünlerin ID'lerini içeren dizi. Eğer products gönderilmiyorsa, bu parametre zorunludur. Her ürün için Tahsilat API'de önceden oluşturulmuş ürün ID'leri kullanılmalıdır.
</ResponseField>

<ResponseField name="metadata" type="array">
  Ödeme ile ilişkilendirilecek ek verileri içeren dizi. Bu parametre isteğe bağlıdır, ancak ödeme raporlaması için önerilir. Örneğin, müşteri türü gibi bilgiler burada saklanabilir.
</ResponseField>

<ResponseField name="description" type="string">
  Ödeme ile ilgili açıklama. Bu parametre isteğe bağlıdır ve ödeme hakkında ek bilgi sağlamak için kullanılabilir.
</ResponseField>

<div className="panels">
  <Panel>
    İstek

    <CodeGroup>
      ```php PHP theme={null}
      $tahsilat = new TahsilatClient('sk_test_rwwg...');

      $payment = $tahsilat->payments->create([
          'currency' => 'TRY',
          'amount' => 1000,
          'metadata' => [
              'order_id' => 123456,
              'customer_type' => "premium"
          ],
      ]);
      ```

      ```js JS theme={null}
      const tahsilat = new TahsilatSDK('pk_test_wsg...');
      const elements = tahsilat.elements();

      const paymentElement = elements.create('payment', {
          amount: 1000,
          metadata: [
              { key: "order_id", value: "123456" },
              { key: "customer_type", value: "premium" }
          ],
      });

      paymentElement.mount('#payment-element');
      ```

      ```c# .NET theme={null}
       var tahsilat = new TahsilatClient("sk_test_rwwg...");

       var request = new PaymentCreateRequest
        {
            Currency = "TRY",
            Amount = 1000,
            Metadata = new()
            {
                new Dictionary<string, object>
                {
                    ["order_id"] = 123456,
                    ["customer_type"] = "premium"
                }
            }
        };

        var response = await tahsilat.Payments.CreateAsync(request);
      ```

      ```curl cURL theme={null}
          curl -L 'https://api.tahsilat.com/v1/payment/3ds' \
          -H 'Content-Type: application/x-www-form-urlencoded' \
          -H 'Accept-Language: tr' \
          -H 'Authorization: Bearer {access_token}' \
          -d 'amount=2000' \
          -d 'currency=TRY' \
          -d 'redirect_url=https://example.com' \ -d 'metadata[0][key]=order_id' \
          -d 'metadata[0][value]=order_521234125' \
          -d 'metadata[1][key]=description' \
          -d 'metadata[1][value]=Test'
      ```
    </CodeGroup>

    <br />

    Yanıt

    <CodeGroup>
      ```php PHP theme={null}
      ^ Tahsilat\Resource\Payment {
          "transaction_id": 20094833802557
          "payment_page_url": "https://payment.tahsilat.com/fd094314-df08-48c7-a690-6bbeffd29d11-1234567890"
          "expires_at": "2025-06-11T12:06:35+03:00"
      }
      ```

      ```js JS theme={null}
      // Iframe olarak ya da direkt yönlendirme ile ödeme sayfasına yönlendirilir.
      ```

      ```c# .NET theme={null}
       {
            "ExpiresAt": "2026-03-03T23:50:38+03:00",
            "PaymentPageUrl": "https://payment.sandbox.tahsilat.com/432d05ad-599c-4096-a91a-9b72c0856e39-1772570138",
            "TransactionId": 42794571540514
        }
      ```

      ```curl cURL theme={null}
          {
              "transaction_id": 20094833802557,
              "payment_page_url": "https://payment.tahsilat.com/fd094314-df08-48c7-a690-6bbeffd29d11-1234567890",
              "expires_at": "2025-06-11T12:06:35+03:00"
          }
      ```
    </CodeGroup>

    <Note>
      Secret key sadece arka uçta kullanılmalı ve asla açıkta olmamalıdır.
      Public key’i güvenle mobil ve web uygulamalarınızda kullanabilirsiniz.
    </Note>
  </Panel>
</div>
