Текущий архив: 2008.06.29;
Скачать: CL | DM;
ВнизPGP подпись через HTTPS (Indy) Найти похожие ветки
← →
vegarulez (2008-05-25 19:05) [0]Привет всем Мастерам!
Столкнулся с такой проблеммой - уже как то описывал эту ситуацию... месяца 3-4 назад. Но тогда не было ни рабочего хтмл варианта того - о чём хочу спросить и с сервером проблематика была. Посему тогда разговор зашёл в тупик.
Вопрос заключается в следующем. Пытаюсь с помощью делфи отправить запрос к серверу через HTTPS, но в теле запроса содержится PGP подпись данных, коотрые посылаю. И она "косячится" входе передачи + возможно косячятся и частично какие - либо другие данные , например русские буквы. Т.е. под словом "косячаться", я имею ввиду кодируются неверно (судя по всему). Во всяком случае сервер пишет, что ошибочна именно подпись. Посмотрев это на Indy10 (примеры приложены ниже) я убедился что она действительно урленкодится, но видимо не так как нужно.
И сделал для тестирования рабочий тестовый вариант хтмл файла.
вот код РАБОЧЕГО варианта html файла:<form action="https://bo-demo01.yamoney.ru/demo/paywell/transferagent.asp"
method="post" >
<input type="hidden" name="Version" value="2.01">
<input type="hidden" name="TR_NR" value="126">
<input type="hidden" name="DSTACNT_NR" value="410037637381">
<input type="hidden" name="TR_AMT" value="6.05">
<input type="hidden" name="CUR_CD" value="10643">
<input type="hidden" name="ACT_CD" value="1">
<input type="hidden" name="CONT" value="Иванов Иван Иванович">
<input type="hidden" name="SIGN" value="-----BEGIN PGP MESSAGE-----
Version: PGP 6.5.8
owEBWwGk/okBFQMFAEg5G9NTVL2hVupyiQEBSiYIAJg38k/9M0U5NJBVZ0HdANxD
EZva1ewzBzcO/oWXwcQkIdcSYgBdlhddxr7H435Zr1/0gCysqxQdeBszNb7K+fiz
1SNdQyONWlRuvuzHORTuZPMT4YLfqNH675mjMBbGbO2x7xDgfZE+cMFpVPSnALeQ
PzuUuUsc6+CPIgCUdmlgZgbgfjepxCH4n9dhznOmfx2YSg1fl1I9O/PNxWk7spLu
06YCH0FUCwvICV2oHP5qnyZA3Pukj07L4e0cXj/IQYIgHMIgvYYxUaCPD/cY7qN0
luAKNCQfAyNiHZXncerhS+vzaunsKN74HXLKz/FxtcR0l8+y7sFQaZPqXMU40Q+s
QWIJdGVzdDYudHh0AAAAADEyNiYxJjQxMDAzNzYzNzM4MSY2LjA1JjEwNjQzJsji
4O3u4iDI4uDtIMji4O3u4uj3
=/Q+S
-----END PGP MESSAGE-----">
<br>Запрос на Яндекс
<br><input type="submit" value="Запрос">
</form>
Я пытаюсь тоже самое сделать с помощью делфи. Используя готовую демку по Indy, вот что у меня получилось, там по 500кб(закачаю на zalil.ru):
D6 + Indy 8:
http://slil.ru/25826843
D7 + Indy 10:
http://slil.ru/25826847
Помогите - как правильно передать этот массив данных, чтобы он дошёл до получателя в таком же виде как я его отправляю с хтмл файла. Уже всю голову сломал.
← →
vegarulez (2008-05-26 06:47) [1]Народ нид хелп!
← →
vegarulez (2008-05-26 10:59) [2]Взял лог с сервера - получается, так что при отправке в подписи прога заменяет символы "+" на пробелы... т.е. на сервак битая подпись приходит...
чешу репу дальше... у кого какие мысли как этого избежать?...
← →
Ega23 © (2008-05-26 11:29) [3]Попробуй переведи её из Base64 в HexString
← →
имя (2008-05-26 23:40) [4]Удалено модератором
← →
vegarulez (2008-05-28 06:13) [5]Код перегонки нашёл - сделал перегоняет. но там нужно наверно пробел допустим кодировать %20, т.е. в результат добавить символ %
А у меня чото никак не получается к Result функции прибавить знак % - пишет типа Char и ShortString. Подскажите как правильно это сделать.// Перегонка бинарного потока в строку с HEX-текстом
function StreamToHex(Buf: TStream): string;
const
Convert: array[0..15] of Char = "0123456789ABCDEF";
var
i, p: integer;
B: byte;
begin
SetLength(Result, Buf.Size * 2);
p := Buf.Position;
Buf.Position := 0;
for i := 1 to Buf.Size do
begin
Buf.Read(B, 1);
Result[(i * 2) - 1] := Convert[B shr $4];
Result[(i * 2)] := Convert[B and $F];
end;
Buf.Position := p;
end;
procedure TForm1.Txt_HexClick(Sender: TObject);
var
St: TStream;
begin
St := TMemoryStream.Create;
Memo1.Lines.SaveToStream(St);
Memo2.Text := StreamToHex(St);
St.Destroy;
end;
← →
Ega23 © (2008-05-28 09:41) [6]Взято из FGInt.pas поищи его в сети, там этих функций-конвертеров много.
Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String);
Var
i : longint;
b : byte;
Begin
HexStr := "";
For i := 1 To length(str256) Do
Begin
b := ord(str256[i]);
If (b Shr 4) < 10 Then HexStr := HexStr + chr(48 + (b Shr 4))
Else HexStr := HexStr + chr(55 + (b Shr 4));
If (b And 15) < 10 Then HexStr := HexStr + chr(48 + (b And 15))
Else HexStr := HexStr + chr(55 + (b And 15));
End;
End;
← →
vegarulez (2008-05-28 10:40) [7]А в моём примере к result`у функции % никоим образом пришить не получится. мне просто интересно в целях ликбеза. Уже и chr(25) прбовал и просто "%" всё равно не получается - и немогу поянть почему. вроде же описании функции StreamToHex стринг возращает и именно стриг и не могу получить на выходе (
помогите с ликбезом.
← →
vegarulez (2008-05-28 13:51) [8]Вообщем я практически решил проблему - осталась проблема со знаком +
при передачи строки хоть он явно обозначен как +, хоть через #43 как показано ниже, но на сервер приходит в этом месте пробел. Т.е. я так полагаю при выполнении HTTP.Post(cbURL.Text, MyList, Response); он заменяется на пробел и на сервер уже не приходит. Как быть?MyList.Add("Version=2.01");
MyList.Add("TR_NR=126");
MyList.Add("DSTACNT_NR=410037637381");
MyList.Add("TR_AMT=6.05");
MyList.Add("CUR_CD=10643");
MyList.Add("ACT_CD=1");
MyList.Add("CONT=Иванов Иван Иванович");
MyList.Add("SIGN=-----BEGIN PGP MESSAGE-----"#10#13
+ "Version: PGP 6.5.8"#10#13
+ #10#13
+ "owEBWwGk/okBFQMFAEg5G9NTVL2hVupyiQEBSiYIAJg38k/9M0U5NJBVZ0HdANxD"#10#13
+ "EZva1ewzBzcO/oWXwcQkIdcSYgBdlhddxr7H435Zr1/0gCysqxQdeBszNb7K"+#43+"fiz"#10#13
+ "1SNdQyONWlRuvuzHORTuZPMT4YLfqNH675mjMBbGbO2x7xDgfZE"+#43+"cMFpVPSnALeQ"#10#13
+ "PzuUuUsc6"+#43+"CPIgCUdmlgZgbgfjepxCH4n9dhznOmfx2YSg1fl1I9O/PNxWk7spLu"#10#13
+ "06YCH0FUCwvICV2oHP5qnyZA3Pukj07L4e0cXj/IQYIgHMIgvYYxUaCPD/cY7qN0"#10#13
+ "luAKNCQfAyNiHZXncerhS"+#43+"vzaunsKN74HXLKz/FxtcR0l8"+#43+"y7sFQaZPqXMU40Q"+#43+"s"#10#13
+ "QWIJdGVzdDYudHh0AAAAADEyNiYxJjQxMDAzNzYzNzM4MSY2LjA1JjEwNjQzJsji"#10#13
+ "4O3u4iDI4uDtIMji4O3u4uj3"#10#13
+ "=/Q"+#43+"S"#10#13
+ "-----END PGP MESSAGE-----");
HTTP.Post(cbURL.Text, MyList, Response);
← →
Ega23 © (2008-05-28 14:41) [9]Я что0то не пойму: а какая разница, в каком виде через Post прогонять? Там же тупо бинарный буфер идёт... Это для Get-запроса важно...
← →
vegarulez (2008-05-28 15:26) [10]ну тото и оно что он режет "+" в любом виде....
← →
Reindeer Moss Eater © (2008-05-28 15:27) [11]Экспортируй ЭЦП в текстовом формате
← →
Reindeer Moss Eater © (2008-05-28 15:27) [12]Либо кодируй двоичку в base64
← →
Palladin © (2008-05-28 15:32) [13]
> vegarulez (28.05.08 15:26) [10]
убери из TIdHTTP.HTTPOptions флаг hoForceEncodeParams
← →
vegarulez (2008-05-28 16:46) [14]Reindeer Moss Eater © (28.05.08 15:27) [11]
так, ты погляди - она сверху представлена - она и так в текстовом.
Reindeer Moss Eater © (28.05.08 15:27) [12]
не совсем понял...
Palladin © (28.05.08 15:32) [13]
убрал - не помогает.
← →
Palladin © (2008-05-28 16:57) [15]а Content-Type у тебя какой, надеюсь application/x-www-form-urlencoded ? хотя уже сомневаюсь, звиняюсь что не сначала прочел, ForceEncodeParams вернуть нужно
← →
vegarulez (2008-05-28 18:17) [16]Palladin © (28.05.08 16:57) [15]
idHTTP.pasprocedure TIdCustomHTTP.Post(AURL: string; ASource: TIdStrings; AResponseContent: TIdStream);
var
LParams: TIdStream;
begin
Assert(ASource<>nil);
Assert(AResponseContent<>nil);
// Usual posting request have default ContentType is application/x-www-form-urlencoded
if (Request.ContentType = "") or (TextIsSame(Request.ContentType, "text/html")) then {do not localize}
Request.ContentType := "application/x-www-form-urlencoded"; {do not localize}
LParams := TIdStringStream.Create(SetRequestParams(ASource));
try
Post(AURL, LParams, AResponseContent);
finally
Sys.FreeAndNil(LParams);
end;
end;
← →
vegarulez (2008-05-29 10:58) [17]то бишь application/x-www-form-urlencoded
← →
vegarulez (2008-06-02 10:57) [18]Народ... ну кто что посоветует.
Как поступить, что +-сы не затирались? Нид Хелп!
← →
Palladin © (2008-06-02 11:15) [19]
Var
s:TStringList;
s.Text:=
"?Version=2.01"+
"&TR_NR=126"+
"&DSTACNT_NR=410037637381"+
"&TR_AMT=6.05"+
"&CUR_CD=10643"+
"&ACT_CD=1"+
"&CONT=Иванов Иван Иванович"+
"&SIGN="+TIdURI.ParamsEncode(
"-----BEGIN PGP MESSAGE-----"#10#13+
"Version: PGP 6.5.8"#10#13+
#10#13+
"owEBWwGk/okBFQMFAEg5G9NTVL2hVupyiQEBSiYIAJg38k/9M0U5NJBVZ0HdANxD"#10#13+
"EZva1ewzBzcO/oWXwcQkIdcSYgBdlhddxr7H435Zr1/0gCysqxQdeBszNb7K+fiz"#10#13+
"1SNdQyONWlRuvuzHORTuZPMT4YLfqNH675mjMBbGbO2x7xDgfZE+cMFpVPSnALeQ"#10#13+
"PzuUuUsc6+CPIgCUdmlgZgbgfjepxCH4n9dhznOmfx2YSg1fl1I9O/PNxWk7spLu"#10#13+
"06YCH0FUCwvICV2oHP5qnyZA3Pukj07L4e0cXj/IQYIgHMIgvYYxUaCPD/cY7qN0"#10#13+
"luAKNCQfAyNiHZXncerhS+vzaunsKN74HXLKz/FxtcR0l8+y7sFQaZPqXMU40Q+s"#10#13+
"QWIJdGVzdDYudHh0AAAAADEyNiYxJjQxMDAzNzYzNzM4MSY2LjA1JjEwNjQzJsji"#10#13+
"4O3u4iDI4uDtIMji4O3u4uj3"#10#13+
"=/Q+S"#10#13+
"-----END PGP MESSAGE-----");
IdHTTP1.HTTPOptions:=IdHTTP1.HTTPOptions-[hoForceEncodeParams];
IdHTTP1.Post(url,s)
пробуй
Страницы: 1 вся ветка
Текущий архив: 2008.06.29;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.05 c