I started getting this error on our production Windows 2012 server running IIS 8.5:
Microsoft VBScript runtime error '800a01a8'
Object required: 'MERCHANTmydoc.documentElement'
The error seems to occur on this line:
Set MERCHANTmydoc=Server.CreateObject("Microsoft.xmlDOM")
No code was changed and the API has not changed (according to merchant support) when this started. I tested this same API string (inserting valid values) with Postman and got a valid reply, so I know the credentials work. I am beginning to suspect an issue with IIS, but don't know how to proceed.
MERCHANTstrXML = "<txn><ssl_merchant_ID>" & MERCHANT_ID & "</ssl_merchant_ID><ssl_user_id>" & MERCHANT_USER & "</ssl_user_id><ssl_pin>" & MERCHANT_PIN & "</ssl_pin><ssl_transaction_type>ccsale</ssl_transaction_type><ssl_card_number>" & merchant_card_number & "</ssl_card_number><ssl_exp_date>" & merchant_exp_date & "</ssl_exp_date><ssl_amount>" & merchant_trans_amount & "</ssl_amount><ssl_salestax>" & merchant_sales_tax & "</ssl_salestax>" & merch_indicator_var & "<ssl_cvv2cvc2>" & merchant_cvv2_code & "</ssl_cvv2cvc2><ssl_invoice_number>" & merchant_invoice_number & "</ssl_invoice_number><ssl_customer_code>" & merchant_customer_code & "</ssl_customer_code><ssl_first_name>" & merchant_first_name & "</ssl_first_name><ssl_last_name>" & merchant_last_name & "</ssl_last_name><ssl_avs_address>" & merchant_add1 & "</ssl_avs_address><ssl_avs_zip>" & merchant_zip & "</ssl_avs_zip><ssl_email>" & merchant_email & "</ssl_email><ssl_test_mode>" & MERCHANT_Test_Mode & "</ssl_test_mode></txn>"
if session("CHARGED") = "YES" then
'Do nothing
else
Set MERCHANTxmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
MERCHANTxmlhttp.Open "POST","https://api.convergepay.com/VirtualMerchant/processxml.do?xmldata=" & MERCHANTstrXML,false
MERCHANTxmlhttp.send
MERCHANTresponsexml = MERCHANTxmlhttp.responseText
Set MERCHANTmydoc=Server.CreateObject("Microsoft.xmlDOM")
MERCHANTmydoc.async= false
MERCHANTmydoc.loadxml(MERCHANTresponsexml)
I found a script to test xml requests and got this error: Sending XML data to http://localhost:8096/cart/receive3.asp msxml3.dll error '80072efd'
A connection with the server could not be established
/cart/post3.asp, line 12
These are the scripts I used
<%
'// URL to which to send XML data
URL="http://localhost:8096/cart/receive3.asp"
Response.Write "Sending XML data to " & URL & "<br/>"
information = "<Send><UserName>test</UserName><PassWord>user</PassWord><Data>100</Data></Send>"
Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
xmlhttp.Open "POST", url, false
xmlhttp.setRequestHeader "Content-Type", "text/xml"
xmlhttp.send information
'// Report the response from the called page
response.write "Response received:<hr/><span style='color:blue'>" & xmlhttp.ResponseText & "</span><hr/>"
%>
<%
Dim objXmlRequest
Set objXmlRequest = Server.CreateObject("MSXML2.DOMDOCUMENT.3.0")
IF objXmlRequest.Load (Request) THEN
'GET THE REQUEST FROM CLIENT
strQuery = "//UserName"
Set oNode = objXmlRequest.selectSingleNode(strQuery)
strActionName = oNode.Text
response.write "success! user name is " & strActionName
ELSE
Response.Write "Failed to load XML file, reason: " & objXmlRequest.parseError.reason
END IF
%>
CodePudding user response:
The solution was to change the way the API request was being sent. The credit card provider changed their API and didn't inform their support reps. This is the code that finally worked:
MERCHANTxmlhttp.Open "POST","https://api.convergepay.com/VirtualMerchant/processxml.do",false
MERCHANTxmlhttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
MERCHANTxmlhttp.Send Server.urlEncode(MERCHANTstrXML)
CodePudding user response:
The actual cause of the Object required (which was the initial question) is to do with the assumptions being made about the call out to the 3rd party API.
After calling Send()
on the XmlHttp object you should always check what is being returned before doing anything with it, the easiest way is to check the Status
in the response that is returned.
Option Explicit
Dim request_xml: request_xml= "..." 'Assumed valid XML
Dim xhr: Set xhr = Server.CreateObject("MSXML2.ServerXMLHTTP")
Call xhr.Open ("POST","https://api.convergepay.com/VirtualMerchant/processxml.do?xmldata=" & request_xml, False)
Call xhr.Send()
'Check we have a status HTTP response code.
If Left(xmlhttp.Status, 1) = 2 Then
Dim response_xml: response_xml = xhr.responseText
Dim xml: Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.Async= False
Call xml.LoadXml(response_xml)
Else
Call Response.Write("Error calling API - " & xhr.Status)
End If
The error occurs because the API is not sending back a valid XML response so LoadXml()
fails. This means when calling MERCHANTmydoc.documentElement
the MERCHANTmydoc
isn't instantiated.