PHP Curl Paypal 沙盒
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1776827/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
PHP Curl Paypal Sandbox
提问by Rad The Mad
Is it possible to use CURL and Paypal's Developer Sandbox? When I try this code it says in print_r($lines); that I need to login to the Sandbox, how can I make it send my browser cookie?
是否可以使用 CURL 和 Paypal 的 Developer Sandbox?当我尝试这段代码时,它在 print_r($lines); 中说 我需要登录到沙盒,我怎样才能让它发送我的浏览器 cookie?
This code is from http://leepeng.blogspot.com/2006/04/standard-paypal-php-integration.html
此代码来自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/Y H: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
}
回答by vladikoff
This should work:
这应该有效:
$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
}
Also $_GET['tx'] look up stops working after ~5 minutes
另外 $_GET['tx'] 查找在 ~5 分钟后停止工作
回答by Franz
Maybe not exactly what you want as an answer, but I just keep recommending this script if you want to use PayPal from PHP:
也许不完全是您想要的答案,但如果您想从 PHP 使用 PayPal,我会一直推荐这个脚本:
http://www.micahcarrick.com/04-19-2005/php-paypal-ipn-integration-class.html
http://www.micahcarrick.com/04-19-2005/php-paypal-ipn-integration-class.html
Very clean script, which makes it easy to understand the parts of a transaction and edit things.
非常干净的脚本,可以轻松理解事务的各个部分和编辑内容。
It also comes with examples provided on how to use the script with PayPal's sandbox. If I remember correctly, you just have to change one variable (and you obviously need an account for the sandbox).
它还提供了有关如何在 PayPal 的沙箱中使用脚本的示例。如果我没记错的话,您只需要更改一个变量(显然您需要一个沙箱帐户)。
回答by Rukmal Dias
If anyone using java with paypal PDT.. apache commons httpclient 4.1 is used here..
如果有人使用带有paypal PDT的java..这里使用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("----------------------------------------------------");
}

