ugrás a tartalomhoz

HTTP_Request - https

aurum · 2005. Jún. 20. (H), 23.12
A PEAR::HTTP_Request osztályból szerettem volna HTTPS-el postolni:
// Létrehozza a HTTP_Request objektumot
$request =& new HTTP_Request("https://www.moneybookers.com/app/payment.pl");
$request->setMethod(HTTP_REQUEST_METHOD_POST);
// Feltölti a paramétereket
$request->addPostData("pay_to_email", $system["moneybookers"]["pay_to_email"]);
$request->addPostData("transaction_id", $transactionID);
// Elküldi a kérést
$request->sendRequest();
// Kiírja a választ
echo $request->getResponseBody();


De a cél visszautasított:
Bad Request
Your browser sent a request that this server could not understand.

Reason: You're speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.


Hogyan lehet https post kérést küldeni PHP-ból? Ha a PEAR::HTTP_Request tud ilyet, akkor mi a hiba, hiányosság a fenti kódban?

Köszi
 
1

CURL

attlad · 2005. Jún. 20. (H), 23.32
http://hu2.php.net/manual/hu/ref.curl.php

Attila
2

CURL nem van, PEAR van

aurum · 2005. Jún. 21. (K), 00.03
Sajnos ezzel kell gazdálkodni
3

Open SSL

aurum · 2005. Jún. 21. (K), 00.09
A megoldás az Open SSL extension volt, ez kell a HTTP_Requestnek a HTTPS-hez. A végső cél viszont még továbbra is messze van. A lényeg, hogy szeretnék átadni pár adatot a bankkártyás tranzakcióhoz, post metódussal, majd ugyanott szeretném megnyitni a cél url-t is. Azért nem lehet közvetlenül a Moneybookers oldalára küldeni a postot, mert ehhez előbb létre kell hoznom egy transactionID-t. Tehát előbb a saját programom kell, hogy meghívódjon, az létrehoozza a tranzakciót, post-al átadja az adatokat a moneybookersnak, majd meg is jelenítni annak https oldalát, a továbbiakban már közvetlenül a bank https oldalával kommunikál a pógár. Valamiért azonban gyanús nekem, hogy ez összejöjjön.

Szerintetek megoldható valahogy?
4

Hajrá Kovács néni ;)

Hodicska Gergely · 2005. Jún. 21. (K), 09.56
Szia!


Az általad használt cuccot nem ismerem. CURL-lal biztosan le tudod szépen játszani ezt a kommunikációt. Pl. POST egy HTTPS oldalnak:
function httpsPost($url, $data)
{
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	curl_setopt($ch, CURLOPT_VERBOSE, 0);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_TIMEOUT, CURL_UTIL_CURL_TIMEOUT);
	curl_setopt($ch, CURLOPT_USERAGENT, CURL_UTIL_CURL_USERAGENT);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

	$content = curl_exec($ch);
	$error = curl_error($ch);
	curl_close ($ch);
	if (empty($error)) {
		return $content;
	} else {
		return false;
	}
}
Ha sikerül megoldanod, akkor mindenféleképpen írd majd le itt a megoldást. Akkár egy kis ismertetővel megspékelve egy cikk is lehetne belőle, mert ilyesmiről nem nagyon volt még itt szó, sőt általában kevés összetett példát lehet találni, nagyon hasznos lenne.


Felhő
5

Cikk jó lenne

Dualon · 2005. Jún. 21. (K), 11.06
Általában a HTTPS-ről, PHP-s kezeléséről, buktatóiról, stb. nagyon jó lenne egy cikk!
9

Sztem is ...

Max Logan · 2007. Feb. 1. (Cs), 17.16
... jó lenne egy ilyen cikk ...
6

Ha sikerül, miért ne?

aurum · 2005. Jún. 21. (K), 12.16
Semmi akadálya, megírom, csak jöjjön össze :)

Két kérdés, a curl_setopt($ch, CURLOPT_POSTFIELDS, $data); részben a $data egy asszociatív tömb, amiben az egyes post paraméterek nevei és értékük vannak felsorolva?

A másik, nekem az kell, hogy miután az adatokat postoltam, maga a böngésző is elmenjen arra az oldalra. Nem elég, ha a kapott válaszokat kiírom, mert ekkor még a bank saját oldalának kell megjelennie, ahol az ügyfél megadhatja az adatait. Ez előtt viszont nekem közölnöm kell a tranzakció részleteit, összeg, stb. Most úgy csinálom, hogy van egy végső ellenőrző oldal, ahol egyezteti az adatokat, viszont így belemódosíthat sajnos, a bank nem biztos, hogy azt a tartalmat kapja meg, amit én a hidden mezőkben megadtam. Ezért szeretném, hogy mindenképpen előbb a php programom induljon el, ami majd a korrekt értékeket postolja https-en keresztül a banknak, majd ugyanabban az ablakban meg is nyitja a bank tranzakciós oldalát.
7

Mint egy POST kérés törzs része

Hodicska Gergely · 2005. Jún. 21. (K), 13.23
a $data egy asszociatív tömb?

Nem, az egy string. Amit ott megadsz, az kerül be a HTTP kérés törzsébe. Ezt például egy LiveHttpHeaders FF kiterjesztéssel meg is tudod nézni egy űrlap elküldését követően. Szükség lehet arra, hogy csak valamilyen "raw" adatot küldj a szervernek. A Te esetedben így kell kinézzen: nev=param&nev2=param2... .

A második részre: nem teljesen tiszta nekem, hogy pontosan mi is lenne a kommunikáció pontos forgató könyve.


Felhő
8

Lehet tömb

aurum · 2005. Jún. 21. (K), 14.12
Gyorsan lecsekkoltam, nos a $data lehet asszociatív tömb is, string is, mindkettőt elfogadja. Ha tömbben adom meg, szépen felépíti belőle a kérést.

A másodk része nekem sem tiszta :) Megpróbálom vázolni az use case-t. Adva van egy eshop, fizetéskor a bank felé kell egy tranzakció azonosítót, meg vásárlási adatokat, összeget, stb. adni, arra az oldalra, ahol majd bekéri az user adatait. Természetesen ez https protokoll lesz, de nem is ez a lényeg. Jelenleg úgy zajlik a vásárlás, hogy amikor az user rákattint a fizetés gombra, az összegyűjtött áruk adatai, a végösszeg, stb. bekerülnek egy-egy hidden mezőben egy olyan formban, aminek az actionja a bank oldala. Ha itt elfogadja a dolgot, akkor a hidden mezőből átkerül a fizetendő összeg a bankhoz, a továbbiakban már ott zajlik a dolog. Igen ám, de ezzel egy jókora lyuk nyílt a rendszerben, mert tegyük fel bepakol a mókus 1000 forint értékű cuccot, majd itt, az utolsó, még nálam lévő oldalon a hidden mező tartalmát átírja 100 forintra és ezt submitolja a bank felé. Ott kifizeti a 100 forintot, a bank meg visszajelez, hogy a megadott tranzakaciót befejezte, minden rendben, pénz levonva.

A másik ilyen lyuk, hogy elmegy rendesen fizetni, majd közben egy másik ablakban belép újra a shopba és a még kifizetetlen kosarába pakolászik, miközben az alacsonyabb összeggel már elindította a műveletet.

Természetesen egyik sem megengedhető. Csakhogy ehhez zárolnom kell a kosarat, és indítanom egy fizetési tranzakciót, amikor a kosár eredeti tartalmára és árára adom és várom az adatokat, a végén ellenőrzöm, hogy tényleg annyit fizetett, amit kell. Ez jól is működik, csak az a probléma, hogy ha mégsem fizeti ki, akkor ott marad egy lockolt kosár, ami miatt meg nem tud új kosarat létrehozni, mert az adatbázis szerint épp fizetés közben van, nem módosíható.

Ehelyett valami olyan megoldást szeretnék, hogy a kosár csak akkor lockolódik és a tranzakció azonosító csak akkor keletkezik, amikor a végső összegző lapon rábökött a fizetésre, és ezeket az adatokat nem hidden mezőből kapná meg a bank, hanem a programom küldi el a böngészőt megkerülve közvetlenül a banknak. Ezt is meg tudom tenni, csakhogy akkor a böngésző címe a shop címe lesz és esze ágában sincs a postnak utána menni, hogy a bank https oldala jelenjen meg. Na persze látom én a probmlémát, hiszen ha nem a böngészőn keresztül ment a post a banknak, akkor a böngésző erről mit sem tud, nem is tudja követni az urlt, hanem megmarad azon a címen, ahol az én programom fut.

No, erre kellene nekem valami biztonságos és elegáns megoldás. A bank ne hidden mezőből értesüljön arról, hogy mennyi pénzt kell levonnia, a böngésző meg valahogy menjen utána a postnak.