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.
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.
2. Genel Mimari
Firma Onboarding
PF, firma bilgilerini Paymore’a gönderir. Başvuru kaydedilir ve inceleme/onay sürecine alınır.
Satış Bildirimi
Paymore, PF kapsamındaki başarılı veya başarısız işlem bilgilerini PF’in bildirim servisine gönderir.
3. Mesaj Yönleri
| Mesaj | Yön |
|---|---|
| Firma Onboarding Request | PF → Paymore |
| Firma Onboarding Response | Paymore → PF |
| Satış Bildirimi Request | Paymore → PF |
| Satış Bildirimi Response | PF → 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
5. Firma Onboarding
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.
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
{
"success": true,
"data": { "id": "64f1c2a1e4b0a1b2c3d4e5f6" },
"message": "Merchant application has been received successfully."
}
{
"success": false,
"data": null,
"message": "An error occured."
}
{
"success": false,
"data": null,
"message": "Unauthorized"
}
{
"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
| Alan | Tip | Gerçek Durum | Boş String | Açıklama |
|---|---|---|---|---|
| taxPayerType | integer (1,2) | Zorunlu | Uygulanmaz | 1 = Bireysel, 2 = Kurumsal |
| type | integer (1,2) | Zorunlu | Uygulanmaz | 1 = EDOC_POS, 2 = PHY_POS |
| taxNumber | string | Teknik olarak zorunlu | Kabul edilir | VKN/TCKN; boş string gönderilirse null’a normalize edilebilir |
| merchantName | string | Teknik olarak zorunlu | Kabul edilir | Yeni firma oluşursa name ve legalName kaynağıdır |
| merchantShortName | string | Teknik olarak zorunlu | Kabul edilir | Başvuruda saklanır; mevcut onay akışında firmaya taşınmaz |
| firstName | string | Teknik olarak zorunlu | Kabul edilir | familyName ile birleştirilerek fullName oluşturulur |
| familyName | string | Teknik olarak zorunlu | Kabul edilir | firstName ile birleştirilir |
| invoiceTitle | string | Teknik olarak zorunlu | Kabul edilir | Başvuruda saklanır; mevcut onay akışında firmaya taşınmaz |
| invoiceEMail | string / email | Gerçek anlamda zorunlu | Reddedilir | Geçerli e-posta formatı gerekir |
| invoicePhone | string | Teknik olarak zorunlu | Kabul edilir | Yeni firma oluşursa telefon alanına taşınır |
| mersisNo | string | Opsiyonel | Gönderilmemiş sayılır | Başvuruda saklanabilir; onay akışında firmaya taşınmaz |
| taxOfficeCode | string / 6 karakter | Opsiyonel / koşullu | Reddedilir | Gönderilirse tam 6 karakter olmalıdır |
| integratorShortName | string | Teknik olarak zorunlu | Kabul edilir | Başvuruda saklanır; onay akışında firmaya taşınmaz |
| allowOfflineSales | boolean | Zorunlu | Uygulanmaz | Gönderilmezse validation hatası oluşur |
| invoiceAddress | object | Zorunlu | Uygulanmaz | Alt alanları ayrıca doğrulanır |
| adminUser | object | Zorunlu | Uygulanmaz | Alt alanları ayrıca doğrulanır |
6.2 invoiceAddress Alanları
| Alan | Tip | Durum | Boş String | Eşleştirme |
|---|---|---|---|---|
| countryName | string | Zorunlu | Kabul edilir | Başvuruda country |
| cityName | string | Zorunlu | Kabul edilir | Başvuruda city |
| districtName | string | Zorunlu | Kabul edilir | Başvuruda district ve birleşik address |
| neighborhoodName | string | Zorunlu | Kabul edilir | Birleşik address |
| addressDetail | string | Zorunlu | Kabul edilir | Birleşik address |
6.3 adminUser Alanları
| Alan | Tip | Durum | Boş String | Eşleştirme |
|---|---|---|---|---|
| fullName | string | Zorunlu | Kabul edilir | Başvuruda contact.fullName |
| string / email | Gerçek anlamda zorunlu | Reddedilir | Başvuruda contact.email | |
| phone | string | Zorunlu | Kabul edilir | Başvuruda contact.phoneNumber |
7. Onboarding Alan Eşleştirmeleri
| PF Request Alanı | Başvuru Alanı | Onay Sonrası Firma Alanı | Dönüşüm / Not |
|---|---|---|---|
| taxNumber | taxNumber | taxNo | Trim + normalize; VKN/TCKN eşleşmesinde kullanılır |
| merchantName | firmName | name ve legalName | Yeni firma oluşursa taşınır |
| merchantShortName | firmShortName | Kullanılmıyor | Başvuruda saklanır |
| firstName + familyName | fullName | Firma kullanıcısı adı | Boş değerler çıkarılıp birleştirilir |
| invoiceTitle | firmLegalName | Kullanılmıyor | Mevcut onay akışında legalName’i belirlemez |
| invoiceEMail | Yeni firma oluşursa taşınır | ||
| invoicePhone | phoneNumber | phone | Yeni firma oluşursa taşınır |
| mersisNo | mersisNo | Kullanılmıyor | Sadece truthy ise kaydedilir |
| taxOfficeCode | taxOfficeCode | Kullanılmıyor | Gönderilirse 6 karakter |
| invoiceAddress | country, city, district, address | address | Address = district + neighborhood + detail |
| adminUser | contact | Kullanılmıyor | phone → phoneNumber isim dönüşümü |
| integratorShortName | integratorShortName | Kullanılmıyor | Birebir saklanır |
| allowOfflineSales | allowOfflineSales | Kullanılmıyor | Boolean |
| taxPayerType | firmType | Kullanılmıyor | 1/2 enum |
| type | paymentType | Kullanılmıyor | 1/2 enum |
8. Onay Süreci ve Firma Yaşam Döngüsü
PF request’i alınır ve başvuru kaydı oluşturulur.
Başvuru operasyonel incelemeye alınır.
Eksik bilgi varsa revizyon istenir; uygun başvuru onaylanır.
Onboarding sırasında dönen kimlik korunur ve satış bildirimlerinde merchantId olarak kullanılır.
9. Satış Bildirimi
Kimlik Doğrulama: HTTP Basic Auth
Content-Type: application/json
Başarı kriteri:
responseCode === "00"
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
{ "responseCode": "00" }
{ "responseCode": "05" }
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üşüm | PF Request Alanı | Tip | Durum |
|---|---|---|---|---|
| ReferCode | String → integer | id | integer | Zorunlu |
| ReferCode | String → integer | acquirerReference | integer | Zorunlu |
| createdAt | Birebir | createDate | ISO date string | Zorunlu |
| BatchNum | Numeric conversion | batchId | integer | Opsiyonel; undefined ise çıkarılır |
| transactionNum | Numeric conversion | stan | integer | Opsiyonel; undefined ise çıkarılır |
| TransAmount | Kuruş → ana birim (/100) | transactionAmount | number | Zorunlu |
| transactionAmount | Aynı değer | finalAmount | number | Zorunlu |
| — | Sabit 0 | loyaltyAmount | number | Zorunlu |
| — | Sabit 1 | installmentCount | integer | Zorunlu |
| — | Sabit 1 | finalInstallmentCount | integer | Zorunlu |
| CardNum | Birebir, maskelenmiş | cardNo | string | Zorunlu |
| AuthCode | Birebir | authorizationCode | string | Opsiyonel; falsy ise çıkarılır |
| — | Sabit null | failMessage | null | Zorunlu |
| acqID | Yeniden adlandırma | acquirerBKMCode | string | Opsiyonel |
| PF merchant kimliği | Birebir | merchantId | string | Zorunlu |
| RespCode === "00" | Boolean → integer | statusId | integer | 2 başarılı, 3 başarısız |
| RespCode === "00" | Boolean → integer | operationTypeId | integer | 1 başarılı, 2 başarısız/iptal |
| AccountLine | credit/debit metin analizi | cardType | string | C veya D; bulunamazsa çıkarılır |
| bankRRN | Yeniden adlandırma | rrn | string | Koşullu |
| RespCode === "00" | Negasyonu | isCancellation | boolean | Zorunlu |
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.
12. Hata Senaryoları
| Senaryo | Beklenen Davranış |
|---|---|
| 401 Unauthorized | Basic Authentication bilgileri kontrol edilir |
| 400 Validation Error | Eksik/geçersiz alanlar düzeltilir |
| 409 Conflict | Firma kaydı manuel incelenir |
| 5xx | İstek başarısız kabul edilir; retry planlanır |
| Network / Timeout | Response alınamaz; işlem başarısız kaydedilir |
| Duplicate Success | İkinci gönderim engellenir |
| Merchant ID Eksik | Onboarding ve onay süreci tamamlanmalıdır |
| Transaction Amount = 0 | Bildirim 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
| API | Yön | Method | Path | Auth |
|---|---|---|---|---|
| Firma Onboarding | PF → Paymore | POST | {PAYMORE_BASE_URL}/{PF_ONBOARDING_PATH} | Basic Auth |
| Satış Bildirimi Webhook | Paymore → PF | POST | {PF_WEBHOOK_BASE_URL}/{TRANSACTION_NOTIFICATION_PATH} | Basic Auth |
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.iddeğ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ı