1 module iyzipay.iyzipayresource;
2 
3 import std.stdio: writefln;
4 import std.string: indexOf, format;
5 import std.array: appender;
6 import std.net.curl: HTTP;
7 import std.datetime: Clock;
8 import std.digest: toHexString;
9 import std.digest.sha: sha1Of;
10 import std.base64: Base64;
11 import std.experimental.logger;
12 
13 enum VERSION = "0.6.3";
14 enum AUTHORIZATION = "Authorization";
15 enum RANDOM_HEADER_NAME = "x-iyzi-rnd";
16 enum CLIENT_VERSION = "x-iyzi-client-version";
17 enum IYZIWS_HEADER_NAME = "IYZWS ";
18 enum COLON = ":";
19 
20 struct Options
21 {
22     string apiKey;
23     string secretKey;
24     string baseUrl;
25 }
26 
27 class IyzipayResource
28 {
29     public string connectHTTP(HTTP.Method method, string url, Options options, string request = "", string pkiString = "")
30     {
31     	string[string] headers = getHttpHeaders(pkiString, options);
32 
33         writefln("--> %s", pkiString);
34 
35         auto receivedData = appender!string();
36     	HTTP client = HTTP(url);	// Connect API via HTTP
37     	client.method = method;
38     	//client.addRequestHeader("Content-Type", headers["Content-Type"]);
39     	client.addRequestHeader("x-iyzi-rnd", headers["x-iyzi-rnd"]);
40     	client.addRequestHeader("x-iyzi-client-version", headers["x-iyzi-client-version"]);
41     	client.addRequestHeader("Authorization", headers["Authorization"]);
42     	if (method == HTTP.Method.post) client.setPostData(request, "application/json");
43     	client.onReceive = delegate size_t(ubyte[] data) { receivedData.put(data); return data.length; };
44     	client.perform();
45 
46     	return receivedData.data;
47     }
48 
49     private string[string] getHttpHeaders(string pkiString, Options options)
50     {
51         string randomString = Clock.currTime().toISOExtString();
52 
53         string[string] headers;
54         headers["Content-Type"] = "application/json";
55         headers[RANDOM_HEADER_NAME] = randomString;
56         headers[CLIENT_VERSION] = "iyzipay-d-" ~ VERSION;
57         headers[AUTHORIZATION] = prepareAuthorizationString(pkiString, randomString, options);
58         return headers;
59     }
60 
61     private string prepareAuthorizationString(string pkiString, string randomString, Options options)
62     {
63         string hash = Base64.encode(sha1Of(options.apiKey ~ randomString ~ options.secretKey ~ pkiString));
64 
65         //_logger.log("[PKI String] ", pkiString);
66         //_logger.log("[Authorization String] ", IYZIWS_HEADER_NAME ~ options.apiKey ~ COLON ~ hash);
67 
68         return IYZIWS_HEADER_NAME ~ options.apiKey ~ COLON ~ hash;
69     }
70 }