Опубликовать XML с TidHttp Неверный запрос - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь опубликовать файл XML, используя Delphi 2007, чтобы совершить транзакцию с WorldPay, но я получаю сообщение об ошибке "Недопустимый запрос".

Вот мой код, я могу не понимаю, что я делаю не так.

Var
  XDoc, ReturnStr:String;
  XMLToSend, resp: TStringStream;
  IdHTTP1:TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin   
  with Datam1.CCSetupTbl do
  begin
    XDoc := '<?xml version="1.0" encoding="UTF-8"?>' +
            '<TransactionSetup xmlns="https://certtransaction.elementexpress.com">' +
              '<Credentials>' +
                '<AccountID>' + FieldByName('M').AsString + '</AccountID>' +
                '<AccountToken>' + FieldByName('MW').AsString + '</AccountToken>' +
                '<AcceptorID>' + FieldByName('MP').AsString + '</AcceptorID>' +
              '</Credentials>' +
              '<Application>' +
                '<ApplicationID>00000</ApplicationID>' +
                '<ApplicationVersion>7.60.0</ApplicationVersion>' +
                '<ApplicationName>CPOS</ApplicationName>' +
              '</Application>' +
              '<TransactionSetup>' +
                '<TransactionSetupMethod>7</TransactionSetupMethod>' +
                '<Embedded>1</Embedded>' +
                '<CVVRequired>0</CVVRequired>' +
                '<AutoReturn>1</AutoReturn>' +
                '<ReturnURL>http://localhost</ReturnURL>' +
                '<CustomCss>body{margin-left: 50px;}</CustomCss>' +
              '</TransactionSetup>' +
              '<Transaction>' +
                '<TransactionAmount>1.00</TransactionAmount>' +
                '<MarketCode>0</MarketCode>' +
                '<ReferenceNumber>123456</ReferenceNumber>' +
                '<TicketNumber>123456</TicketNumber>' +
                '<PartialApprovedFlag>0</PartialApprovedFlag>' +
              '</Transaction>' +
              '<Terminal>' +
                '<TerminalID>01</TerminalID>' +
                '<TerminalType>0</TerminalType>' +
                '<CardholderPresentCode>0</CardholderPresentCode>' +
                '<CardInputCode>0</CardInputCode>' +
                '<TerminalCapabilityCode>0</TerminalCapabilityCode>' +
                '<TerminalEnvironmentCode>0</TerminalEnvironmentCode>' +
                '<CardPresentCode>0</CardPresentCode>' +
                '<MotoECICode>0</MotoECICode>' +
                '<CVVPresenceCode>0</CVVPresenceCode>' +
              '</Terminal>'+
              '<PaymentAccount>' +
                '<PaymentAccountType>1</PaymentAccountType>' +
                '<PaymentAccountReferenceNumber>' + CusAccount + '</PaymentAccountReferenceNumber>' +
              '</PaymentAccount>' +
            '</TransactionSetup>';
  end;
  Try
    IdHTTP1 := TIdHTTP.Create;
    with IdHTTP1 do
    begin
      Request.Accept := 'text/html';
      Request.ContentType := 'text/html';
      Request.CharSet := 'utf-8';
      Request.CacheControl := 'no-cache';
      ReadTimeout := 30000;
      ConnectTimeout := 30000;
      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;

    IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions:= [sslvTLSv1_2];
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_2;
    IdHttp1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
    XMLToSend := TStringStream.Create(XDoc);

    ReturnStr := IdHTTP1.Post('https://certtransaction.elementexpress.com', XMLToSend);
  finally
    IdHTTP1.Free;
    IdSSLIOHandlerSocketOpenSSL1.Free;
    XMLToSend.Free;
  end;

1 Ответ

1 голос
/ 29 февраля 2020

Ну, для начала, вы говорите серверу, что вы отправляете HTML вместо XML. 'text/html' неверно Content-Type для XML.

Во-вторых, вы не экранируете значения, которые вы вставляете в XML, если они содержат какие-либо зарезервированные символы. Вы действительно должны использовать правильную библиотеку XML для подготовки ваших данных постов.

Наконец, ваша обработка исключений не очень хорошо структурирована.

Попробуйте вместо этого:

Var
  XDoc, ReturnStr: String;
  XMLToSend: TStringStream;
  IdHTTP1: TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin   
  with Datam1.CCSetupTbl do
  begin
    XDoc := ...;
  end;
  IdHTTP1 := TIdHTTP.Create;
  try
    with IdHTTP1 do
    begin
      Request.Accept := 'text/html';
      Request.ContentType := 'text/xml'; // or 'application/xml', or whatever the server actually expects...
      Request.CharSet := 'utf-8';
      Request.CacheControl := 'no-cache';
      ReadTimeout := 30000;
      ConnectTimeout := 30000;
      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;

    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_2];
    IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

    XMLToSend := TStringStream.Create(XDoc);
    try
      ReturnStr := IdHTTP1.Post('https://certtransaction.elementexpress.com', XMLToSend);
    finally
      XMLToSend.Free;
    end;
  finally
    IdHTTP1.Free;
  end;
...