Ok, so after much debugging I finally had everything working, and then it just stopped. I sware I had the sample from here: http://community.developer.authorize.net/t5/News-and-Announcements/New-XML-API-for-Transaction-Proce... working and responding with "Invalid account", then I changed it to my account and got "invaild CC experation" through MY program.
Then, to save time, I used a 3rd party program (XML Transmitter) to continue tests in forming my XML. Once it got it trimmed down, I put the XML (which works fine using XML Transmitter) in to my program, but now, even if I put it back to how it was before, all my program ever returns is:
...
<code>E00003</code>
<text>'%' is an unexpected token. The expected token is '?gt;'. Line 1, position 20.</text>
...
I have no % anywhere in my XML, however I assume this is an encoding issue as I know Delphi uses %num fro caracters sometimes (%20 is Space), and gt; is a >. Here is exactly what I am sending:
XML2Send.Add('<?xml version="1.0" encoding="utf-8"?>' +
'<createTransactionRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">' +
'<merchantAuthentication>' +
'<name>myName123</name>' +
'<transactionKey>MyKey1234567890t</transactionKey>' +
'</merchantAuthentication>' +
'<transactionRequest>' +
'<transactionType>authCaptureTransaction</transactionType>' +
'<amount>365.51</amount>' +
'<payment>' +
'<creditCard>' +
'<cardNumber>5424000000000015</cardNumber>' +
'<expirationDate>1112</expirationDate>' +
'</creditCard>' +
'</payment>' +
'</transactionRequest>' +
'</createTransactionRequest>');
I am so mad it was working fine and then just stopped (?!?!?). Does anyone know how to get it working again?
FYI: XML2Send is a TStringList, but it only works if the entire XML is in the 1st string (so it is a list of one string). I am using Indy TIdHttp to send with the following command:
XMLResponse := AuthNetHTTP.Post('https://api.authorize.net/xml/v1/request.api', XML2Send);
Solved! Go to Solution.
08-01-2011 02:59 AM
Alright, well, even though I could sware it worked a few times with a TStringList, in the end the answer was just to change it to a TStringStream which is not encoded.
Here is the working code for anybody looking for the easiest way to use AIM over XML in Delphi using Indy:
procedure TMainForm.ProcessButtClick(Sender: TObject); var AuthNetHTTP: TIdHttp; AuthNetSSL: TIdSSLIOHandlerSocketOpenSSL; XMLRequest: TStringStream; XMLResponse: String; begin XMLRequest := TStringStream.Create( '<?xml version="1.0" encoding="utf-8"?>' + '<createTransactionRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">' + '<merchantAuthentication>' + '<name>YourName.</name>' + '<transactionKey>YourTransKey....</transactionKey>' + '</merchantAuthentication>' + '<transactionRequest>' + '<transactionType>authCaptureTransaction</transactionType>' + '<amount>365.51</amount>' + '<payment>' + '<creditCard>' + '<cardNumber>5424000000000015</cardNumber>' + '<expirationDate>1118</expirationDate>' + '</creditCard>' + '</payment>' + '</transactionRequest>' + '</createTransactionRequest>'); //Prep Web Request AuthNetHTTP := TidHTTP.Create(nil); AuthNetSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); AuthNetSSL.SSLOptions.Method := sslvSSLv3; AuthNetHTTP.IOHandler := AuthNetSSL; AuthNetHTTP.Request.ContentType := 'text/xml'; AuthNetHTTP.ConnectTimeout := 10000; AuthNetHTTP.ReadTimeout := 10000; try XMLResponse := AuthNetHTTP.Post('https://api.authorize.net/xml/v1/request.api', XMLRequest); AuthNetHTTP.Disconnect; except on e: exception do ShowMessage('Server Error: ' + e.message); end; Memo1.Text := XMLResponse; ShowMessage(XMLResponse); AuthNetHTTP.Free; AuthNetSSL.Free; XMLRequest.Free; end;
08-01-2011 08:36 PM
Here is the complete function code as it stands now (I had thought assigning the XML to a sting first, and then assigning that sting to the TStringList might fix it, as I was doing that before when it worked, but still no love). I just can't believe it worked before, and no it has some dumb encoding issue that I cannot solve for the life of me.
procedure TMainForm.WelcomeProcessButtClick(Sender: TObject); var AuthNetHTTP: TIdHttp; AuthNetSSL: TIdSSLIOHandlerSocketOpenSSL; XMLRequest: TStringList; XML2Send, XMLResponse: String; begin SQLStatusBar.Panels[1].Text := 'Loading Database'; SQLStatusBar.Panels[2].Text := 'Processing Payments...'; MainForm.Update; //Auth.net XML2Send := '<?xml version="1.0" encoding="utf-8"?>' + '<createTransactionRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">' + '<merchantAuthentication>' + '<name>MyNameW8g</name>' + '<transactionKey>MyTransKeynL479t</transactionKey>' + '</merchantAuthentication>' + '<transactionRequest>' + '<transactionType>authCaptureTransaction</transactionType>' + '<amount>365.51</amount>' + '<payment>' + '<creditCard>' + '<cardNumber>5424000000000015</cardNumber>' + '<expirationDate>1112</expirationDate>' + '</creditCard>' + '</payment>' + {'<order>' + '<invoiceNumber>DemoHotel-0611</invoiceNumber>' + '<description>June 2011 payment from DemoHotel</description>' + '</order>' +} '</transactionRequest>' + '</createTransactionRequest>'; XMLRequest := TStringList.Create; XMLRequest.Append(XML2Send); //Prep Web Request AuthNetHTTP := TidHTTP.Create(nil); AuthNetSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); AuthNetSSL.SSLOptions.Method := sslvSSLv3; AuthNetHTTP.IOHandler := AuthNetSSL; AuthNetHTTP.Request.ContentType := 'text/xml'; AuthNetHTTP.ConnectTimeout := 10000; AuthNetHTTP.ReadTimeout := 10000; //AuthNetHTTP.Request.ContentEncoding := 'utf-8'; try XMLResponse := AuthNetHTTP.Post('https://api.authorize.net/xml/v1/request.api', XMLRequest); AuthNetHTTP.Disconnect; except on e: exception do ShowMessage('Server Error: ' + e.message); end; ShowMessage(XMLResponse); AuthNetHTTP.Free; AuthNetSSL.Free; XMLRequest.Free; Step2.Visible := True; SQLStatusBar.Panels[1].Text := 'Payments Processed!'; SQLStatusBar.Panels[2].Text := 'Idle.'; MainForm.Update; end;
Please help.
08-01-2011 02:41 PM
Here is the complete response (starting with a few random chars???):
<?xml version="1.0" encoding="utf-8"?> <ErrorResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <messages> <resultCode>Error</resultCode> <message> <code>E00003</code> <text>'%' is an unexpected token. The expected token is '?>'. Line 1, position 20.</text> </message> </messages> </ErrorResponse>
08-01-2011 02:45 PM
Alright, well, even though I could sware it worked a few times with a TStringList, in the end the answer was just to change it to a TStringStream which is not encoded.
Here is the working code for anybody looking for the easiest way to use AIM over XML in Delphi using Indy:
procedure TMainForm.ProcessButtClick(Sender: TObject); var AuthNetHTTP: TIdHttp; AuthNetSSL: TIdSSLIOHandlerSocketOpenSSL; XMLRequest: TStringStream; XMLResponse: String; begin XMLRequest := TStringStream.Create( '<?xml version="1.0" encoding="utf-8"?>' + '<createTransactionRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">' + '<merchantAuthentication>' + '<name>YourName.</name>' + '<transactionKey>YourTransKey....</transactionKey>' + '</merchantAuthentication>' + '<transactionRequest>' + '<transactionType>authCaptureTransaction</transactionType>' + '<amount>365.51</amount>' + '<payment>' + '<creditCard>' + '<cardNumber>5424000000000015</cardNumber>' + '<expirationDate>1118</expirationDate>' + '</creditCard>' + '</payment>' + '</transactionRequest>' + '</createTransactionRequest>'); //Prep Web Request AuthNetHTTP := TidHTTP.Create(nil); AuthNetSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); AuthNetSSL.SSLOptions.Method := sslvSSLv3; AuthNetHTTP.IOHandler := AuthNetSSL; AuthNetHTTP.Request.ContentType := 'text/xml'; AuthNetHTTP.ConnectTimeout := 10000; AuthNetHTTP.ReadTimeout := 10000; try XMLResponse := AuthNetHTTP.Post('https://api.authorize.net/xml/v1/request.api', XMLRequest); AuthNetHTTP.Disconnect; except on e: exception do ShowMessage('Server Error: ' + e.message); end; Memo1.Text := XMLResponse; ShowMessage(XMLResponse); AuthNetHTTP.Free; AuthNetSSL.Free; XMLRequest.Free; end;
08-01-2011 08:36 PM