HTTP POST For Authorize.net

JSON, Caché

Hello,
   We are running cache version  2012.1.4
Is it possible to make an HTTP Post passing in JSON string?

Example:
I want to send this request to Authorize.net. How can I do this in cache object script?

URL:  https://apitest.authorize.net/xml/v1/request.api

Body:

{
    "createTransactionRequest": {
        "merchantAuthentication": {
            "name": "gfufet9QVgT5P",
            "transactionKey": "8pg6FJjxuekeY62m"
        },
        "refId": "123456",
        "transactionRequest": {
            "transactionType": "authCaptureTransaction",
            "amount": "5",
            "payment": {
                "creditCard": {
                    "cardNumber": "5424000000000015",
                    "expirationDate": "2020-12",
                    "cardCode": "999"
                }
            }
        }
    }
}

NOTE - I have removed the actual name and transactionKey from the body. 

If you get this to work you should get back the message:

User authentication failed due to invalid authentication values.

  • 0
  • 0
  • 179
  • 1
  • 2

Answers

Are you unable to POST anything, or are you looking for an easy way to construct JSON in 2012.1.4 ?

The class to POST something is %Net.HttpRequest, you need to send the form as a  stream.

In recent (2016.2 upward) versions, you can create a dynamic object and convert it to a JSON string, but 2012.1.4 is lacking this  JSON support,.

But you should still  be able to send a string in the body part formed (manually) as correct JSON :

    Set httprequest=##class(%Net.HttpRequest).%New()
    Set httprequest.Server="apitest.authorize.net"
    Set httprequest.Https=1
    Set httprequest.SSLConfiguration = "TEST"  ;make sure this SSL is created via mgmt security portal
    Do httprequest.EntityBody.Write("{""createTransactionRequest"":{""merchantAuthentication"":{""name"":""gfufet9QVgT5P"",""transactionKey"":""8pg6FJjxuekeY62m""},""refId"":""123456"",""transactionRequest"":{""transactionType"":""authCaptureTransaction"",""amount"":""5"",""payment"":{""creditCard"":{""cardNumber"":""5424000000000015"",""expirationDate"":""2020-12"",""cardCode"":""999""}}}}})")
    Do httprequest.Post("/xml/v1/request.api")
    Do httprequest.HttpResponse.OutputToDevice()

Thanks!

I did try this but it's not working because Authorize.net requires use of TLS 1.2 and Cache 2012.1.4 doesn't allow this configuration when creating the SSL configuration in the Management portal. I found another way using C# and creating a web service to call from Cache.

Hopefully we will be upgrading soon, I could use the built JSON support.

2012.1.4 has JSON support via %ZEN.proxyObject

set obj = ##class(%ZEN.proxyObject).%New()
set obj.createTransactionRequest= ##class(%ZEN.proxyObject).%New()
set obj.createTransactionRequest.merchantAuthentication = ##class(%ZEN.proxyObject).%New()
set obj.createTransactionRequest.merchantAuthentication.name = "gfufet9QVgT5P"
do obj.%ToJSON()

Also you can use %ZEN.Auxiliary.jsonProvider to convert object into JSON.