Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Delphi DLL) Global Payments Card AuthorizationDemonstrates how to send a card payments authorization request. For more information, see https://developer.globalpay.com/#!/api/card-payments#api-authorisation
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Http, CkDateTime, Prng, HttpResponse, StringBuilder, Xml, Crypt2; ... procedure TForm1.Button1Click(Sender: TObject); var http: HCkHttp; success: Boolean; testUrl: PWideChar; clientID: PWideChar; sharedSecret: PWideChar; amount: PWideChar; currency: PWideChar; cardNumber: PWideChar; dt: HCkDateTime; dtStr: PWideChar; prng: HCkPrng; orderId: PWideChar; crypt: HCkCrypt2; sbA: HCkStringBuilder; numReplaced: Integer; hashA: PWideChar; sbB: HCkStringBuilder; hashB: PWideChar; xml: HCkXml; resp: HCkHttpResponse; result: Integer; begin // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. http := CkHttp_Create(); // if you don't have a Client ID yet you can still quickly test some basic request types using the following URL and credentials: // Test URL - https://test.realexpayments.com/epage-remote.cgi // Client ID: realexsandbox // Shared Secret: Po8lRRT67a testUrl := 'https://test.realexpayments.com/epage-remote.cgi'; clientID := 'realexsandbox'; sharedSecret := 'Po8lRRT67a'; amount := '1001'; currency := 'EUR'; cardNumber := '4263970000005262'; // We'll be sending the following XML in the body of the request: // <?xml version="1.0" encoding="UTF-8"?> // <request type="auth" timestamp="20180613141207"> // <merchantid>MerchantId</merchantid> // <account>internet</account> // <channel>ECOM</channel> // <orderid>N6qsk4kYRZihmPrTXWYS6g</orderid> // <amount currency="EUR">1001</amount> // <card> // <number>4263970000005262</number> // <expdate>0425</expdate> // <chname>James Mason</chname> // <type>VISA</type> // <cvn> // <number>123</number> // <presind>1</presind> // </cvn> // </card> // <autosettle flag="1"/> // <sha1hash>87707637a34ba651b6185718c863abc64b673f20</sha1hash> // </request> // Use this online tool to generate code from sample XML: // Generate Code to Create XML // Get the current date/time in this format: 20180613141207 dt := CkDateTime_Create(); CkDateTime_SetFromCurrentSystemTime(dt); dtStr := CkDateTime__getAsIso8601(dt,'YYYYMMDDhhmmss',True); // Generate a unique order ID prng := CkPrng_Create(); orderId := CkPrng__genRandom(prng,32,'base64url'); // Compute the sha1hash crypt := CkCrypt2_Create(); CkCrypt2_putHashAlgorithm(crypt,'sha1'); CkCrypt2_putEncodingMode(crypt,'hexlower'); sbA := CkStringBuilder_Create(); CkStringBuilder_Append(sbA,'timestamp.merchantid.orderid.amount.currency.cardnumber'); numReplaced := CkStringBuilder_Replace(sbA,'timestamp',dtStr); numReplaced := CkStringBuilder_Replace(sbA,'merchantid',clientID); numReplaced := CkStringBuilder_Replace(sbA,'orderid',orderId); numReplaced := CkStringBuilder_Replace(sbA,'amount',amount); numReplaced := CkStringBuilder_Replace(sbA,'currency',currency); numReplaced := CkStringBuilder_Replace(sbA,'cardnumber',cardNumber); hashA := CkCrypt2__hashStringENC(crypt,CkStringBuilder__getAsString(sbA)); sbB := CkStringBuilder_Create(); CkStringBuilder_Append(sbB,hashA); CkStringBuilder_Append(sbB,'.'); CkStringBuilder_Append(sbB,sharedSecret); hashB := CkCrypt2__hashStringENC(crypt,CkStringBuilder__getAsString(sbB)); xml := CkXml_Create(); CkXml_putTag(xml,'request'); CkXml_AddAttribute(xml,'type','auth'); CkXml_AddAttribute(xml,'timestamp',dtStr); CkXml_UpdateChildContent(xml,'merchantid',clientID); CkXml_UpdateChildContent(xml,'account','internet'); CkXml_UpdateChildContent(xml,'channel','ECOM'); CkXml_UpdateChildContent(xml,'orderid',orderId); CkXml_UpdateAttrAt(xml,'amount',True,'currency',currency); CkXml_UpdateChildContent(xml,'amount',amount); CkXml_UpdateChildContent(xml,'card|number',cardNumber); CkXml_UpdateChildContent(xml,'card|expdate','0425'); CkXml_UpdateChildContent(xml,'card|chname','James Mason'); CkXml_UpdateChildContent(xml,'card|type','VISA'); CkXml_UpdateChildContent(xml,'card|cvn|number','123'); CkXml_UpdateChildContent(xml,'card|cvn|presind','1'); CkXml_UpdateAttrAt(xml,'autosettle',True,'flag','1'); CkXml_UpdateChildContent(xml,'sha1hash',hashB); resp := CkHttp_PostXml(http,testUrl,CkXml__getXml(xml),'utf-8'); if (CkHttp_getLastMethodSuccess(http) = False) then begin Memo1.Lines.Add(CkHttp__lastErrorText(http)); Exit; end; Memo1.Lines.Add('Response Status Code: ' + IntToStr(CkHttpResponse_getStatusCode(resp))); Memo1.Lines.Add('Response Body:'); Memo1.Lines.Add(CkHttpResponse__bodyStr(resp)); if (CkHttpResponse_getStatusCode(resp) <> 200) then begin Memo1.Lines.Add('Failed.'); Exit; end; // A status code of 200 indicates we received an XML response, but it could be an error message. // Here's an example of an error response: // <?xml version="1.0" encoding="UTF-8" standalone="yes"?> // <response timestamp="20200418142356"> // <orderid>N6qsk4kYRZihmPrTXWYS6g</orderid> // <result>508</result> // <message>Invalid timestamp: '{' Value exceeds allowable limit: '}'</message> // </response> // We need to check the "result" within the XML. CkXml_LoadXml(xml,CkHttpResponse__bodyStr(resp)); result := CkXml_GetChildIntValue(xml,'result'); Memo1.Lines.Add('result = ' + IntToStr(result)); // A successful result looks like this: // <?xml version="1.0" encoding="UTF-8" standalone="yes"?> // <response timestamp="20200418145519"> // <merchantid>realexsandbox</merchantid> // <account>internet</account> // <orderid>Cw93I1nFWVZuaATh46qMUCBlCcfrOvLo65C2cq5X-AY</orderid> // <result>00</result> // <authcode>L3pHww</authcode> // <message>AUTH CODE: L3pHww</message> // <pasref>96838535689610806</pasref> // <cvnresult>M</cvnresult> // <timetaken>87</timetaken> // <authtimetaken>67</authtimetaken> // <batchid>6322506</batchid> // <sha1hash>2fd2f15f97f1775779fe9bda536dc8317a4b39f6</sha1hash> // </response> if (result = 0) then begin Memo1.Lines.Add('authcode = ' + CkXml__getChildContent(xml,'authcode')); Memo1.Lines.Add('Success.'); end else begin Memo1.Lines.Add('Failed.'); end; CkHttpResponse_Dispose(resp); CkHttp_Dispose(http); CkDateTime_Dispose(dt); CkPrng_Dispose(prng); CkCrypt2_Dispose(crypt); CkStringBuilder_Dispose(sbA); CkStringBuilder_Dispose(sbB); CkXml_Dispose(xml); end; |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.