Teknik Entegrasyon Spesifikasyonu

Paymore PF (Payment Facilitator) Entegrasyon Rehberi

Firma onboarding, onay süreci, merchant yaşam döngüsü ve satış bildirim servislerinin uçtan uca entegrasyon sözleşmesi.

Sürüm1.0 Hedef KitlePF ürün, yazılım, operasyon ve entegrasyon ekipleri ProtokolHTTPS + JSON Kimlik DoğrulamaHTTP Basic Authentication KapsamFirma Onboarding + Satış Bildirimi

1. Amaç ve Kapsam

Bu doküman, bir PF’in (Payment Facilitator) Paymore ile entegre olabilmesi için gerekli iş akışlarını, request/response sözleşmelerini, alan dönüşümlerini ve hata davranışlarını açıklar.

Doküman dış entegrasyon sözleşmesine odaklanır. Paymore’un iç servis, kod, repository veya altyapı isimleri kapsam dışındadır.

2. Genel Mimari

PF → Paymore

Firma Onboarding

PF, firma bilgilerini Paymore’a gönderir. Başvuru kaydedilir ve inceleme/onay sürecine alınır.

Paymore → PF

Satış Bildirimi

Paymore, PF kapsamındaki başarılı veya başarısız işlem bilgilerini PF’in bildirim servisine gönderir.

PF Platformu
Firma Başvurusu
Paymore Onayı
Aktif Firma
Satış Bildirimi

3. Mesaj Yönleri

MesajYön
Firma Onboarding RequestPF → Paymore
Firma Onboarding ResponsePaymore → PF
Satış Bildirimi RequestPaymore → PF
Satış Bildirimi ResponsePF → Paymore

4. Kimlik Doğrulama

Her iki yöndeki servis çağrılarında HTTP Basic Authentication kullanılır. Tüm trafik HTTPS üzerinden gerçekleştirilmelidir.

Authorization: Basic <base64(kullaniciAdi:sifre)>
Content-Type: application/json
Test ve canlı ortam URL’leri ile kimlik bilgileri entegrasyon başlangıcında güvenli kanal üzerinden paylaşılır.

5. Firma Onboarding

PF
Paymore
POST{PAYMORE_BASE_URL}/{PF_ONBOARDING_PATH}
Yön: PF → Paymore
Kimlik Doğrulama: HTTP Basic Auth
Content-Type: application/json

Paymore, başvuruyu aldıktan sonra anlık olarak bir data.id döndürür. Bu değer başvurunun sisteme alındığını gösterir; onay durumunu göstermez.

Önemli: Onboarding response içindeki data.id, firmanın onaylandığı anlamına gelmez. Aynı response şekli incelemede, revizyonda veya daha önce onaylanmış/tekrar kullanılan bir kayıt için de dönebilir.

5.1 Minimum Geçerli Request

{
  "taxPayerType": 2,
  "type": 2,
  "taxNumber": "1234567890",
  "merchantName": "Örnek Otomat Ticaret A.Ş.",
  "merchantShortName": "Örnek Otomat",
  "firstName": "Ahmet",
  "familyName": "Yılmaz",
  "invoiceTitle": "Örnek Otomat Ticaret A.Ş.",
  "invoiceEMail": "muhasebe@ornekotomat.com.tr",
  "invoicePhone": "5551234567",
  "integratorShortName": "PAYMORE",
  "allowOfflineSales": false,
  "invoiceAddress": {
    "countryName": "Türkiye",
    "cityName": "İstanbul",
    "districtName": "Kadıköy",
    "neighborhoodName": "Caferağa",
    "addressDetail": "Örnek Sokak No:1 D:2"
  },
  "adminUser": {
    "fullName": "Ahmet Yılmaz",
    "email": "ahmet.yilmaz@ornekotomat.com.tr",
    "phone": "5551234567"
  }
}

5.2 Tam Request

{
  "taxPayerType": 2,
  "type": 2,
  "taxNumber": "1234567890",
  "merchantName": "Örnek Otomat Ticaret A.Ş.",
  "merchantShortName": "Örnek Otomat",
  "firstName": "Ahmet",
  "familyName": "Yılmaz",
  "invoiceTitle": "Örnek Otomat Ticaret A.Ş.",
  "invoiceEMail": "muhasebe@ornekotomat.com.tr",
  "invoicePhone": "5551234567",
  "mersisNo": "1234567890123456",
  "taxOfficeCode": "123456",
  "integratorShortName": "PAYMORE",
  "allowOfflineSales": false,
  "invoiceAddress": {
    "countryName": "Türkiye",
    "cityName": "İstanbul",
    "districtName": "Kadıköy",
    "neighborhoodName": "Caferağa",
    "addressDetail": "Örnek Sokak No:1 D:2"
  },
  "adminUser": {
    "fullName": "Ahmet Yılmaz",
    "email": "ahmet.yilmaz@ornekotomat.com.tr",
    "phone": "5551234567"
  }
}

5.3 Response Örnekleri

200 — Başarılı
{
  "success": true,
  "data": { "id": "64f1c2a1e4b0a1b2c3d4e5f6" },
  "message": "Merchant application has been received successfully."
}
400 / 500 — Hata
{
  "success": false,
  "data": null,
  "message": "An error occured."
}
401 — Yetkisiz
{
  "success": false,
  "data": null,
  "message": "Unauthorized"
}
409 — Çakışma
{
  "success": false,
  "data": null,
  "message": "Bu vergi numarasıyla eşleşen birden fazla firma kaydı bulundu, manuel inceleme gerekiyor."
}

6. Onboarding Alanları

6.1 Üst Seviye Alanlar

AlanTipGerçek DurumBoş StringAçıklama
taxPayerTypeinteger (1,2)ZorunluUygulanmaz1 = Bireysel, 2 = Kurumsal
typeinteger (1,2)ZorunluUygulanmaz1 = EDOC_POS, 2 = PHY_POS
taxNumberstringTeknik olarak zorunluKabul edilirVKN/TCKN; boş string gönderilirse null’a normalize edilebilir
merchantNamestringTeknik olarak zorunluKabul edilirYeni firma oluşursa name ve legalName kaynağıdır
merchantShortNamestringTeknik olarak zorunluKabul edilirBaşvuruda saklanır; mevcut onay akışında firmaya taşınmaz
firstNamestringTeknik olarak zorunluKabul edilirfamilyName ile birleştirilerek fullName oluşturulur
familyNamestringTeknik olarak zorunluKabul edilirfirstName ile birleştirilir
invoiceTitlestringTeknik olarak zorunluKabul edilirBaşvuruda saklanır; mevcut onay akışında firmaya taşınmaz
invoiceEMailstring / emailGerçek anlamda zorunluReddedilirGeçerli e-posta formatı gerekir
invoicePhonestringTeknik olarak zorunluKabul edilirYeni firma oluşursa telefon alanına taşınır
mersisNostringOpsiyonelGönderilmemiş sayılırBaşvuruda saklanabilir; onay akışında firmaya taşınmaz
taxOfficeCodestring / 6 karakterOpsiyonel / koşulluReddedilirGönderilirse tam 6 karakter olmalıdır
integratorShortNamestringTeknik olarak zorunluKabul edilirBaşvuruda saklanır; onay akışında firmaya taşınmaz
allowOfflineSalesbooleanZorunluUygulanmazGönderilmezse validation hatası oluşur
invoiceAddressobjectZorunluUygulanmazAlt alanları ayrıca doğrulanır
adminUserobjectZorunluUygulanmazAlt alanları ayrıca doğrulanır
Teknik olarak zorunlu ifadesi, alanın request içinde bulunmasının zorunlu olduğu ancak bazı string alanlarda boş değer gönderilebildiği anlamına gelir.

6.2 invoiceAddress Alanları

AlanTipDurumBoş StringEşleştirme
countryNamestringZorunluKabul edilirBaşvuruda country
cityNamestringZorunluKabul edilirBaşvuruda city
districtNamestringZorunluKabul edilirBaşvuruda district ve birleşik address
neighborhoodNamestringZorunluKabul edilirBirleşik address
addressDetailstringZorunluKabul edilirBirleşik address

6.3 adminUser Alanları

AlanTipDurumBoş StringEşleştirme
fullNamestringZorunluKabul edilirBaşvuruda contact.fullName
emailstring / emailGerçek anlamda zorunluReddedilirBaşvuruda contact.email
phonestringZorunluKabul edilirBaşvuruda contact.phoneNumber

7. Onboarding Alan Eşleştirmeleri

PF Request AlanıBaşvuru AlanıOnay Sonrası Firma AlanıDönüşüm / Not
taxNumbertaxNumbertaxNoTrim + normalize; VKN/TCKN eşleşmesinde kullanılır
merchantNamefirmNamename ve legalNameYeni firma oluşursa taşınır
merchantShortNamefirmShortNameKullanılmıyorBaşvuruda saklanır
firstName + familyNamefullNameFirma kullanıcısı adıBoş değerler çıkarılıp birleştirilir
invoiceTitlefirmLegalNameKullanılmıyorMevcut onay akışında legalName’i belirlemez
invoiceEMailemailmailYeni firma oluşursa taşınır
invoicePhonephoneNumberphoneYeni firma oluşursa taşınır
mersisNomersisNoKullanılmıyorSadece truthy ise kaydedilir
taxOfficeCodetaxOfficeCodeKullanılmıyorGönderilirse 6 karakter
invoiceAddresscountry, city, district, addressaddressAddress = district + neighborhood + detail
adminUsercontactKullanılmıyorphone → phoneNumber isim dönüşümü
integratorShortNameintegratorShortNameKullanılmıyorBirebir saklanır
allowOfflineSalesallowOfflineSalesKullanılmıyorBoolean
taxPayerTypefirmTypeKullanılmıyor1/2 enum
typepaymentTypeKullanılmıyor1/2 enum

8. Onay Süreci ve Firma Yaşam Döngüsü

1
Başvuru Oluşturulur
PF request’i alınır ve başvuru kaydı oluşturulur.
2
İnceleme Bekler
Başvuru operasyonel incelemeye alınır.
3
Revizyon / Onay
Eksik bilgi varsa revizyon istenir; uygun başvuru onaylanır.
4
Firma Aktifleşir
Onboarding sırasında dönen kimlik korunur ve satış bildirimlerinde merchantId olarak kullanılır.
Merchant kimliği kuralı: PF’e onboarding sırasında verilen kimlik onay sonrasında değiştirilmez.

9. Satış Bildirimi

Paymore
PF
POST{PF_WEBHOOK_BASE_URL}/{TRANSACTION_NOTIFICATION_PATH}
Yön: Paymore → PF
Kimlik Doğrulama: HTTP Basic Auth
Content-Type: application/json
Başarı kriteri: responseCode === "00"
PF sorumluluğu: PF, transaction bildirimlerini alabilmek için Paymore’a erişilebilir bir webhook URL’i sağlamalıdır. Bu URL test ve canlı ortamlar için ayrı ayrı tanımlanabilir.
POS İşlemi
Receipt
PF Routing
PF Webhook
Response Kaydı

9.1 Başarılı İşlem Request’i

{
  "id": 564107581,
  "createDate": "2026-08-01T14:22:10.481Z",
  "batchId": 12,
  "stan": 345,
  "transactionAmount": 88.5,
  "finalAmount": 88.5,
  "loyaltyAmount": 0,
  "installmentCount": 1,
  "finalInstallmentCount": 1,
  "cardNo": "411111******1111",
  "authorizationCode": "A1B2C3",
  "failMessage": null,
  "acquirerBKMCode": "0015",
  "merchantId": "64f1c2a1e4b0a1b2c3d4e5f6",
  "statusId": 2,
  "operationTypeId": 1,
  "cardType": "C",
  "acquirerReference": 564107581,
  "rrn": "123456789012",
  "isCancellation": false
}

9.2 Başarısız / İptal İşlem Request’i

{
  "id": 564107582,
  "createDate": "2026-08-01T14:25:03.112Z",
  "transactionAmount": 45.0,
  "finalAmount": 45.0,
  "loyaltyAmount": 0,
  "installmentCount": 1,
  "finalInstallmentCount": 1,
  "cardNo": "411111******1111",
  "failMessage": null,
  "merchantId": "64f1c2a1e4b0a1b2c3d4e5f6",
  "statusId": 3,
  "operationTypeId": 2,
  "acquirerReference": 564107582,
  "isCancellation": true
}

9.3 PF Response Örnekleri

Başarılı
{ "responseCode": "00" }
Başarısız
{ "responseCode": "05" }
Paymore yalnızca responseCode alanını zorunlu olarak değerlendirir. "00" başarılı kabul edilir; diğer değerler başarısız/bekleyen olarak işlenir.

10. Satış Alan Eşleştirmeleri

Paymore Kaynak AlanıDönüşümPF Request AlanıTipDurum
ReferCodeString → integeridintegerZorunlu
ReferCodeString → integeracquirerReferenceintegerZorunlu
createdAtBirebircreateDateISO date stringZorunlu
BatchNumNumeric conversionbatchIdintegerOpsiyonel; undefined ise çıkarılır
transactionNumNumeric conversionstanintegerOpsiyonel; undefined ise çıkarılır
TransAmountKuruş → ana birim (/100)transactionAmountnumberZorunlu
transactionAmountAynı değerfinalAmountnumberZorunlu
Sabit 0loyaltyAmountnumberZorunlu
Sabit 1installmentCountintegerZorunlu
Sabit 1finalInstallmentCountintegerZorunlu
CardNumBirebir, maskelenmişcardNostringZorunlu
AuthCodeBirebirauthorizationCodestringOpsiyonel; falsy ise çıkarılır
Sabit nullfailMessagenullZorunlu
acqIDYeniden adlandırmaacquirerBKMCodestringOpsiyonel
PF merchant kimliğiBirebirmerchantIdstringZorunlu
RespCode === "00"Boolean → integerstatusIdinteger2 başarılı, 3 başarısız
RespCode === "00"Boolean → integeroperationTypeIdinteger1 başarılı, 2 başarısız/iptal
AccountLinecredit/debit metin analizicardTypestringC veya D; bulunamazsa çıkarılır
bankRRNYeniden adlandırmarrnstringKoşullu
RespCode === "00"NegasyonuisCancellationbooleanZorunlu

11. Retry ve Idempotency

Başarısız satış bildirimleri tekrar gönderilebilir. Başarılı işlemler idempotency kontrolü ile korunur ve ikinci kez gönderilmez.

Gönderim
Başarılı mı?
Hayır: Retry Adayı
Tekrar Gönderim
Başarılı / Bekleyen
Başarılı satış bildirimi duplicate olarak tekrar işlenmez.

12. Hata Senaryoları

SenaryoBeklenen Davranış
401 UnauthorizedBasic Authentication bilgileri kontrol edilir
400 Validation ErrorEksik/geçersiz alanlar düzeltilir
409 ConflictFirma kaydı manuel incelenir
5xxİstek başarısız kabul edilir; retry planlanır
Network / TimeoutResponse alınamaz; işlem başarısız kaydedilir
Duplicate Successİkinci gönderim engellenir
Merchant ID EksikOnboarding ve onay süreci tamamlanmalıdır
Transaction Amount = 0Bildirim gönderilmez

13. Sequence Diagramları

13.1 Firma Onboarding

PF                         Paymore                    Operasyon
|                             |                           |
|-- Onboarding Request ------>|                           |
|<-- 200 + data.id -----------|                           |
|                             |-- İnceleme Kuyruğu ------>|
|                             |<-- Onay / Revizyon -------|
|                             |-- Firma Aktif ------------|

13.2 Satış Bildirimi

POS                        Paymore                         PF
|                             |                           |
|-- Ödeme Sonucu ------------>|                           |
|                             |-- Satış Request --------->|
|                             |<-- responseCode ----------|
|                             |-- Sonuç Kaydı ------------|

14. API Özeti

APIYönMethodPathAuth
Firma OnboardingPF → PaymorePOST{PAYMORE_BASE_URL}/{PF_ONBOARDING_PATH}Basic Auth
Satış Bildirimi WebhookPaymore → PFPOST{PF_WEBHOOK_BASE_URL}/{TRANSACTION_NOTIFICATION_PATH}Basic Auth
PF, Paymore’a test ve canlı ortamlar için erişilebilir webhook URL’lerini sağlamalıdır. Gerçek URL ve credential bilgileri güvenli kanal üzerinden paylaşılır.

15. Entegrasyon Kontrol Listesi

  • ☐ Test ve canlı ortam URL’leri tanımlandı
  • ☐ Her iki yön için Basic Auth bilgileri tanımlandı
  • ☐ Onboarding request alanları eşleştirildi
  • data.id değeri saklanıyor
  • ☐ Onay sonrası merchant kimliği korunuyor
  • ☐ PF webhook URL’i Paymore’a iletildi
  • ☐ Satış endpoint’i hazırlandı
  • responseCode="00" başarı davranışı uygulandı
  • ☐ Retry davranışı uygulandı
  • ☐ Duplicate başarılı işlem koruması test edildi
  • ☐ Uçtan uca test firması ve test işlemi tamamlandı