Chilkat HOME Android™ Classic ASP C C++ C# Mono C# .NET Core C# C# UWP/WinRT DataFlex Delphi ActiveX Delphi DLL Visual FoxPro Java Lianja MFC Objective-C Perl PHP ActiveX PHP Extension PowerBuilder PowerShell PureBasic CkPython Chilkat2-Python Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ Visual Basic 6.0 VB.NET VB.NET UWP/WinRT VBScript Xojo Plugin Node.js Excel Go
(MFC) Ibanity XS2A List Financial InstitutionsSee more Ibanity ExamplesDemonstrates how to send a request to get a list of financial institutions. For more information, see https://documentation.ibanity.com/xs2a/api/curl#authentication
#include <CkCert.h> #include <CkDateTime.h> #include <CkCrypt2.h> #include <CkStringBuilder.h> #include <CkPrivateKey.h> #include <CkRsa.h> #include <CkHttp.h> #include <CkJsonObject.h> void ChilkatSample(void) { CkString strOut; // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // Send the following request: // $ curl -X GET https://api.ibanity.com/xs2a/financial-institutions \ // --cert certificate.pem \ // --key private_key.pem \ // -H 'Signature: keyId="75b5d796-de5c-400a-81ce-e72371b01cbc",created=1599659223,algorithm="hs2019",headers="(request-target) digest (created) host",signature="BASE64(RSA-SHA256(SIGNING_STRING))"' \ // -H 'Digest: SHA-512=beDaRguyEb8fhh5wnl37bOTDtvhuYZyZNkTZ9LiC9Wc=' // Ibanity provides the certificate + private key in PFX format. This example will use the .pfx instead of the pair of PEM files. // (It is also possible to implement using Chilkat with the PEM files, but PFX is easier.) CkCert cert; bool success = cert.LoadPfxFile("qa_data/pfx/my_ibanity_certificate.pfx","my_pfx_password"); if (success == false) { strOut.append(cert.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } // We need to calculate the Digest and Signature header fields. // For a detailed explanation, see Calculate Ibanity HTTP Signature Example // We'll just write the code here as briefly as possible. CkDateTime dtNow; dtNow.SetFromCurrentSystemTime(); const char *created = dtNow.getAsUnixTimeStr(false); CkCrypt2 crypt2; crypt2.put_HashAlgorithm("sha512"); crypt2.put_EncodingMode("base64"); CkStringBuilder sbDigestHdrValue; sbDigestHdrValue.Append("SHA-512="); // GET requests have empty payloads. The SHA-512 hash of the empty string is the same for all GET requests. // Therefore all GET requests will use "z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" // You can eliminate the explicit hash computation (for GET requests) and simply use the above literal string. sbDigestHdrValue.Append(crypt2.hashStringENC("")); strOut.append("Generated Digest"); strOut.append("\r\n"); strOut.append(sbDigestHdrValue.getAsString()); strOut.append("\r\n"); const char *request_target = "get /xs2a/financial-institutions"; CkStringBuilder sbSigningString; sbSigningString.Append("(request-target): "); sbSigningString.AppendLine(request_target,false); sbSigningString.Append("host: "); sbSigningString.AppendLine("api.ibanity.com",false); sbSigningString.Append("digest: "); sbSigningString.AppendLine(sbDigestHdrValue.getAsString(),false); sbSigningString.Append("(created): "); sbSigningString.Append(created); // ibanity-idempotency-key is not used with GET requests. strOut.append("Signing String:"); strOut.append("\r\n"); strOut.append(sbSigningString.getAsString()); strOut.append("\r\n"); const char *signed_headers_list = "(request-target) host digest (created)"; CkPrivateKey privKey; success = privKey.LoadEncryptedPemFile("my_ibanity_signature_private_key.pem","pem_password"); if (success == false) { strOut.append(privKey.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } CkRsa rsa; rsa.put_PssSaltLen(32); rsa.put_EncodingMode("base64"); // Use the RSASSA-PSS signature algorithm rsa.put_OaepPadding(true); success = rsa.ImportPrivateKeyObj(privKey); if (success == false) { strOut.append(rsa.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } // Sign the signing string. const char *sigBase64 = rsa.signStringENC(sbSigningString.getAsString(),"sha-256"); if (rsa.get_LastMethodSuccess() == false) { strOut.append(rsa.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } strOut.append("Signature:"); strOut.append("\r\n"); strOut.append(sigBase64); strOut.append("\r\n"); // Build the signature header value. CkStringBuilder sbSigHeaderValue; sbSigHeaderValue.Append("keyId=\""); // Use your identifier for the application's signature certificate, obtained from the Developer Portal sbSigHeaderValue.Append("a0ce296d-84c8-4bd5-8eb4-de0339950cfa"); sbSigHeaderValue.Append("\",created="); sbSigHeaderValue.Append(created); sbSigHeaderValue.Append(",algorithm=\"hs2019\",headers=\""); sbSigHeaderValue.Append(signed_headers_list); sbSigHeaderValue.Append("\",signature=\""); sbSigHeaderValue.Append(sigBase64); sbSigHeaderValue.Append("\""); // Send the GET request.. CkHttp http; success = http.SetSslClientCert(cert); if (success == false) { strOut.append(http.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } http.SetRequestHeader("Signature",sbSigHeaderValue.getAsString()); http.SetRequestHeader("Digest",sbDigestHdrValue.getAsString()); CkStringBuilder sbResponseBody; success = http.QuickGetSb("https://api.ibanity.com/xs2a/financial-institutions",sbResponseBody); if (success == false) { strOut.append(http.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } CkJsonObject jResp; jResp.LoadSb(sbResponseBody); jResp.put_EmitCompact(false); strOut.append("Response Body:"); strOut.append("\r\n"); strOut.append(jResp.emit()); strOut.append("\r\n"); int respStatusCode = http.get_LastStatus(); strOut.append("Response Status Code = "); strOut.appendInt(respStatusCode); strOut.append("\r\n"); if (respStatusCode >= 400) { strOut.append("Response Header:"); strOut.append("\r\n"); strOut.append(http.lastHeader()); strOut.append("\r\n"); strOut.append("Failed."); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } // Sample output: // (Sample code for parsing the JSON response is shown below) // { // "data": [ // { // "attributes": { // "authorizationModels": [ // "detailed", // "financialInstitutionOffered" // ], // "bic": "NBBEBEBB203", // "bulkPaymentsEnabled": true, // "bulkPaymentsProductTypes": [ // "sepaCreditTransfer" // ], // "country": null, // "financialInstitutionCustomerReferenceRequired": false, // "futureDatedPaymentsAllowed": true, // "logoUrl": "https://s3.eu-central-1.amazonaws.com/ibanity-production-financial-institution-assets/sandbox.png", // "maintenanceFrom": null, // "maintenanceTo": null, // "maintenanceType": null, // "maxRequestedAccountReferences": null, // "minRequestedAccountReferences": 0, // "name": "Bogus Financial", // "paymentsEnabled": true, // "paymentsProductTypes": [ // "sepaCreditTransfer" // ], // "periodicPaymentsEnabled": true, // "periodicPaymentsProductTypes": [ // "sepaCreditTransfer" // ], // "primaryColor": "#7d39ff", // "requiresCredentialStorage": false, // "requiresCustomerIpAddress": false, // "sandbox": true, // "secondaryColor": "#3DF2C2", // "sharedBrandName": null, // "sharedBrandReference": null, // "status": "beta" // }, // "id": "2d3d70a4-cb3c-477c-97e1-cbe495b82841", // "links": { // "self": "https://api.ibanity.com/xs2a/financial-institutions/2d3d70a4-cb3c-477c-97e1-cbe495b82841" // }, // "type": "financialInstitution" // }, // { // "attributes": { // "authorizationModels": [ // "detailed", // "financialInstitutionOffered" // ], // "bic": "NBBEBEBB203", // "bulkPaymentsEnabled": true, // "bulkPaymentsProductTypes": [ // "sepaCreditTransfer" // ], // "country": null, // "financialInstitutionCustomerReferenceRequired": false, // "futureDatedPaymentsAllowed": true, // "logoUrl": "https://s3.eu-central-1.amazonaws.com/ibanity-production-financial-institution-assets/sandbox.png", // "maintenanceFrom": null, // "maintenanceTo": null, // "maintenanceType": null, // "maxRequestedAccountReferences": null, // "minRequestedAccountReferences": 0, // "name": "XYZ Trust", // "paymentsEnabled": true, // "paymentsProductTypes": [ // "sepaCreditTransfer" // ], // "periodicPaymentsEnabled": true, // "periodicPaymentsProductTypes": [ // "sepaCreditTransfer" // ], // "primaryColor": "#7d39ff", // "requiresCredentialStorage": false, // "requiresCustomerIpAddress": false, // "sandbox": true, // "secondaryColor": "#3DF2C2", // "sharedBrandName": null, // "sharedBrandReference": null, // "status": "beta" // }, // "id": "d4100f28-936b-4379-a3f8-86314a2014fb", // "links": { // "self": "https://api.ibanity.com/xs2a/financial-institutions/d4100f28-936b-4379-a3f8-86314a2014fb" // }, // "type": "financialInstitution" // } // ], // "links": { // "first": "https://api.ibanity.com/xs2a/financial-institutions" // }, // "meta": { // "paging": { // "limit": 10 // } // } // } // Sample code for parsing the JSON response... // Use the following online tool to generate parsing code from sample JSON: // Generate Parsing Code from JSON // Chilkat functions returning "const char *" return a pointer to temporary internal memory owned and managed by Chilkat. // See this example explaining how this memory should be used: const char * functions. const char *attributesBic = 0; bool attributesBulkPaymentsEnabled; const char *attributesCountry = 0; bool attributesFinancialInstitutionCustomerReferenceRequired; bool attributesFutureDatedPaymentsAllowed; const char *attributesLogoUrl = 0; const char *attributesMaintenanceFrom = 0; const char *attributesMaintenanceTo = 0; const char *attributesMaintenanceType = 0; const char *attributesMaxRequestedAccountReferences = 0; int attributesMinRequestedAccountReferences; const char *attributesName = 0; bool attributesPaymentsEnabled; bool attributesPeriodicPaymentsEnabled; const char *attributesPrimaryColor = 0; bool attributesRequiresCredentialStorage; bool attributesRequiresCustomerIpAddress; bool attributesSandbox; const char *attributesSecondaryColor = 0; const char *attributesSharedBrandName = 0; const char *attributesSharedBrandReference = 0; const char *attributesStatus = 0; const char *id = 0; const char *linksSelf = 0; const char *v_type = 0; int j; int count_j; const char *strVal = 0; const char *linksFirst = jResp.stringOf("links.first"); int metaPagingLimit = jResp.IntOf("meta.paging.limit"); int i = 0; int count_i = jResp.SizeOfArray("data"); while (i < count_i) { jResp.put_I(i); attributesBic = jResp.stringOf("data[i].attributes.bic"); attributesBulkPaymentsEnabled = jResp.BoolOf("data[i].attributes.bulkPaymentsEnabled"); attributesCountry = jResp.stringOf("data[i].attributes.country"); attributesFinancialInstitutionCustomerReferenceRequired = jResp.BoolOf("data[i].attributes.financialInstitutionCustomerReferenceRequired"); attributesFutureDatedPaymentsAllowed = jResp.BoolOf("data[i].attributes.futureDatedPaymentsAllowed"); attributesLogoUrl = jResp.stringOf("data[i].attributes.logoUrl"); attributesMaintenanceFrom = jResp.stringOf("data[i].attributes.maintenanceFrom"); attributesMaintenanceTo = jResp.stringOf("data[i].attributes.maintenanceTo"); attributesMaintenanceType = jResp.stringOf("data[i].attributes.maintenanceType"); attributesMaxRequestedAccountReferences = jResp.stringOf("data[i].attributes.maxRequestedAccountReferences"); attributesMinRequestedAccountReferences = jResp.IntOf("data[i].attributes.minRequestedAccountReferences"); attributesName = jResp.stringOf("data[i].attributes.name"); attributesPaymentsEnabled = jResp.BoolOf("data[i].attributes.paymentsEnabled"); attributesPeriodicPaymentsEnabled = jResp.BoolOf("data[i].attributes.periodicPaymentsEnabled"); attributesPrimaryColor = jResp.stringOf("data[i].attributes.primaryColor"); attributesRequiresCredentialStorage = jResp.BoolOf("data[i].attributes.requiresCredentialStorage"); attributesRequiresCustomerIpAddress = jResp.BoolOf("data[i].attributes.requiresCustomerIpAddress"); attributesSandbox = jResp.BoolOf("data[i].attributes.sandbox"); attributesSecondaryColor = jResp.stringOf("data[i].attributes.secondaryColor"); attributesSharedBrandName = jResp.stringOf("data[i].attributes.sharedBrandName"); attributesSharedBrandReference = jResp.stringOf("data[i].attributes.sharedBrandReference"); attributesStatus = jResp.stringOf("data[i].attributes.status"); id = jResp.stringOf("data[i].id"); linksSelf = jResp.stringOf("data[i].links.self"); v_type = jResp.stringOf("data[i].type"); j = 0; count_j = jResp.SizeOfArray("data[i].attributes.authorizationModels"); while (j < count_j) { jResp.put_J(j); strVal = jResp.stringOf("data[i].attributes.authorizationModels[j]"); j = j + 1; } j = 0; count_j = jResp.SizeOfArray("data[i].attributes.bulkPaymentsProductTypes"); while (j < count_j) { jResp.put_J(j); strVal = jResp.stringOf("data[i].attributes.bulkPaymentsProductTypes[j]"); j = j + 1; } j = 0; count_j = jResp.SizeOfArray("data[i].attributes.paymentsProductTypes"); while (j < count_j) { jResp.put_J(j); strVal = jResp.stringOf("data[i].attributes.paymentsProductTypes[j]"); j = j + 1; } j = 0; count_j = jResp.SizeOfArray("data[i].attributes.periodicPaymentsProductTypes"); while (j < count_j) { jResp.put_J(j); strVal = jResp.stringOf("data[i].attributes.periodicPaymentsProductTypes[j]"); j = j + 1; } i = i + 1; } SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); } |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.