> ## 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 Başlatma

> 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 Ürün Bilgileri ile Ödeme

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

<CodeGroup>
  ```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>

### 2. Ü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>
  ```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'
  ```
</CodeGroup>

### 3. 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>
  ```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'
  ```
</CodeGroup>

### 4. Başarılı İstek Sonucu

<CodeGroup>
  ```json JSON theme={null}
  {
      "status": true,
      "message": "Ödeme işlemi başarılı bir şekilde oluşturuldu.",
      "errors": [],
      "error_code": null,
      "data": {
          "transaction_id": 71118888539024,
          "payment_page_url": "https://payment.tahsilat.com/9ee2a500-894c-44ef-b376-f51e5e86c934-1749678957",
          "expires_at": "2025-06-12T01:10:57+03:00"
      }
  }
  ```
</CodeGroup>

### 5. Hatalı İstek Sonucu

<CodeGroup>
  ```json JSON theme={null}
  {
      "status": false,
      "message": "Doğrulama hataları oluştu.",
      "errors": {
          "customer_id": [
              "Girilen customer id kayıtlarımızda bulunmamaktadır."
          ]
      },
      "error_code": 901,
      "data": null
  }
  ```
</CodeGroup>

## 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 JSON string formatında dizi. Eğer `product_ids` gönderilmiyorsa, bu parametre zorunludur.

  **Format:** JSON string olarak gönderilmelidir.

  **Ürün alanları:**

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

  **Örnek:**

  ```
  products=[{"product_name":"Premium Üyelik","price":10000,"description":"Aylık premium üyelik"}]
  ```

  **Birden fazla ürün:**

  ```
  products=[{"product_name":"Ürün 1","price":5000},{"product_name":"Ürün 2","price":3000}]
  ```
</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>
