Kredi Kartı ile Abonelik

Zotlo üzerinden kredi kartı ile abonelik başlatma ya da tek seferlik ürünlerden satın alınmasını sağlayan servistir. 3D Secure olmayan ödeme türü için kullanılabilir.

POST https://api.zotlo.com/v1/payment/credit-card
Bu servis üzerinden gönderilen subscriberId ve yine bu servis üzerinden gönderilen packageId ile abonelik başlatılması sağlanabilir ya da tek seferlik satın alınabilen ürünlerin packageId değeri gönderilerek satın alma işlemi gerçekleştirilebilir.
Abonelik paketi satın almalarından sonraki süreçlerde kullanıcıya ait yenileme işlemleri Zotlo tarafından yapılır. Başarılı ya da başarısız işlemlerden sonra callback ile ya da REST servis üzerinden abonenin durumu kontrol edilerek abonelik süreçleri yürütülebilir.
Satın alma işlemlerinde kullanılacak sağlayıcı, ürün tanımlama aşamasında tanımlanır. Ürüne ve kullanıcının ülkesine göre sistem tarafından otomatik olarak o sağlayıcı üzerinden abonelik başlatılır. O yüzden serviste gönderilen ülke fiyat belirlenmesinde kritik bir parametredir.

Ödeme servisi için gönderilmesi gereken parametreler şunlardır.

Alan
Açıklama
cardNo
Kredi kartı numarası. Geçerli formatta gönderilmelidir.
cardOwner
Kredi kartının sahibinin adı.
expireMonth
Kredi kartı son kullanma tarihi ayı. 2 karakter olarak gönderilmelidir.
expireYear
Kredi kartı son kullanma tarihi yılı. 2 karakter olarak gönderilmelidir.
cvv
Kredi kartı güvenlik kodu
packageId
Abonelik başlatılacak veya satın alma yapılacak paket ID değeridir. Eğer paket bir abonelik paketi ise sistem, ilgili kullanıcı için bir abonelik profili oluşturur. Sadece bir kere satın alınan bir ürün ise bu işlem, abonelik profili olmadan satın alma geçmişine kaydedilir. Sistemde olmayan bir ürün gönderildiğinde servis hata döner.
language
Ödemeyi gerçekleştiren kullanıcıya ait dildir. E-posta, SMS gibi bilgilendirme mesajları bu dilde gönderilir.
platform
Yeni bir abone profili oluştururken kullanıcıları gruplandırmak için kullanılır.
subscriberId
Ödeme yapan veya abonelik başlatan kullanıcının id değeridir. Sistemde kullanıcıya ait tüm ödeme ve abonelik işlemleri bu ID üzerinden takip edilir. O yüzden bu ID değerinin uygulama tarafında ilgili kullanıcı için tanımlanması gereklidir. Bu değer string ya da integer olacak şekilde istenilen formatta gönderilebilir.
subscriberPhoneNumber
Abonelik başlatılacak kullanıcının mobil telefon numarasıdır. Abonenin, sisteme giriş yaparak aboneliklerini yönetebilmesi için bu alan zorunludur.
subscriberFirstname
Abonelik başlatılacak kullanıcının adı. Bu alan zorunlu değildir.
subscriberLastname
Abonelik başlatılacak kullanıcının soyadı. Bu alan zorunlu değildir.
subscriberIpAddress
Aboneye ait ip adresidir. Güvenlik doğrulaması için kullanıcıya ait ip adresini göndermeniz gerekmektedir. Hatalı ip gönderimlerine işlemler fraud servisi tarafından engellenebilmektedir.
subscriberCountry
Ödeme yapan veya abonelik başlatan kullanıcının ülke kodudur. Gönderilmesi zorunlu bir alandır. Bu ülke kodu ile kullanıcının ülkesine ait paket bilgileri, paket ücreti ve sağlayıcı değeri kullanılır. O yüzden bu bilginin hatalı gönderilmesi durumunda ödemeler varsayılan sağlayıcı üzerinden gerçekleştirilir.
subscriberEmail
Abonelik başlatılacak e-posta adresi. Bu alan zorunlu değildir. Ancak kullanıcıya satın alma ve aboneliklerle ilgili mail gönderilmesi isteniyorsa e-posta adresinin gönderilmesi gerekmektedir.
cardToken
Eğer kart bilgileri ile değil, kayıtlı kredi kartı ile ödeme gerçekleştirilmek istenirse bu parametrenin gönderilmesi gerekmektedir. "cardToken" değerinin gönderildiği isteklerde kart bilgileri parametrelerinin gönderilmesi zorunlu değildir. Bu serviste gönderebileceğiniz aboneye ait kart listesini "Abonelik Servisleri > Kayıtlı Kredi Kartları" bölümünde anlatıldığı şekilde servisten alabilirsiniz.
redirectUrl
3D Secure ödeme işlemlerinde işlem sonucunun geri döneceği url'dir. Girilmesi zorunlu alandır. Başarılı ya da başarısız olma durumuna göre bu url'e kullanıcı yönlendirilecektir.
discountPercent
Satın alma işlemine özel yüzdelik olarak indirim uygulamak için kullanılan parametredir. Sadece ilk satın almada geçerli olacaktır. Yenileme işlemlerinde paket fiyatı kullanılmaktadır. Varsatılan değeri 0'dır.
quantity
Aynı aboneliğe bağlı birden fazla kullanıcının olduğu aboneliklerde kulanbilir. Gönderilen paket ile, bu alanda gönderilen sayı kadar abonelik ücreti ve yenileme ücreti çekilecektir. Bu değer Abonelik Servisler > Kullanıcı Sayısı Güncelleme servisinden değiştirilebilir. Varsayılan değeri 1'dır.
force3ds
Satın alma işlemini eğer provider destekliyorsa zorunlu olarak 3D Secure olarak başlatmaya zorlar. Eğer provider desteklemiyorsa normal api üzerinden abonelik işlemi başlatılır. Varsayılan değeri 0'dır.
customParameters
Bir abone ile ilgili özel parametreler göndermek için kullanılır. Array olarak gönderilmelidir. Gönderilen parametre daha önce kaydedildiyse güncelleme, ilk defa gönderiliyorsa ekleme işlemi yapılır. Abone profil servisinden ve Webhook'lar üzerinden bu parametreler client'a gönderilmektedir.
Zotlo diğer hizmet entegrasyonları için gerekli olan parametreler customParameters içerisinde gönderilmelidir.

Adjust Parametleri

1
{
2
"customParameters" : {
3
"adjust" : {
4
"oaid" : "",
5
"androidId" : "",
6
"gpsAdid" : "",
7
"idfv" : "",
8
"fireAdid" : "",
9
"adid" : "",
10
"idfa" : ""
11
"osVersion" : ""
12
}
13
}
14
}
Copied!

Kart Bilgileri İle Satın Alma Örnek İstek

Curl
Php
Swift
Java
Python
C#
1
curl --location --request POST 'https://api.zotlo.com/v1/payment/credit-card' \
2
--header 'AccessKey: *****' \
3
--header 'AccessSecret: *****' \
4
--header 'Content-Type: application/json' \
5
--header 'ApplicationId: 6' \
6
--header 'Language: en' \
7
--data-raw '{
8
"cardNo": "4111111111111111",
9
"cardOwner": "Test Test",
10
"expireMonth": "12",
11
"expireYear": "20",
12
"cvv": "649",
13
"language": "tr",
14
"packageId": "zotlo_premium",
15
"platform": "ios",
16
"cardToken": "",
17
"subscriberPhoneNumber": "+905555555555",
18
"subscriberFirstname": "Test",
19
"subscriberLastname": "Test",
20
"subscriberEmail": "[email protected]",
21
"subscriberId": "133",
22
"subscriberIpAddress": "212.154.57.216",
23
"subscriberCountry": "TR",
24
"quantity": 1,
25
"force3ds": 0,
26
"discountPercent": 0,
27
"redirectUrl": "https://example.com/zotlo-callback",
28
"customParameters": {
29
"source": "Landing",
30
"country": "RU"
31
}
32
}'
Copied!
1
$curl = curl_init();
2
3
curl_setopt_array($curl, array(
4
CURLOPT_URL => "https://api.zotlo.com/v1/payment/credit-card",
5
CURLOPT_RETURNTRANSFER => true,
6
CURLOPT_ENCODING => "",
7
CURLOPT_MAXREDIRS => 10,
8
CURLOPT_TIMEOUT => 0,
9
CURLOPT_FOLLOWLOCATION => true,
10
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
11
CURLOPT_CUSTOMREQUEST => "POST",
12
CURLOPT_POSTFIELDS =>"{\n\t\"cardNo\": \"4111111111111111\",\n\t\"cardOwner\": \"Test Test\",\n\t\"expireMonth\": \"12\",\n\t\"expireYear\": \"20\",\n\t\"cvv\": \"649\",\n\t\"language\": \"tr\",\n\t\"packageId\": \"zotlo_premium\",\n\t\"platform\": \"ios\",\n\t\"cardToken\": \"\",\n\t\"subscriberPhoneNumber\": \"+905555555555\",\n\t\"subscriberFirstname\": \"Test\",\n\t\"subscriberLastname\": \"Test\",\n\t\"subscriberEmail\": \"[email protected]\",\n\t\"subscriberId\": \"3133\",\n\t\"subscriberIpAddress\": \"212.154.57.216\",\n\t\"subscriberCountry\": \"TR\",\n\t\"quantity\": 1,\n\t\"force3ds\": 0,\n\t\"discountPercent\": 0,\n\t\"redirectUrl\": \"https://example.com/zotlo-callback\",\n\t\"customParameters\": {\n\t\t\"source\": \"Landing\",\n\t\t\"country\": \"RU\"\n\t}\n}",
13
CURLOPT_HTTPHEADER => array(
14
"AccessKey: *****",
15
"AccessSecret: *****",
16
"Content-Type: application/json",
17
"ApplicationId: 6",
18
"Language: en"
19
),
20
));
21
22
$response = curl_exec($curl);
23
24
curl_close($curl);
25
echo $response;
Copied!
1
import Foundation
2
3
var semaphore = DispatchSemaphore (value: 0)
4
5
let parameters = "{\n\t\"cardNo\": \"4111111111111111\",\n\t\"cardOwner\": \"Test Test\",\n\t\"expireMonth\": \"12\",\n\t\"expireYear\": \"20\",\n\t\"cvv\": \"649\",\n\t\"language\": \"tr\",\n\t\"packageId\": \"zotlo_premium\",\n\t\"platform\": \"ios\",\n\t\"cardToken\": \"\",\n\t\"subscriberPhoneNumber\": \"+905555555555\",\n\t\"subscriberFirstname\": \"Test\",\n\t\"subscriberLastname\": \"Test\",\n\t\"subscriberEmail\": \"[email protected]\",\n\t\"subscriberId\": \"3133\",\n\t\"subscriberIpAddress\": \"212.154.57.216\",\n\t\"subscriberCountry\": \"TR\",\n\t\"quantity\": 1,\n\t\"force3ds\": 0,\n\t\"discountPercent\": 0,\n\t\"redirectUrl\": \"https://example.com/zotlo-callback\",\n\t\"customParameters\": {\n\t\t\"source\": \"Landing\",\n\t\t\"country\": \"RU\"\n\t}\n}"
6
let postData = parameters.data(using: .utf8)
7
8
var request = URLRequest(url: URL(string: "https://api.zotlo.com/v1/payment/credit-card")!,timeoutInterval: Double.infinity)
9
request.addValue("*****", forHTTPHeaderField: "AccessKey")
10
request.addValue("*****", forHTTPHeaderField: "AccessSecret")
11
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
12
request.addValue("6", forHTTPHeaderField: "ApplicationId")
13
request.addValue("en", forHTTPHeaderField: "Language")
14
15
request.httpMethod = "POST"
16
request.httpBody = postData
17
18
let task = URLSession.shared.dataTask(with: request) { data, response, error in
19
guard let data = data else {
20
print(String(describing: error))
21
return
22
}
23
print(String(data: data, encoding: .utf8)!)
24
semaphore.signal()
25
}
26
27
task.resume()
28
semaphore.wait()
Copied!
1
OkHttpClient client = new OkHttpClient().newBuilder()
2
.build();
3
MediaType mediaType = MediaType.parse("application/json");
4
RequestBody body = RequestBody.create(mediaType, "{\n\t\"cardNo\": \"4111111111111111\",\n\t\"cardOwner\": \"Test Test\",\n\t\"expireMonth\": \"12\",\n\t\"expireYear\": \"20\",\n\t\"cvv\": \"649\",\n\t\"language\": \"tr\",\n\t\"packageId\": \"zotlo_premium\",\n\t\"platform\": \"ios\",\n\t\"cardToken\": \"\",\n\t\"subscriberPhoneNumber\": \"+905555555555\",\n\t\"subscriberFirstname\": \"Test\",\n\t\"subscriberLastname\": \"Test\",\n\t\"subscriberEmail\": \"[email protected]\",\n\t\"subscriberId\": \"3133\",\n\t\"subscriberIpAddress\": \"212.154.57.216\",\n\t\"subscriberCountry\": \"TR\",\n\t\"quantity\": 1,\n\t\"force3ds\": 0,\n\t\"discountPercent\": 0,\n\t\"redirectUrl\": \"https://example.com/zotlo-callback\",\n\t\"customParameters\": {\n\t\t\"source\": \"Landing\",\n\t\t\"country\": \"RU\"\n\t}\n}");
5
Request request = new Request.Builder()
6
.url("https://api.zotlo.com/v1/payment/credit-card")
7
.method("POST", body)
8
.addHeader("AccessKey", "*****")
9
.addHeader("AccessSecret", "*****")
10
.addHeader("Content-Type", "application/json")
11
.addHeader("ApplicationId", "6")
12
.addHeader("Language", "en")
13
.build();
14
Response response = client.newCall(request).execute();
Copied!
1
import requests
2
3
url = "https://api.zotlo.com/v1/payment/credit-card"
4
5
payload = "{\n\t\"cardNo\": \"4111111111111111\",\n\t\"cardOwner\": \"Test Test\",\n\t\"expireMonth\": \"12\",\n\t\"expireYear\": \"20\",\n\t\"cvv\": \"649\",\n\t\"language\": \"tr\",\n\t\"packageId\": \"zotlo_premium\",\n\t\"platform\": \"ios\",\n\t\"cardToken\": \"\",\n\t\"subscriberPhoneNumber\": \"+905555555555\",\n\t\"subscriberFirstname\": \"Test\",\n\t\"subscriberLastname\": \"Test\",\n\t\"subscriberEmail\": \"[email protected]\",\n\t\"subscriberId\": \"3133\",\n\t\"subscriberIpAddress\": \"212.154.57.216\",\n\t\"subscriberCountry\": \"TR\",\n\t\"quantity\": 1,\n\t\"force3ds\": 0,\n\t\"discountPercent\": 0,\n\t\"redirectUrl\": \"https://example.com/zotlo-callback\",\n\t\"customParameters\": {\n\t\t\"source\": \"Landing\",\n\t\t\"country\": \"RU\"\n\t}\n}"
6
headers = {
7
'AccessKey': '*****',
8
'AccessSecret': '*****',
9
'Content-Type': 'application/json',
10
'ApplicationId': '6',
11
'Language': 'en'
12
}
13
14
response = requests.request("POST", url, headers=headers, data = payload)
15
16
print(response.text.encode('utf8'))
Copied!
1
var client = new RestClient("https://api.zotlo.com/v1/payment/credit-card");
2
client.Timeout = -1;
3
var request = new RestRequest(Method.POST);
4
request.AddHeader("AccessKey", "*****");
5
request.AddHeader("AccessSecret", "*****");
6
request.AddHeader("Content-Type", "application/json");
7
request.AddHeader("ApplicationId", "6");
8
request.AddHeader("Language", "en");
9
request.AddParameter("application/json", "{\n\t\"cardNo\": \"4111111111111111\",\n\t\"cardOwner\": \"Test Test\",\n\t\"expireMonth\": \"12\",\n\t\"expireYear\": \"20\",\n\t\"cvv\": \"649\",\n\t\"language\": \"tr\",\n\t\"packageId\": \"zotlo_premium\",\n\t\"platform\": \"ios\",\n\t\"cardToken\": \"\",\n\t\"subscriberPhoneNumber\": \"+905555555555\",\n\t\"subscriberFirstname\": \"Test\",\n\t\"subscriberLastname\": \"Test\",\n\t\"subscriberEmail\": \"[email protected]\",\n\t\"subscriberId\": \"3133\",\n\t\"subscriberIpAddress\": \"212.154.57.216\",\n\t\"subscriberCountry\": \"TR\",\n\t\"quantity\": 1,\n\t\"force3ds\": 0,\n\t\"discountPercent\": 0,\n\t\"redirectUrl\": \"https://example.com/zotlo-callback\",\n\t\"customParameters\": {\n\t\t\"source\": \"Landing\",\n\t\t\"country\": \"RU\"\n\t}\n}", ParameterType.RequestBody);
10
IRestResponse response = client.Execute(request);
11
Console.WriteLine(response.Content);
Copied!

Satın Alma İşlemi Başarıyla Gerçekleşirse

Satın Alma Yapan Kullanıcının Abonelik Profili Varsa
1
{
2
"meta": {
3
"requestId": "6d2989e84793-REQ-5f293cfb2e297",
4
"httpStatus": 200
5
},
6
"result": {
7
"profile": {
8
"status": "active",
9
"realStatus": "active",
10
"subscriberId": "3133",
11
"subscriptionType": "paid",
12
"startDate": "2020-08-04 10:48:30",
13
"expireDate": "2020-09-03 10:48:30",
14
"package": "zotlo_premium",
15
"country": "TR",
16
"phoneNumber": "+905555555555",
17
"language": "tr",
18
"originalTransactionId": "325afb73-8abe-4bbb-a1f9-679066ed3002",
19
"cancellation": null,
20
"customParameters": {
21
"source": "Landing",
22
"country": "RU"
23
},
24
"quantity": 1,
25
"pendingQuantity": 0
26
},
27
"package": {
28
"packageId": "zotlo_premium",
29
"price": 2.99,
30
"currency": "USD",
31
"packageType": "subscription",
32
"name": "Zotlo Premium"
33
},
34
"customer": {
35
"id": 1,
36
"createDate": "2020-05-13 12:57:36",
37
"country": "TR",
38
"firstname": "Test",
39
"lastname": "Test",
40
"email": "[email protected]"
41
},
42
"newPackage": {
43
"subscriberId": "3133",
44
"packageId": "zotlo_premium",
45
"startDate": "2020-08-04 10:48:30",
46
"createDate": "2020-08-04 10:48:30",
47
"discountPrice": "0.00",
48
"price": "2.99",
49
"currency": "USD",
50
"period": 30
51
},
52
"card": {
53
"cardNumber": "411111******1111",
54
"expireDate": "12/20"
55
},
56
"response": {
57
"isSuccess": true,
58
"transactionId": "325afb73-8abe-4bbb-a1f9-679066ed3002",
59
"providerTransactionId": "c6657732-c8d1-4361-880e-4ee94228ca0f",
60
"customTransactionId": "e731ad6e72bf34f490f37f45d6d8476c",
61
"statusCode": "S0000001",
62
"statusMessage": "Transaction completed successfully.",
63
"paymentDate": "2020-08-04 10:48:30",
64
"providerStatus": null,
65
"paymentStatus": "COMPLETE",
66
"redirectUrl": null,
67
"paymentProvider": "Zotlopay"
68
},
69
"redirect": null,
70
"paymentStatus": "COMPLETE",
71
"paymentHash": "152d4c812deb1b1da98d3843add2e631d940fd5a"
72
}
73
}
Copied!
Satın Alma Yapan Kullanıcının Abonelik Profili Yoksa ve Sadece Tek Seferlik Ürün Aldıysa
1
{
2
"meta": {
3
"requestId": "MacBook-Pro.local-REQ-5e7c9a333f7e3",
4
"httpStatus": 200
5
},
6
"result": {
7
"profile": null,
8
"package": {
9
"name": "Hata Yapma Hakkı",
10
"packageId": "ads",
11
"price": 0.01,
12
"currency": "TRY"
13
},
14
"card": null,
15
"response": {
16
"isSuccess": true,
17
"transactionId": "d466a305-6116-4ac4-944e-ba358dda0fc9",
18
"customTransactionId": "dfc5ea3de3bcda288cfaed25b7a366c9",
19
"statusCode": "S0000001",
20
"statusMessage": "Ödeme işlemi başarıyla tamamlandı.",
21
"paymentDate": "2020-03-26 12:04:05",
22
"providerResponse": {}
23
}
24
}
25
}
Copied!
Başarılı Cevap Parametleri
Alan
Açıklama
profile
Eğer satın alınan paket abonelik paketi ise ya da kullanıcının daha önceden bir aboneliği varsa dolu gelir. Diğer durumlarda "null" olarak dönülür.
isSuccess
"True" ise ödeme işlemi başarılı.
transactionId
Ödeme sağlayıcı tarafından ilgili ödeme için verilen id .
customTransactionId
Zotlo tarafından ilgili ödeme için verilen id
statusCode
Zotlo tarafından dönülen ödeme durum kodu. Hata Kodları > Ödeme Hata Kodları bölümünden tüm kodları görebilirsiniz.
providerResponse
O ödemede kullanılan sağlayıcı tarafından dönülen işlem sonucudur. Her sağlayıcı için farklılık gösterebilir.
Satın Alınan Paket Abonelik Paketiyse PROFILE Parametreleri
Alan
Açıklama
status
Abonenin durumunu verir. active ya da passive değerini alabilir.
subscriptionType
Kullanıcının aboneliğinin durumunu veren parametredir. trial ya da paid değerlerini alır. "trial" ise abone henüz deneme süresi içerisindedir. "paid" olduğunda da kullanıcı ücretli süreye geçmiş ve en az bir kere paket ücreti çekilmiş demektir.
startDate
Aboneliğin başladığı tarih
expireDate
Abonelik bitiş tarihi. Bu tarihte abonelik yenileme işlemleri yapılır.
package
Aktif aboneliğinin olduğu paket
country
Kullanıcının ülkesi
language
Kullanıcının dili.
cancellation
Eğer "null" ise kullanıcı hesabı aktif durumdadır. İlk abonelik işleminden sonra bu parametre "null" gelir.

Hata Durumları

Ödeme servislerinden HTTP status code olarak başarılı durumlarda 200 dönmektedir. Başarısız durumlarda ise 400 ya da 500 Http StatusCode dönmektedir. Örnek hata cevabı aşağıdaki şekildedir.
1
{
2
"meta": {
3
"requestId": "MacBook-Pro.local-REQ-5e7ce1aa1eb10",
4
"httpStatus": 400,
5
"errorMessage": "Abonelik oluşturmaya çalıştığınız kullanıcıya ait aktif bir abonelik bulunmaktadır.",
6
"errorCode": 400007
7
},
8
"result": []
9
}
Copied!
Cevap
Açıklama
requestId
Her istek için sistem tarafından atanan id değeridir. Sistemsel hatalarda log'lardan hata yakalamak için kullanılır.
httpStatus
Hatanın HTTP durum kodu değeri
errorMessage
Hata mesajı. Tüm hata kodlarına "Hata Kodları" menüsünden ulaşabilirsiniz.
errorCode
İlgili hata için Zotlo tarafından verilen hata kodu
Last modified 2mo ago