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
(PureBasic) 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
IncludeFile "CkDateTime.pb" IncludeFile "CkPrng.pb" IncludeFile "CkXml.pb" IncludeFile "CkCrypt2.pb" IncludeFile "CkStringBuilder.pb" IncludeFile "CkHttpResponse.pb" IncludeFile "CkHttp.pb" Procedure ChilkatExample() ; This example requires the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. http.i = CkHttp::ckCreate() If http.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success.i ; 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.s = "https://test.realexpayments.com/epage-remote.cgi" clientID.s = "realexsandbox" sharedSecret.s = "Po8lRRT67a" amount.s = "1001" currency.s = "EUR" cardNumber.s = "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.i = CkDateTime::ckCreate() If dt.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkDateTime::ckSetFromCurrentSystemTime(dt) dtStr.s = CkDateTime::ckGetAsIso8601(dt,"YYYYMMDDhhmmss",1) ; Generate a unique order ID prng.i = CkPrng::ckCreate() If prng.i = 0 Debug "Failed to create object." ProcedureReturn EndIf orderId.s = CkPrng::ckGenRandom(prng,32,"base64url") ; Compute the sha1hash crypt.i = CkCrypt2::ckCreate() If crypt.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkCrypt2::setCkHashAlgorithm(crypt, "sha1") CkCrypt2::setCkEncodingMode(crypt, "hexlower") sbA.i = CkStringBuilder::ckCreate() If sbA.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkStringBuilder::ckAppend(sbA,"timestamp.merchantid.orderid.amount.currency.cardnumber") numReplaced.i = CkStringBuilder::ckReplace(sbA,"timestamp",dtStr) numReplaced = CkStringBuilder::ckReplace(sbA,"merchantid",clientID) numReplaced = CkStringBuilder::ckReplace(sbA,"orderid",orderId) numReplaced = CkStringBuilder::ckReplace(sbA,"amount",amount) numReplaced = CkStringBuilder::ckReplace(sbA,"currency",currency) numReplaced = CkStringBuilder::ckReplace(sbA,"cardnumber",cardNumber) hashA.s = CkCrypt2::ckHashStringENC(crypt,CkStringBuilder::ckGetAsString(sbA)) sbB.i = CkStringBuilder::ckCreate() If sbB.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkStringBuilder::ckAppend(sbB,hashA) CkStringBuilder::ckAppend(sbB,".") CkStringBuilder::ckAppend(sbB,sharedSecret) hashB.s = CkCrypt2::ckHashStringENC(crypt,CkStringBuilder::ckGetAsString(sbB)) xml.i = CkXml::ckCreate() If xml.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkXml::setCkTag(xml, "request") CkXml::ckAddAttribute(xml,"type","auth") CkXml::ckAddAttribute(xml,"timestamp",dtStr) CkXml::ckUpdateChildContent(xml,"merchantid",clientID) CkXml::ckUpdateChildContent(xml,"account","internet") CkXml::ckUpdateChildContent(xml,"channel","ECOM") CkXml::ckUpdateChildContent(xml,"orderid",orderId) CkXml::ckUpdateAttrAt(xml,"amount",1,"currency",currency) CkXml::ckUpdateChildContent(xml,"amount",amount) CkXml::ckUpdateChildContent(xml,"card|number",cardNumber) CkXml::ckUpdateChildContent(xml,"card|expdate","0425") CkXml::ckUpdateChildContent(xml,"card|chname","James Mason") CkXml::ckUpdateChildContent(xml,"card|type","VISA") CkXml::ckUpdateChildContent(xml,"card|cvn|number","123") CkXml::ckUpdateChildContent(xml,"card|cvn|presind","1") CkXml::ckUpdateAttrAt(xml,"autosettle",1,"flag","1") CkXml::ckUpdateChildContent(xml,"sha1hash",hashB) resp.i = CkHttp::ckPostXml(http,testUrl,CkXml::ckGetXml(xml),"utf-8") If CkHttp::ckLastMethodSuccess(http) = 0 Debug CkHttp::ckLastErrorText(http) CkHttp::ckDispose(http) CkDateTime::ckDispose(dt) CkPrng::ckDispose(prng) CkCrypt2::ckDispose(crypt) CkStringBuilder::ckDispose(sbA) CkStringBuilder::ckDispose(sbB) CkXml::ckDispose(xml) ProcedureReturn EndIf Debug "Response Status Code: " + Str(CkHttpResponse::ckStatusCode(resp)) Debug "Response Body:" Debug CkHttpResponse::ckBodyStr(resp) If CkHttpResponse::ckStatusCode(resp) <> 200 Debug "Failed." CkHttp::ckDispose(http) CkDateTime::ckDispose(dt) CkPrng::ckDispose(prng) CkCrypt2::ckDispose(crypt) CkStringBuilder::ckDispose(sbA) CkStringBuilder::ckDispose(sbB) CkXml::ckDispose(xml) ProcedureReturn EndIf ; 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::ckLoadXml(xml,CkHttpResponse::ckBodyStr(resp)) result.i = CkXml::ckGetChildIntValue(xml,"result") Debug "result = " + Str(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 Debug "authcode = " + CkXml::ckGetChildContent(xml,"authcode") Debug "Success." Else Debug "Failed." EndIf CkHttpResponse::ckDispose(resp) CkHttp::ckDispose(http) CkDateTime::ckDispose(dt) CkPrng::ckDispose(prng) CkCrypt2::ckDispose(crypt) CkStringBuilder::ckDispose(sbA) CkStringBuilder::ckDispose(sbB) CkXml::ckDispose(xml) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.