Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]odsyłanie danych w odpowiedzi na request - jak ?
Forum PHP.pl > Forum > Przedszkole
phpamator
Hello ludziki ....... zielone(początkujący).

smile.gif

Podpowiedzcie, jak z poziomu php to zrobić ..... otóż ze strony wysyłam POST'em pewne dane, odbieram je i robię odpowiednie operacje (zapisuje do bazy, generuję odpowiedz) następnie chciałbym odpowiednio spreparowane dane odesłać celem dalszego przetworzenia wink.gif
Ależ zagadkowo piszę ..... smile.gif generalnie chodzi o to, że buduję sobie płatność paypal'em (wiem że są gotowe rozwiązania ale ja chciałbym sam!) i te przygotowane dane muszę odesłać spowrotem do sklepu. Znalazłem trochę na ten temat i skomponowałem coś takiego ale za "chube" nie chce mi to wysyłac pod wskazany adres sad.gif
  1. $url = 'http://www.myshop.net/application/public/classes/paypal.php';
  2. $resp = respconn();
  3. echo 'Connecting ...<br/>';
  4. $user = "INSERT INTO paypal_responses.users (fname,lname,email,status_id,order_id) VALUES ('".$_POST['fname']."','".$_POST['lname']."','".$_POST['email']."','Completed','".$_POST['order_id']."')";
  5. echo '<br/>'.$user.'<br/>';
  6. //print_r($resp);
  7. if(mysqli_query($resp,$user)) {
  8. echo '<br/>Connected!<br/>';
  9. echo 'Query executed!<br/>';
  10. echo "User successfully registered!<br/>";
  11. mysqli_close();
  12. } else {
  13. echo "Problem with user registration!<br/>";
  14. }
  15.  
  16. $order = "SELECT * FROM paypal_responses.users WHERE email = '".$_POST['email']."' LIMIT 1";
  17. echo '<br/>==================== ORDER PROCESSING ====================<br/>';
  18. $data = mysqli_fetch_array(mysqli_query($resp,$order));
  19. echo $data;
  20. echo '<br/>'.$order.'<br/>';
  21. // do tego momentu działa .... dalej już nic się nie dzieje .....
  22. $options = array(
  23. 'http' => array(
  24. 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
  25. 'method' => 'POST',
  26. 'content' => http_build_query($data)
  27. )
  28. );
  29. // $options daje array(1) { 'http' => array(3) { 'header' => string(49) "Content-type: application/x-www-form-urlencoded " 'method' => string(4) "POST" 'content' => string(106) "user_id=10&fname=Roma&lname=Atch&email=juliaking%40gmail.com&status_id=Completed&order_id=43953" } }
  30. // czyli to co chcę wysłać
  31. $context = stream_context_create($options);
  32. $result = file_get_contents($url, false, $context);
  33. if ($result === FALSE) {
  34. echo 'Can`t send data!<br/>';
  35. }
  36. var_dump($context);// NULL questionmark.gif
  37. var_dump($result);//NULL questionmark.gif


Co skopałem ?

  1. # a tu inny przykład
  2. $options = array('http' =>
  3. 'method' => 'POST',
  4. 'header' => 'Content-type: application/x-www-form-urlencoded',
  5. 'content' => $postString
  6. )
  7. );
  8. # tworzyny context
  9. $context = stream_context_create($options);
  10. $result = file_get_contents($url, false, $context);


i czym to się różni od mojej formy ?
Jak to zrobić ?
SmokAnalog
Nie do końca rozumiem co chcesz zrobić smile.gif Możesz napisać krok po kroku? Najlepiej pokaż szczegółowo, co robisz. Pokaż formularzyk.
phpamator
Hej smoku,

Co chcę osiągnąc ? Otóż po wypełnieniu formularza po stronie sklepu, wysyłam dane do PayPal'a. Otwiera się strona gdzie podaje się dane i dokonuje płatności, wtedy po dokonaniu transakcji PayPal odpowiada odsyłając dane na podstawie których po stronie sklepu zakańczana jest operacja sprzedaży, uaktualniane dane w bazie i czyszczony koszyk.
I to własnie usiłuję zrobić.
Oczywiście to ma być w pewnym sensie tylko emulator PayPal'a albo tego co ona tam robi smile.gif w calach testowych. Ma odpowiadać w podobny sposób, żebym mógł dopracować wszystko.
SmokAnalog
Jesteś pewien, że PayPal nie ma prawdziwego trybu testowego? Osobiście nie wiem, bo się nie bawiłem API PayPala.

Ale jeśli chciałbyś coś takiego totalnie zasymulować, to powinno to działać tak:

  1. Wysyłasz formularz lub robisz Ajaxowy request do "zewnętrznego" API, które możesz trzymać równie dobrze u siebie. Te zewnętrzne API wiedzą gdzie przekierować po całej akcji. Wiedzą to albo po tokenie, albo podajesz im bezpośrednio Redirect URL na który ma przejść po całej akcji.
  2. API robi swoje, przyjmuje płatność i przekierowuje na wspomniany przed chwilą Redirect URL, wysyłając Ci przy okazji jakieś dane.
  3. Jesteś znowu "u siebie", ale z dodatkowymi danymi. Robisz z nimi co chcesz, a przy okazji załatwiasz swoje sprawy, jak np. czyszczenie koszyka.
phpamator
No własnie, nie wiem tylko jak sobie zbudować taki "odpowiadacz" w zasadzie to wszystko czego potrzebuję to odesłać spowrotem "$_REQUEST['payment_status']['Completed']" bo to w zasadzie jedyne co mi potrzebne żeby zrobić całą resztę smile.gif
ale nie wiem jak to zrobić z poziomu PHP wink.gif taki ze mnie amator wink.gif
SmokAnalog
Albo zrobić zwykłe przekierowanie do URL-a i dodać do niego parametr ?payment_status=completed (zakładam, że z tym $_REQUEST['payment_status']['Completed'] się pomyliłeś i chodziło Ci o $_REQUEST['payment_status'] o wartości 'Completed'), albo jeśli wolisz zrobić request POST, to wtedy powinieneś w tym API użyć cURL lub jakiejś biblioteki, która wysyła zapytania.
phpamator
Tak to miałem na myśli $_REQUEST['payment_status'] i value = 'Completed'.
Jeśli taką wartość zanotuje w odpowiedzi od serwera dokona zmian w bazie i zamknię zamówienie.

Tylko tego nie wiem, jak z poziomu skryptu PHP odpowiedzieć.


Poniżej fragment który ma odebrać odpowiedź.

  1. // Jeśli "Completed" zamykam zamówienie i wysyłam emaila z powiadomieniem.
  2. if ($_REQUEST && isset($_REQUEST['payment_status'])) {
  3. require_once '../../../config/dbConfig.php';
  4. require_once '../../../config/config.php';
  5. $idOrder=(isset($_REQUEST["item_number"]) ? $_REQUEST["item_number"] : '');
  6. $strPaymentStatus=(isset($_REQUEST['payment_status']) ? $_REQUEST['payment_status'] : '');
  7. $strStatus=($strPaymentStatus=='Completed' ? 'OK' : '');
  8. $strPaymentAuthorisation=(isset($_REQUEST['verify_sign']) ? $_REQUEST['verify_sign'] : '');
  9. $strPaymentID=(isset($_REQUEST['txn_id']) ? $_REQUEST['txn_id'] : '');
  10. $strEmail=(isset($_REQUEST['payer_email']) ? $_REQUEST['payer_email'] : '');
  11. $strUpdate = "UPDATE shop_order SET payment_type = 'paypal' WHERE order_id = '$idOrder'"
  12. $strSQL = "UPDATE tblOrder ";
  13. if ($strPaymentStatus!='') $strSQL.=(strpos($strSQL,' SET ')===false ? 'SET ' : ', ')."strPaymentStatus='".mysql_real_escape_string($strStatus) . "'";
  14. if ($strPaymentAuthorisation!='') $strSQL.=(strpos($strSQL,' SET ')===false ? 'SET ' : ', ')."strPaymentAuthorisation='".mysql_real_escape_string($strPaymentAuthorisation) . "'";
  15. if ($strPaymentID!='') $strSQL.=(strpos($strSQL,' SET ')===false ? 'SET ' : ', ')."strPaymentPayerStatus='".mysql_real_escape_string($strPaymentID) . "'";
  16. $strSQL.=" WHERE idOrder=$idOrder";
  17.  
  18. mysql_query($strSQL);
  19.  
  20. if ($strStatus=="OK") {
  21. $strSubject = "PADS Order Placed";
  22. $strSQL="SELECT * FROM tblOrderSupplier LEFT JOIN tblSupplier USING (idSupplier) WHERE idOrder='$idOrder'"; # Notify Supplier(s)
  23. $objRS = mysql_query($strSQL);
  24. while ($objRow=mysql_fetch_array($objRS)) {
  25. $strHeaders = "From: PADS Ltd <no-reply@pads.cor>\nContent-Type: text/html\n";
  26. $strMessage = "<html><body><img src=\"$website/images/emailheader.jpg\" /><table>\r\n";
  27. $strMessage .= "<tr><td><p style='font-family: Arial'>Hello " . $objRow['strCompanyName'] . "</p>\r\n<br />\r\n";
  28. $strMessage .= "<tr><td><p style='font-family: Arial'>An order has been created via PADS Ltd, please login for more information.</p>\r\n";
  29. $strMessage .= "</td></tr></table></body></html>";
  30. #mail($objRow['strCompanyEmail'], $strSubject, $strMessage, $strHeaders);
  31. mail('enquiries@pads.cor', $strSubject, $strMessage, $strHeaders);
  32. }
  33. sendConfirmationEmail($idOrder);
  34. } else {
  35. echo '<br/>No email sent!';
  36. }
  37. } else {
  38. echo '<br/>Nothing to do!<hr>';
  39. }
SmokAnalog
Tak jak mówiłem: albo przekierować, czyli po prostu:
  1. header('Location: ' . $redirectUrl . (strpos($redirectUrl, '?') === false ? '?' : '&') . http_build_query(['payment_status' => 'Completed']));


Albo wysłać zapytanie cURL-em / inną biblioteką. Tu masz przykład na cURL: http://php.net/manual/en/curl.examples-basic.php
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.