Sample code for 30+ languages & platforms
PowerBuilder

Adyen HMAC Signature Calculation for Hosted Payment Pages

See more Adyen Examples

Demonstrates how to do the HMAC Signature Calculation for a hosted payment page (HPP) in Adyen.

For a C# ASP.NET Razor Pages example showing the HTML Form with HMAC signature code, see Adyen HMAC Signature Calculation in C#

Chilkat PowerBuilder Downloads

PowerBuilder
integer li_rc
integer li_Success
string ls_StrHtml
oleobject loo_Gzip
string ls_GzOrderData
oleobject loo_Xml
string ls_SessionValidity
string ls_CountryCode
string ls_ShopperLocale
string ls_MerchantReference
string ls_MerchantAccount
string ls_PaymentAmount
string ls_CurrencyCode
string ls_SkinCode
string ls_ShopperReference
string ls_ShopperEmail
string ls_ShipBeforeDate
oleobject loo_SbTags
oleobject loo_SbValues
oleobject loo_SbContent
integer n
integer i
integer li_NumReplaced
oleobject loo_SbSigningStr
oleobject loo_Crypt
string ls_HmacKey
string ls_MerchantSig

li_Success = 0

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

ls_StrHtml = "<table class=~"od~"><tr><th>Description</th><th>Quantity</th><th>Amount</th></tr><tr><td>1 Digital Camera</td><td class=~"r~">1</td><td class=~"r~">100 GBP</td></tr><tr><td class=~"b~">Total</td><td class=~"r~"></td><td class=~"b r~">100.00 GBP</td></tr></table>"

loo_Gzip = create oleobject
li_rc = loo_Gzip.ConnectToNewObject("Chilkat.Gzip")
if li_rc < 0 then
    destroy loo_Gzip
    MessageBox("Error","Connecting to COM object failed")
    return
end if
ls_GzOrderData = loo_Gzip.CompressStringENC(ls_StrHtml,"utf-8","base64")

loo_Xml = create oleobject
li_rc = loo_Xml.ConnectToNewObject("Chilkat.Xml")

loo_Xml.Tag = "keyValuePairs"

loo_Xml.NewChild2("orderData",ls_GzOrderData)

// required, The payment deadline; the payment needs to occur within the specified time value.
ls_SessionValidity = "2019-08-11T10:30:00Z"
loo_Xml.NewChild2("sessionValidity",ls_SessionValidity)

// optional.  Normally we'll let Adyen automatically know the country based on the IP address.
// By default, the payment methods offered to a shopper are filtered based on the country the shopper's IP address is mapped to. 
// In this way, shoppers are not offered payment methods that are not available in the country they are carrying out the transaction from. 
// This IP-to-country mapping is not 100% accurate, so if you have already established the country of the shopper, you can set it explicitly 
// in the countryCode parameter.
ls_CountryCode = "GB"
loo_Xml.NewChild2("countryCode",ls_CountryCode)

// optional
ls_ShopperLocale = "en_GB"
// If not specified, the locale preference is set to en_GB   by default.
// When it is not necessary to include the country-specific part, use only the language code.
// For example: it instead of it_IT to set the locale preferences to Italian.
loo_Xml.NewChild2("shopperLocale",ls_ShopperLocale)

// required, A reference to uniquely identify the payment. This reference is used in all communication with you about the payment status. 
// We recommend using a unique value per payment; however, it is not a requirement. If you need to provide multiple references for a transaction, 
// you can enter them in this field. Separate each reference value with a hyphen character ("-"). This field has a length restriction: 
// you can enter max. 80 characters.
ls_MerchantReference = "paymentTest1234"
loo_Xml.NewChild2("merchantReference",ls_MerchantReference)

// required, The merchant account identifier you want to process the (transaction) request with.
ls_MerchantAccount = "ChilkatSoftwareIncCOM"
loo_Xml.NewChild2("merchantAccount",ls_MerchantAccount)

// required.  10000 for $100.00
ls_PaymentAmount = "10000"
loo_Xml.NewChild2("paymentAmount",ls_PaymentAmount)

// required, The three-character ISO currency code
ls_CurrencyCode = "GBP"
loo_Xml.NewChild2("currencyCode",ls_CurrencyCode)

// required.
ls_SkinCode = "S7uWsvfB"
loo_Xml.NewChild2("skinCode",ls_SkinCode)

// optional, A unique identifier for the shopper, for example, a customer ID.
// We recommend providing this information, as it is used in velocity fraud checks. It is also the key in recurring payments.
// This field is mandatory in recurring payments.  
ls_ShopperReference = "somebody@example.com"
loo_Xml.NewChild2("shopperReference",ls_ShopperReference)

// optional
ls_ShopperEmail = "somebody@example.com"
loo_Xml.NewChild2("shopperEmail",ls_ShopperEmail)

// optional, An integer value that adds up to the normal fraud score.
// The value can be either a positive or negative integer.
loo_Xml.NewChild2("offset","0")

// Apparently this is a required field.
ls_ShipBeforeDate = "2019-06-04"
loo_Xml.NewChild2("shipBeforeDate",ls_ShipBeforeDate)

loo_Xml.SortByTag(1)

// Encode...
//  "\" (backslash) as "\\"
//  ":" (colon) as "\:"

loo_SbTags = create oleobject
li_rc = loo_SbTags.ConnectToNewObject("Chilkat.StringBuilder")

loo_SbValues = create oleobject
li_rc = loo_SbValues.ConnectToNewObject("Chilkat.StringBuilder")

loo_SbContent = create oleobject
li_rc = loo_SbContent.ConnectToNewObject("Chilkat.StringBuilder")

n = loo_Xml.NumChildren
i = 0
do while i < n
    if i > 0 then
        loo_SbTags.Append(":")
        loo_SbValues.Append(":")
    end if

    loo_Xml.GetChild2(i)
    loo_SbTags.Append(loo_Xml.Tag)

    loo_SbContent.SetString(loo_Xml.Content)
    li_NumReplaced = loo_SbContent.Replace("~","\~")
    li_NumReplaced = loo_SbContent.Replace(":","\:")
    loo_SbValues.AppendSb(loo_SbContent)
    loo_Xml.GetParent2()

    i = i + 1
loop

loo_SbSigningStr = create oleobject
li_rc = loo_SbSigningStr.ConnectToNewObject("Chilkat.StringBuilder")

loo_SbSigningStr.AppendSb(loo_SbTags)
loo_SbSigningStr.Append(":")
loo_SbSigningStr.AppendSb(loo_SbValues)

loo_Crypt = create oleobject
li_rc = loo_Crypt.ConnectToNewObject("Chilkat.Crypt2")

loo_Crypt.HashAlgorithm = "sha256"
loo_Crypt.MacAlgorithm = "hmac"

ls_HmacKey = "934D1E806DDD99595EB430076FD7F8E4D12D0A3F51243A4C0C3897703118E739"
loo_Crypt.SetMacKeyEncoded(ls_HmacKey,"hex")

loo_Crypt.EncodingMode = "base64"
ls_MerchantSig = loo_Crypt.MacStringENC(loo_SbSigningStr.GetAsString())

Write-Debug ls_MerchantSig


destroy loo_Gzip
destroy loo_Xml
destroy loo_SbTags
destroy loo_SbValues
destroy loo_SbContent
destroy loo_SbSigningStr
destroy loo_Crypt