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 }