PureBasic
PureBasic
Global Payments Card Authorization
See more Global Payments Examples
Demonstrates how to send a card payments authorization request.Chilkat PureBasic Downloads
IncludeFile "CkDateTime.pb"
IncludeFile "CkPrng.pb"
IncludeFile "CkXml.pb"
IncludeFile "CkCrypt2.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkHttp.pb"
Procedure ChilkatExample()
success.i = 0
; 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
; 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 = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpStr(http,"POST",testUrl,CkXml::ckGetXml(xml),"utf-8","application/xml",resp)
If success = 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)
CkHttpResponse::ckDispose(resp)
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)
CkHttpResponse::ckDispose(resp)
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
CkHttp::ckDispose(http)
CkDateTime::ckDispose(dt)
CkPrng::ckDispose(prng)
CkCrypt2::ckDispose(crypt)
CkStringBuilder::ckDispose(sbA)
CkStringBuilder::ckDispose(sbB)
CkXml::ckDispose(xml)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndProcedure