Можно ли использовать CURL и Sandbox разработчика Paypal? Когда я пробую этот код, он говорит в print_r ($ lines); что мне нужно войти в Песочницу, как я могу заставить его отправлять cookie-браузер?
Этот код находится на http://leepeng.blogspot.com/2006/04/standard-paypal-php-integration.html.
$orderno = $_SESSION["ss_last_orderno"]; $ppAcc = "[SELLER HERE]"; $at = "[AT HERE]"; //PDT Identity Token $url = "https://www.sandbox.paypal.com/cgi-bin/webscr"; //Test //$url = "https://www.paypal.com/cgi-bin/webscr"; //Live $tx = $_REQUEST['tx']; //this value is return by PayPal $cmd = "_notify-synch"; $post = "tx=$tx&at=$at&cmd=$cmd"; //Send request to PayPal server using CURL $ch = curl_init ($url); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_TIMEOUT, 30); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt ($ch, CURLOPT_POSTFIELDS, $post); $result = curl_exec ($ch); //returned result is key-value pair string $error = curl_error($ch); if (curl_errno($ch) != 0) //CURL error exit("ERROR: Failed updating order. PayPal PDT service failed."); $longstr = str_replace("\r", "", $result); $lines = split("\n", $longstr); print_r($lines); //parse the result string and store information to array if ($lines[0] == "SUCCESS") { //successful payment $ppInfo = array(); for ($i=1; $i<count($lines); $i++) { $parts = split("=", $lines[$i]); if (count($parts)==2) { $ppInfo[$parts[0]] = urldecode($parts[1]); } } $curtime = gmdate("d/m/YH:i:s"); //capture the PayPal returned information as order remarks $oremarks = "##$curtime##\n". "PayPal Transaction Information...\n". "Txn Id: ".$ppInfo["txn_id"]."\n". "Txn Type: ".$ppInfo["txn_type"]."\n". "Item Number: ".$ppInfo["item_number"]."\n". "Payment Date: ".$ppInfo["payment_date"]."\n". "Payment Type: ".$ppInfo["payment_type"]."\n". "Payment Status: ".$ppInfo["payment_status"]."\n". "Currency: ".$ppInfo["mc_currency"]."\n". "Payment Gross: ".$ppInfo["payment_gross"]."\n". "Payment Fee: ".$ppInfo["payment_fee"]."\n". "Payer Email: ".$ppInfo["payer_email"]."\n". "Payer Id: ".$ppInfo["payer_id"]."\n". "Payer Name: ".$ppInfo["first_name"]." ".$ppInfo["last_name"]."\n". "Payer Status: ".$ppInfo["payer_status"]."\n". "Country: ".$ppInfo["residence_country"]."\n". "Business: ".$ppInfo["business"]."\n". "Receiver Email: ".$ppInfo["receiver_email"]."\n". "Receiver Id: ".$ppInfo["receiver_id"]."\n"; //Update database using $orderno, set status to Paid //Send confirmation email to buyer and notification email to merchant //Redirect to thankyou page } //Payment failed else { print "Please try again..."; //Delete order information //Redirect to failed page }
Это должно работать:
$tid = $_GET['tx']; $auth_token = "zzzzzzzzzzzzzzzzzzzz"; $paypal_url = "www.sandbox.paypal.com"; $url = "https://" . $paypal_url . "/cgi-bin/webscr"; $post_vars = "cmd=_notify-synch&tx=" . $tid . "&at=" . $auth_token; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_vars); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 15); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_USERAGENT, 'cURL/PHP'); $fetched = curl_exec($ch); $lines = explode("\n", $fetched); $keyarray = array(); if (strcmp ($lines[0], "SUCCESS") == 0) { for ($i=1; $i<count($lines);$i++){ list($key,$val) = explode("=", $lines[$i]); $keyarray[urldecode($key)] = urldecode($val); } // check the payment_status is Completed // check that txn_id has not been previously processed // check that receiver_email is your Primary PayPal email // check that payment_amount/payment_currency are correct // process payment $firstname = $keyarray['first_name']; $lastname = $keyarray['last_name']; $itemname = $keyarray['num_cart_items']; $amount = $keyarray['mc_gross']; echo ("<h2>Thank you for your purchase!</h2>"); } else if (strcmp ($lines[0], "FAIL") == 0) { echo ("<h2>Sorry, something went wrong</h2>"); // log for manual investigation }
Также поиск $ _GET ['tx'] перестает работать после ~ 5 минут
Возможно, не совсем то, что вы хотите в качестве ответа, но я просто рекомендую этот сценарий, если вы хотите использовать PayPal из PHP:
http://www.micahcarrick.com/04-19-2005/php-paypal-ipn-integration-class.html
Очень чистый скрипт, который позволяет легко понять детали транзакции и редактировать вещи.
В нем также приводятся примеры использования сценария с песочницей PayPal. Если я правильно помню, вам просто нужно изменить одну переменную (и вам, очевидно, нужна учетная запись для песочницы).
Если кто-то использует java с paypal PDT .. apache commons httpclient 4.1 используется здесь.
// Imports ---------------- import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; // end of imports --------------- HttpClient httpclient = new DefaultHttpClient(); HttpParams myParams = httpclient.getParams(); HttpConnectionParams.setConnectionTimeout(myParams,40000); HttpConnectionParams.setSoTimeout(myParams,40000); HttpPost httppost = new HttpPost("https://www.sandbox.paypal.com/cgi-bin/webscr"); httppost.setHeader("Content-Type", "application/x-www-form-urlencoded"); try { // Add your data String txToken = "xxxxxxxxxxxx"; String authToken = "xxxxxxxxxxxxxxxxxxxxxxxxx"; List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("cmd", "_notify-synch")); nameValuePairs.add(new BasicNameValuePair("tx", txToken)); nameValuePairs.add(new BasicNameValuePair("at", authToken)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); InputStream is = response.getEntity().getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder str = new StringBuilder(); String line = null; while((line = reader.readLine()) != null){ str.append(line + "\n"); } is.close(); String responseText = str.toString(); logger.info("----------------------------------------------------"); logger.info("RESPONSE : " + responseText); logger.info("----------------------------------------------------"); getContext().getResponse().getWriter().write(responseText); } catch (Exception e) { logger.info("----------------------------------------------------"); logger.info("ERROR : " + e.getMessage()); logger.info("----------------------------------------------------"); }