3D Secure Ödeme

Ödeme formunun Zotlo tarafından yönetileceği ödeme türüdür.

POST https://api.zotlo.com/v1/payment/create-form-url
3D Secure ödeme yöntemini başlatmak için Zotlo API üzerinden 3D Secure form URL'i oluşturmak gereklidir. 3D Secure ödeme şu şekilde çalışır:
Öncelikle abonelik başlatılacak kullanıcının bilgileri ile o kullanıcıya özel bir ödeme linki oluşturulmalıdır. Sonra servis üzerinden dönecek bu link ile ödeme formu istenirse uygulama içerisinde web görünümünde veya mobil tarayıcıda görüntülenebilir.
Ödeme formları Zotlo varsayılan form tasarımı olarak gelebileceği gibi her uygulama için farklı tasarımlar oluşturulacak şekilde kullanıcılar tarafından da tasarlanabilir.
Üye işyeri tarafından aktifleştirilmesi durumunda ödeme formuna GSM numarası doğrulama işlemi de eklenebilir. Telefon numaralarıyla doğrulama yapan kullanıcıların, takıma ait sağlayıcı üzerinde kayıtlı kartları varsa ve ödeme için yine bu sağlayıcı kullanılacaksa, kayıtlı kartlarıyla abonelik başlatmaları mümkündür.
DİKKAT : Oluşturulan formların 1 saat süresi vardır. 1 saat içerisinde ödeme tamamlanamazsa form iptal edilir.

Servis parametreleri şunlardır:

Alan
Açıklama
Zorunlu
subscriberId
Abonelik başlatılacak kullanıcının id değeri
Evet
subscriberConfirm
Ödeme formundan önce aboneye ait telefon ya da e-mail bilgilerinin doğrulanması işlemini kontrol eden parametredir. optional, off, required değerlerinden birini alabilir. Default değeri optional'dir. off olarak gönderilmesi durumunda otp ekranları aboneye gösterilmeden direk ödeme formu gösterilir. optional gönderildiğinde, eğer aboneye ait e-mail ya da telefon numarası istek ile beraber gönderilirse doğrulama ekranları gösterilmez ve ödeme formu açılır. Ancak e-mail ve telefon numarası boş ise doğrulama ekranı gösterilir. required olarak gönderildiğinde ise her şartta doğrulama ekranları aboneye gösterilir. Doğrulama işleminden sonra ödeme formuna geçebilir.
Hayır (Default optional değerini alır.)
subscriberPhoneNumber
Abonelik başlatılacak kullanıcının mobil telefon numarasıdır.Bu servis ile gönderilmesi zorunlu değiltir. Ancak boş gönderilmesi durumunda ödeme işleminden önce OTP ekranları açılacak, doğrulama işleminden sonra ödeme aşamasına geçilecektir. Servis üzerinden gönderilmesi durumunda kullanıcı direk ödeme formunu görecektir.
Hayır
subscriberFirstname
Abonelik başlatılacak kullanıcının adı. Bu alan zorunlu değildir.
Hayır
subscriberLastname
Abonelik başlatılacak kullanıcının soyadı. Bu alan zorunlu değildir.
Hayır
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.
Evet
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.
Hayır
packageId
Ödeme işlemi başarılı olursa kullanıcının abone olacağı pakettir. Tek seferlik ürün ise o ürüne ait id değeridir.
Evet
platform
Aboneliğin başlatılacağı platformdur.
Evet
formId
Kullanıcıya ödeme aşamasında gösterilecek formun uniq_id değeridir. "Ödeme Formları" servisinden aktif form listesi çekilebilir.
Evet
language
Kullanıcının dili. Bilgilendirme amaçlı mesajlar bu dilde gönderilecektir.
Evet
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.
Hayır
deeplinkUrl
OTP doğrulamasından sonra VerifyKit üzerinden kullanıcıya özel bir link gönderilmek istenirse bu parametrenin gönderilmesi gerekmektedir. Eğer boş gönderilirse ödeme linki sistem tarafından gönderilecektir.
Hayır
customSuccessUrl
Ödeme işlemini başarıyla gerçekleştikten sonra Zotlo'ya ait işlem sonucu sayfası yerine kendinize ait bir sayfa göstermek isterseniz, bu parametrede ilgili sayfa linkini gönderebilirsiniz.
Hayı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 Parametreleri

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

Örnek İstek

Curl
Php
Swift
Java
Python
C#
1
curl --location --request POST 'https://api.zotlo.com/v1/payment/create-form-url' \
2
--header 'AccessKey: ***' \
3
--header 'AccessSecret: ***' \
4
--header 'Content-Type: application/json' \
5
--header 'ApplicationId: 2' \
6
--header 'Language: tr' \
7
--header 'Content-Type: application/json' \
8
--data-raw '{
9
"language":"en",
10
"packageId":"ZotloTest",
11
"platform":"web",
12
"formId":"zotlo-form",
13
"subscriberPhoneNumber":"+905555555555",
14
"subscriberFirstname":"Test",
15
"subscriberLastname":"Test",
16
"subscriberEmail":"[email protected]",
17
"subscriberId":"zotlo-12",
18
"subscriberIpAddress":"127.0.0.1",
19
"subscriberCountry":"TR",
20
"force3ds":0,
21
"deeplinkUrl":"example://zotlo",
22
"customSuccessUrl":""
23
}'
Copied!
1
$curl = curl_init();
2
3
curl_setopt_array($curl, array(
4
CURLOPT_URL => "https://api.zotlo.com/v1/payment/create-form-url",
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 =>"{\"language\":\"en\",\"packageId\":\"ZotloTest\",\"platform\":\"web\",\"formId\":\"zotlo-form\",\"subscriberPhoneNumber\":\"+905555555555\",\"subscriberFirstname\":\"Test\",\"subscriberLastname\":\"Test\",\"subscriberEmail\":\"[email protected]\",\"subscriberId\":\"zotlo-12\",\"subscriberIpAddress\":\"127.0.0.1\",\"subscriberCountry\":\"TR\"\n}",
13
CURLOPT_HTTPHEADER => array(
14
"AccessKey: ***",
15
"AccessSecret: ***",
16
"Content-Type: application/json",
17
"ApplicationId: 2",
18
"Language: tr",
19
"Content-Type: application/json"
20
),
21
));
22
23
$response = curl_exec($curl);
24
25
curl_close($curl);
26
echo $response;
Copied!
1
import Foundation
2
3
var semaphore = DispatchSemaphore (value: 0)
4
5
let parameters = "{\"language\":\"en\",\"packageId\":\"ZotloTest\",\"platform\":\"web\",\"formId\":\"zotlo-form\",\"subscriberPhoneNumber\":\"+905555555555\",\"subscriberFirstname\":\"Test\",\"subscriberLastname\":\"Test\",\"subscriberEmail\":\"[email protected]\",\"subscriberId\":\"zotlo-12\",\"subscriberIpAddress\":\"127.0.0.1\",\"subscriberCountry\":\"TR\"\n}"
6
let postData = parameters.data(using: .utf8)
7
8
var request = URLRequest(url: URL(string: "https://api.zotlo.com/v1/payment/create-form-url")!,timeoutInterval: Double.infinity)
9
request.addValue("***", forHTTPHeaderField: "AccessKey")
10
request.addValue("***", forHTTPHeaderField: "AccessSecret")
11
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
12
request.addValue("2", forHTTPHeaderField: "ApplicationId")
13
request.addValue("tr", forHTTPHeaderField: "Language")
14
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
15
16
request.httpMethod = "POST"
17
request.httpBody = postData
18
19
let task = URLSession.shared.dataTask(with: request) { data, response, error in
20
guard let data = data else {
21
print(String(describing: error))
22
return
23
}
24
print(String(data: data, encoding: .utf8)!)
25
semaphore.signal()
26
}
27
28
task.resume()
29
semaphore.wait()
Copied!
1
OkHttpClient client = new OkHttpClient().newBuilder()
2
.build();
3
MediaType mediaType = MediaType.parse("application/json,application/json");
4
RequestBody body = RequestBody.create(mediaType, "{\"language\":\"en\",\"packageId\":\"ZotloTest\",\"platform\":\"web\",\"formId\":\"zotlo-form\",\"subscriberPhoneNumber\":\"+905555555555\",\"subscriberFirstname\":\"Test\",\"subscriberLastname\":\"Test\",\"subscriberEmail\":\"[email protected]\",\"subscriberId\":\"zotlo-12\",\"subscriberIpAddress\":\"127.0.0.1\",\"subscriberCountry\":\"TR\"\n}");
5
Request request = new Request.Builder()
6
.url("https://api.zotlo.com/v1/payment/create-form-url")
7
.method("POST", body)
8
.addHeader("AccessKey", "***")
9
.addHeader("AccessSecret", "***")
10
.addHeader("Content-Type", "application/json")
11
.addHeader("ApplicationId", "2")
12
.addHeader("Language", "tr")
13
.addHeader("Content-Type", "application/json")
14
.build();
15
Response response = client.newCall(request).execute();
Copied!
1
import requests
2
3
url = "https://api.zotlo.com/v1/payment/create-form-url"
4
5
payload = "{\"language\":\"en\",\"packageId\":\"ZotloTest\",\"platform\":\"web\",\"formId\":\"zotlo-form\",\"subscriberPhoneNumber\":\"+905555555555\",\"subscriberFirstname\":\"Test\",\"subscriberLastname\":\"Test\",\"subscriberEmail\":\"[email protected]\",\"subscriberId\":\"zotlo-12\",\"subscriberIpAddress\":\"127.0.0.1\",\"subscriberCountry\":\"TR\"\n}"
6
headers = {
7
'AccessKey': '***',
8
'AccessSecret': '***',
9
'Content-Type': 'application/json',
10
'ApplicationId': '2',
11
'Language': 'tr',
12
'Content-Type': 'application/json'
13
}
14
15
response = requests.request("POST", url, headers=headers, data = payload)
16
17
print(response.text.encode('utf8'))
Copied!
1
var client = new RestClient("https://api.zotlo.com/v1/payment/create-form-url");
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", "2");
8
request.AddHeader("Language", "tr");
9
request.AddHeader("Content-Type", "application/json");
10
request.AddParameter("application/json,application/json", "{\"language\":\"en\",\"packageId\":\"ZotloTest\",\"platform\":\"web\",\"formId\":\"zotlo-form\",\"subscriberPhoneNumber\":\"+905555555555\",\"subscriberFirstname\":\"Test\",\"subscriberLastname\":\"Test\",\"subscriberEmail\":\"[email protected]\",\"subscriberId\":\"zotlo-12\",\"subscriberIpAddress\":\"127.0.0.1\",\"subscriberCountry\":\"TR\"\n}", ParameterType.RequestBody);
11
IRestResponse response = client.Execute(request);
12
Console.WriteLine(response.Content);
Copied!

Form Oluşturma Başarılıysa

1
{
2
"meta": {
3
"requestId": "app2.localdomain-REQ-5e7dd04390a2d",
4
"httpStatus": 200
5
},
6
"result": {
7
"form": {
8
"formUrl": "https://pay3d.zotlo.com/payment/0e2f69dd9b0cf8c7162a1a71d2ee32bbbe99fa2a",
9
"expireDate": "2020-03-27 11:06:59"
10
}
11
}
12
}
Copied!

Hata Durumları

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": "app1.localdomain-REQ-5e7dcfc97f314",
4
"httpStatus": 400,
5
"errorMessage": "Abonelik başlatılacak paket bulunamadı.",
6
"errorCode": 400002
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