[PHP] acties uitvoeren voor posten naar externe server

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een formulier dat gepost wordt naar een server van een externe partij. Het formulier bevat een aantal gegevens die de externe partij nodig heeft. Het script op de externe server waar het formulier heen wordt gepost stuurt de bezoeker (na verwerking van de gegevens) echter ook door naar een bepaalde url, en deze url is dynamisch gegenereerd, dus elke keer anders.

Op zich werkt dit goed, maar ik wil de gegevens die ik verstuur naar de externe server ook in mijn eigen database hebben en eventueel vanuit mijn eigen script nog een email versturen naar de gebruiker. Het punt is echter dat als ik simpewel in de "action" van het formulier het adres van de externe server neerzet dat ik dan op mijn eigen server geen actie meer kan ondernemen op basis van de postgegevens. Dit is dus niet de bedoeling.

Als alternatief had ik bedacht om het formulier gewoon zonder action te posten (naar mijn eigen pagina dus gewoon) en dan eerst daar de gegevens op te slaan en de email te versturen en daarna de gegevens via een curl sessie naar de externe server te posten. Dit kan echter niet, omdat de gebruiker door het script op de externe server doorgestuurd moet worden. Ik kan dit niet zelf doen omdat de url variabel is. Een mogelijke oplossing die ik me bedacht had is dat ik via curl de url achterhaal waar de gebruiker heengestuurd zou worden op basis van zijn gegevens en de gebruiker vervolgens vanuit mijn eigen script doorstuur naar deze url. Echter, weet ik niet of dit mogelijk is met curl, ik heb er al naar gezocht maar kom er niet uit.

Weet iemand hoe ik het bovenstaande probleem met curl of wellicht via een hele andere (en misscien wel betere) weg kan oplossen?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Je zou ook nog kunnen denken aan een stukje AJAX-techniek ( XMLHttpRequest ) om de gegevens bij een onsubmit eerst te verzenden (dus via JS) naar je eigen server, en daarna het formulier met form.submit(); pas te versturen naar de externe server.
Je zou eventueel ook nog een iframe kunnen gebruiken als fallback. Het iframe wordt dan dus een soort mirror van de ingevulde gegevens, die je ook weer eerst verzendt naar de server van jezelf en daarna pas het echte formulier verzendt.

Je moet je wel bewust zijn van de nadelen van deze aanpak, bij een browser zonder javascript wordt het formulier niet verzonden naar je eigen server (wel naar de andere server!)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

Verwijderd schreef op zaterdag 01 november 2008 @ 17:33:
maar ik wil de gegevens die ik verstuur naar de externe server ook in mijn eigen database hebben
Hoezo wil je dat? :?
Verwijderd schreef op zaterdag 01 november 2008 @ 17:33:en eventueel vanuit mijn eigen script nog een email versturen naar de gebruiker.
Zonder toestemming van de gebruiker mag je dat niet doen.

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Via cURL krijg je een response van de externe server na je POST-request, die kan je echo-en naar de gebruiker, wat wel en probleem is zijn cookies of sessies die er eventueel worden gestart.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Hoezo zou jij statistieken van je website willen weten? :?
Om maar even met een wedervraag te antwoorden... ;)

Maar goed, kan me voorstellen dat je zelf ook statistieken hiervan zou willen bijhouden.
Of om te kijken waar (bijvoorbeeld) op gezocht word, zodat je eventueel kan filteren op bepaalde onderwerpen, die niet wenselijk zijn.

Om maar even iets geks te zeggen... :)

[ Voor 5% gewijzigd door CH4OS op 02-11-2008 01:16 ]


Acties:
  • 0 Henk 'm!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

GJtje schreef op zondag 02 november 2008 @ 01:15:
[...]
Hoezo zou jij statistieken van je website willen weten? :?
Om maar even met een wedervraag te antwoorden... ;)
Mjah, gegevens naar een externe server, dan denk ik toch vrij snel aan gebruikersnaam / wachtwoord.

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

ibmos2warp schreef op zondag 02 november 2008 @ 01:28:
Mjah, gegevens naar een externe server, dan denk ik toch vrij snel aan gebruikersnaam / wachtwoord.
Ik denk eerder aan een zoekformulier voor Google of zo... :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor alle reacties.

Ik zal eerste even uitleggen waarom ik precies wil wat ik uitlegde in mijn eerste post. Het gaat om persoonlijke gegevens van de bezoeker die ik op wil slaan in mijn eigen db en daarnaast naar de externe partij wil doorsturen. Ik verzend de gebruiker een email met bepaalde informatie. Met dit alles stemt de gebruiker in, dat is dus het probleem niet:)

Dan het technische aspect. Als ik het goed begrijp kom ik niet onder het gebruik van JS uit.
@krvabo:
je geeft terecht aan dat niet iedereen JS gebruikt en dat het dan niet altijd zal werken. Echter, het is geen ramp als het bijvoorbeeld in 5% van de gevallen niet werkt, dus dan is JS een goede oplossing voor me denk ik.
Je spreek van AJAX-techniek ( XMLHttpRequest ) om eerst naar mijn eigen server te verzenden en daarna met form.submit te verzenden naar de externe server. Maar als de gebruiker dan geen JS heeft dan werkt het toch ook het versturen naar de externe server niet? Of waar moet ik het JS even precies door laten triggeren? kan ik het zo maken dat het alsnog naar de externe server wordt gestuurd als JS niet werkt?
En "iframe kunnen gebruiken als fallback", dit is dus een alternatieve oplossing die ik tegelijkertijd met de AJAX oplossing gebruik? Zeg maar als het 1 niet werkt heb ik het ander nog?

Kun je wellicht iets duidelijker uitleggen hoe ik het een en ander zou kunnen implementeren? Ik snap namelijk vaag wel wat je bedoelt, maar zie niet in hoe ik dit kan maken. Heb je wellicht een voorbeeld?

Bedankt!

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Allereerst, de andere oplossingen in dit topic genoemd zijn mooier en waarschijnlijk ook beter, maar ik zal even uitleggen wat ik bedoel (Pseudo).

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
function verstuur() {
  var formulier = ..;
  var xmlHttpObj = new XMLHttpRequest();
  xmlHttpObj.open(..)
  xmlHttpObj.send(..) // waarden van het formulier versturen naar je eigen server
  if (req.readyState == 4) {
      if (req.status == 200) {
        // gelukt
      }
  }
  return true; // zodat hij iig altijd wordt verzonden, ook al mislukt het versturen naar je server
}

HTML:
1
2
3
<form action="http://andereserver/bla.php" method="post" onsubmit="return verstuur();">
 ...
</form>

Als de gebruiker dus javascript uit heeft staan heeft het formulier altijd nog een goede action.

Een iframe is dan dus onzichtbaar, en in plaats van het versturen via XMLHttpRequest, maak je in het iframe gewoon hetzelfde formulier als op je pagina. Ook op dat formulier de 'verstuur()'-functie aanroepen bij de onsubmit waardoor het formulier gevuld en verstuurd wordt (form.submit();).

Het is geenszins een 'backup', maar meer 'een manier waar je ook aan kunt denken'. Je kunt dus een manier kiezen, mooi/nieuw/lastig versus 'lelijk'/simpel.

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

GJtje schreef op zondag 02 november 2008 @ 01:30:
[...]
Ik denk eerder aan een zoekformulier voor Google of zo... :)
Das ook prive.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wat een slechte oplossing om dit met XHR te doen zeg :{ Extern gegevens posten kun je veel beter doen via cURL. Is ook nog eens veel makkelijker. Zoekze, op php.net is er meer dan genoeg info over te vinden :)

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Cartman! schreef op zondag 02 november 2008 @ 22:53:
Wat een slechte oplossing om dit met XHR te doen zeg :{ Extern gegevens posten kun je veel beter doen via cURL. Is ook nog eens veel makkelijker. Zoekze, op php.net is er meer dan genoeg info over te vinden :)
Als je zou lezen dan zou je zien dat iedereen hier ook aangeeft dat het niet de beste manier is en wordt aangeraden met curl te werken. Er wordt ook een oplossing gegeven hoe dit op te lossen (curl geeft de url terug geloof ik?), maar de TS heeft voorkeur voor XHR.
Als je ook verder had gelezen had je ook gezien dat de TS al aan de gang is geweest met curl.

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik kom tegen dat er een poging gedaan is maar er niet uitkwam vanwege redenen die naar mijn idee op te lossen zijn. Je kunt met curl ook gewoon cookies ed. gebruiken en je kunt volgens mij redirects gewoon volgen (curl_setopt). Ik denk dus dat de TS nu naar XHR grijpt omdat ie er met curl niet uitkomt. Ik ben van mening dat XHR niet bedoeld is voor dergelijke dingen.

Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55

skabouter

Skabouter

Waarom niet de volgende opstelling

[1]form -> post naar eigen server (sla data op)
[2] server -> verstuur gegevens terug naar de gebruiker voor 'accept' (in browser)
[3] klant klikt op "ok" -> post form (met velden die afkomstig zijn van vorige post) naar externe server

als de klant op "wijzigen klikt" dan weer formulier laten zien en naar stap 1

Op deze manier hoef je niets lastig te doen via cUrl of AJAX en is het ook nog een netter voor de gebruiker :)

[ Dislect ]


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
Waarom moeilijk doen. Je kan vanuit php gewoon een http request versturen, naar een server. Dus:

Form submit,
Verwerking op eigen server.
Server doet http 1.1 post naar externe partij
Server vangt headers af, en stuurt de client weer door.

Acties:
  • 0 Henk 'm!

Verwijderd

Indien de externe partij voor zn registratie proces SSL gebruikt heb je dan volgens mij toch een probleem. Is dat niet het geval, dan kan de privacy discussie wel eindigen denk ik. Ook het checken waard: accepteert het formulier (of whatever) bij de externe partij ook GET input, dan kan je de gebruiker gewoon redirecten naar een zelf gecontrueerde URL die dmv GET de parameters meegeeft. (kleine kans, maar zeker formulieren van de 'oude garde' worden nog vaak met $_REQUEST uitgelezen)

Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-09 15:29

Equator

Crew Council

#whisky #barista

Verwijderd schreef op dinsdag 04 november 2008 @ 09:22:
Indien de externe partij voor zn registratie proces SSL gebruikt heb je dan volgens mij toch een probleem. Is dat niet het geval, dan kan de privacy discussie wel eindigen denk ik. Ook het checken waard: accepteert het formulier (of whatever) bij de externe partij ook GET input, dan kan je de gebruiker gewoon redirecten naar een zelf gecontrueerde URL die dmv GET de parameters meegeeft. (kleine kans, maar zeker formulieren van de 'oude garde' worden nog vaak met $_REQUEST uitgelezen)
Met CURL kan je prima SSL secured formulieren invullen. Je kan zelfs opgeven of het certificaat gecontroleerd moet worden of niet in geval van een self-signed certificaat.

CURL is imo de makkelijkste oplossing.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor alle reacties! Ik zal even reageren op wat er zoal gesteld en gezegd is:

Het is inderdaad zo dat ik zowel JS als curl heb overwogen en heb geprobeerd. De opmerking dat ik JS ben gaan gebruiken omdat ik er met curl niet helemaal uitkom is ook terecht. Met behulp van het voorbeeld van krvabo heb ik nu een oplossing in JS die werkt dus dank daarvoor!

Echter, wil ik uiteraard proberen om het 100% netjes op te lossen door curl te gebruiken, hetgeen door de meeste van jullie zo te lezen ook warm wordt aanbevolen:D

Probleem is echter dat ik ook na nog verder gezocht te hebben er niet helemaal uitkom. Het gaat inderdaad om een https request, maar ik lees dat dit geen belemmering hoeft te zijn. Wat mijn probleem is dat ik niet weet hoe ik de url waarnaar de gebruiker door de externe partij geforward wordt moet afvangen. Ik heb al zitten kijken naar het afvangen van headers met curl, maar ik kan niet uitvinden hoe ik de url kan achterhalen waar de gebruiker heen geredirect zou worden als ik het externe formulier als action in mijn form zou instellen.

Kan iemand me uitleggen of een hint geven met betrekking tot het achterhalen van die url via de headers?

Als ik daarvoor een oplossing heb ben ik er denk ik, want dan kan ik daarnaast onbeperkt een eigen script uitvoeren en vervolgens de gebruiker via de php header functie doorsturen naar de opgehaalde url toch?

Thanks!

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
http://nl3.php.net/curl_set_opt daar staan een hele berg met opties voor curl die je kunt gebruiken met bijhorende uitleg. Er is bijv. de optie "CURLOPT_FOLLOWLOCATION" die redirects volgt (zoals je wilt) en hoe je curl gebruikt met SSL (https) staat er ook beschreven (lees ook de comments). Volgens mij moet alles wat je wilt kunnen met curl. En curl is niet altijd makkelijk inderdaad...
Pagina: 1