Paypal 使用 PHP cURL 获取交易详情
Posted
技术标签:
【中文标题】Paypal 使用 PHP cURL 获取交易详情【英文标题】:Paypal get transaction details with PHP cURL 【发布时间】:2016-09-12 21:32:29 【问题描述】:所以经过大量搜索后,我终于能够使用 php cURL 成功获取我的 Paypal 访问令牌。现在我正在尝试根据事务 ID 检索事务详细信息。到目前为止,我认为我的呼叫 URL 是正确的,但是我认为我的帖子数据格式可能不正确。使用的代码如下:
<?php
//this function is for handling post call requests
function make_post_call($url, $postdata)
global $token;
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSLVERSION , 6);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer '.$token,
'Accept: application/json',
'Content-Type: application/json'
));
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
$response = curl_exec( $curl );
print_r($response); //IM NOW RECEIVING OUTPUT, however symbols are now being replaced by placeholders such as '%40', how can i prevent this?
if (empty($response))
die(curl_error($curl)); //close due to error
curl_close($curl);
else
$info = curl_getinfo($curl);
echo "Time took: " . $info['total_time']*1000 . "ms\n";
curl_close($curl); // close cURL handler
if($info['http_code'] != 200 && $info['http_code'] != 201 )
echo "Received error: " . $info['http_code']. "\n";
echo "Raw response:".$response."\n";
die();
// Convert the result from JSON format to a PHP array
$jsonResponse = json_decode($response, TRUE);
return $jsonResponse;
$token = get_access_token($url,$postArgs); //works and returns a valid access token
//This is the URL for the call
$url = 'https://api-3t.sandbox.paypal.com/nvp';
//This is the data to be sent in the call
$postdata = array(
'USER' => 'peoplesroewrwwsg_api1.outlook.com',
'PWD' => 'KR2TVKHGDSHSNDJ6E2',
'SIGNATURE' => 'AFcWxV21C7fdFHSGGSDGD51G0BJYUWOCSyjUAKPPGs',
'METHOD' => 'GetTransactionDetails',
'VERSION' => '123',
'TransactionID' => '1RE953245246192109'
);
$postdata = http_build_query($postdata);
//$postdata = json_encode($postdata); //Is this the correct way of formatting?
$transactionInfo = make_post_call($url, $postdata); //get transaction details NOT WORKING
print_r($transactionInfo); //does not print anything
?>
我没有收到任何 cURL 错误,所以我认为问题是我发送的数据或我如何格式化它。
可以在此处找到有关如何执行此操作的 breif Paypal 指南-> https://developer.paypal.com/docs/classic/express-checkout/gs_transaction/#tryit 但是它是用 cURL 而不是 PHP cURL 扩展编写的,所以我不确定我是否正确发送数据。
Paypal GetTransactionDetails 详情在这里-> https://developer.paypal.com/docs/classic/api/merchant/GetTransactionDetails_API_Operation_NVP/
非常感谢任何有关数据格式的指导或任何其他建议!
----------------------------------- - - - - - 更新! - - - - - - - - - - - - - - - - - - - ---------------------
现在,当我在执行 cURL 语句后立即打印结果时,我会收到如下信息:
RECEIVERID=GN7SRQEGEREASDV9BQU&EMAIL=peoplesrobotiblabal%40outlook%2ecom&PAYERID=JC5RWUUKWGDFYJYY&PAYERSTATUS=verified&COUNTRYCODE=US&SHIPTONAME=Jane%20Smurf...
可以看出,诸如句点之类的一些符号正被诸如“%40”之类的占位符所取代。可以确定这件事的根源吗?是因为我期待 JSON 响应吗?
【问题讨论】:
文档清楚地说明了名称 => 值对而不是 JSON。使用http_build_query()
构建帖子数据。是什么让您认为响应会是 JSON 格式?
你好!非常感谢您的建议(我也只是猜测响应是 JSON,我不确定它到底是什么)。我将它改回http_build_query()
并添加了一个打印语句,该语句在函数内部收到 cURL 结果后立即打印它,我现在收到了一个正确的输出!某些符号如何被占位符替换,例如 '%40'
这是进行http请求时需要的urldecoded字符串。你能把所有的print_r
注释掉,然后在你发出curl请求后就做var_dump($POST)
。请用结果更新问题。我认为 API 会发出回帖请求。
好吧var_dump($response)
产生与上面相同的字符串,而var_dump($_POST)
产生-> array(0)
编辑:如果我不完全理解你,也很抱歉,例如我不确定回帖请求
不,这只是我的猜测,因为响应看起来像一个查询字符串。在这种情况下,您可以尝试parse_str($response, $response_array)
。其中$response_array
将包含响应作为数组元素。
【参考方案1】:
要从 PHP 数组构建 http 查询字符串,您可以使用 PHP http_build_query()
。示例:
$array = ['username' => 'John', 'password' => '123456abc'];
$postdata = http_build_query($array);
您提到的符号是特殊字符的urlencoded形式。 Http 请求将要求对查询字符串进行 urlencoded。 %40
是 @
的 urlencoded 形式。如果将来您需要对 urlencoded 字符串进行编码/解码,您可以使用rawurldecode()
、rawurlencode()
、urlencode()
和urldecode()
。
用于解析来自 PAYPAL NVP API 的响应。您可以使用parse_str()
。示例 1:
$response = 'status=success&code=02';
parse_str($response, $response_array);
//$response_array will contain the $response as array
示例 2:
$response = 'status=success&code=02';
parse_str($response);
//this will display success
echo $status;
//this will display 02
echo $code;
【讨论】:
【参考方案2】:<?php
function get_transaction_details( $transaction_id )
$api_request = 'USER=' . urlencode( 'api_username' )
. '&PWD=' . urlencode( 'api_password' )
. '&SIGNATURE=' . urlencode( 'api_signature' )
. '&VERSION=76.0'
. '&METHOD=GetTransactionDetails'
. '&TransactionID=' . $transaction_id;
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp' ); // For live transactions, change to 'https://api-3t.paypal.com/nvp'
curl_setopt( $ch, CURLOPT_VERBOSE, 1 );
// Uncomment these to turn off server and peer verification
// curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
// curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_POST, 1 );
// Set the API parameters for this transaction
curl_setopt( $ch, CURLOPT_POSTFIELDS, $api_request );
// Request response from PayPal
$response = curl_exec( $ch );
// print_r($response);
// If no response was received from PayPal there is no point parsing the response
if( ! $response )
die( 'Calling PayPal to change_subscription_status failed: ' . curl_error( $ch ) . '(' . curl_errno( $ch ) . ')' );
curl_close( $ch );
// An associative array is more usable than a parameter string
parse_str( $response, $parsed_response );
return $parsed_response;
$response = get_transaction_details('transaction_id');
echo "<pre>"; print_r($response);
?>
【讨论】:
【参考方案3】:从 cURL 接收信息
$str = RECEIVERID=GN7SRQEGEREASDV9BQU&EMAIL=peoplesrobotiblabal%40outlook%2ecom&PAYERID=JC5RWUUKWGDFYJYY&PAYERSTATUS=verified&COUNTRYCODE=US&SHIPTONAME=Jane%20Smurf...
请使用parse_str("$str"); // add your value here, it will give you proper data format
更多详情:https://www.w3schools.com/php/func_string_parse_str.asp
【讨论】:
以上是关于Paypal 使用 PHP cURL 获取交易详情的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP cURL for paypal 获取交易详细信息时出现安全错误