Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js SOAP Call with Complex Types

I am currently attempting to use node-soap (https://github.com/milewise/node-soap) to make calls to Authorize.net's SOAP server. However, I cannot seem to get my client code pass the proper parameters. I know that the function is calling the server since I get a server error response.

When I examine the WSDL, I notice that the server call requires ComplexType parameters. Is there a way to create the ComplexTypes that I need or can I just use Javascript objects? Here is my current code:

  var soap = require('soap');

  var url = 'https://api.authorize.net/soap/v1/Service.asmx?WSDL';

  soap.createClient(url, function(err, client) {

  var args = {
      merchantAuthentication: {
        name: '285tUPuS',
        transactionKey: '58JKJ4T95uee75wd'
      }
  };

  client.Service.ServiceSoap12.GetTransactionDetails(args, 
      function(err, result) {

          if (err) {
            console.log(err);
          } else {
            console.log(result.GetTransactionDetailsResult[0].messages);
          }
      });

});

like image 854
Vincent Catalano Avatar asked Nov 12 '22 08:11

Vincent Catalano


1 Answers

The node-soap module is converting your JavaScript object to XML before sending the transaction to the server. It wraps the request in an xml element as outlined by the wsdl. Here is an example of what might be produced by node-soap when passing the object you provided (important to note the outer element is created by the node-soap module according to the wsdl):

This example is using the wsdl for the CyberSource API

<data:requestMessage xmlns:data="urn:schemas-cybersource-com:transaction-data-1.93" xmlns="urn:schemas-cybersource-com:transaction-data-1.93">

  <data:merchantAuthentication>
    <data:name>285tUPuS</data:name>
    <data:transactionKey>58JKJ4T95uee75wd</data:transactionKey>
  </data:merchantAuthentication>

</data:requestMessage>

Also, I don’t know exactly how the Authorize.net api works, but it sounds like you might want to check out using username token authentication if necessary:

client.setSecurity(new soap.WSSecurity('username’, ‘password’));
like image 61
Alex McKenley Avatar answered Nov 14 '22 23:11

Alex McKenley