Sample code for 30+ languages & platforms
PureBasic

Global Payments Card Authorization

See more Global Payments Examples

Demonstrates how to send a card payments authorization request.

Chilkat PureBasic Downloads

PureBasic
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