2016-05-26 46 views
0

好吧,所以下面的代碼給了我上述錯誤「開始日期無效」。即使我從各種來源證實,這是一個有效且格式良好的開始日期。代碼的res沒有問題,因爲它已成功返回正確的餘額。我搜索了每個地方,但無法找到解決方案。請幫忙。謝謝!貝寶API(NVP)TransactionSearch給出錯誤10004 - 開始日期無效

class Paypal 
{ 
/** 
* API Version 
*/ 
const VERSION = 51.0; 

/** 
* List of valid API environments 
* @var array 
*/ 
private $allowedEnvs = array(
    'beta-sandbox', 
    'live', 
    'sandbox' 
); 

/** 
* Config storage from constructor 
* @var array 
*/ 
private $config = array(); 

/** 
* URL storage based on environment 
* @var string 
*/ 
private $url; 

/** 
* Build PayPal API request 
* 
* @param string $username 
* @param string $password 
* @param string $signature 
* @param string $environment 
*/ 
public function __construct($username, $password, $signature, $environment = 'live') 
{ 
    if (!in_array($environment, $this->allowedEnvs)) { 
    throw new Exception('Specified environment is not allowed.'); 
    } 
    $this->config = array(
    'username' => $username, 
    'password' => $password, 
    'signature' => $signature, 
    'environment' => $environment 
    ); 
} 

/** 
* Make a request to the PayPal API 
* 
* @param string $method API method (e.g. GetBalance) 
* @param array $params Additional fields to send in the request (e.g. array('RETURNALLCURRENCIES' => 1)) 
* @return array 
*/ 
public function call($method, array $params = array()) 
{ 
    $fields = $this->encodeFields(array_merge(
    array(
     'METHOD' => $method, 
     'VERSION' => self::VERSION, 
     'USER'  => $this->config['username'], 
     'PWD'  => $this->config['password'], 
     'SIGNATURE' => $this->config['signature'] 
    ), 
    $params 
    )); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $this->getUrl()); 
    curl_setopt($ch, CURLOPT_POST, count($fields)); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields)); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $response = curl_exec($ch); 
    if (!$response) { 
    throw new Exception('Failed to contact PayPal API: ' . curl_error($ch) . ' (Error No. ' . curl_errno($ch) . ')'); 
    } 
    curl_close($ch); 
    parse_str($response, $result); 
    return $this->decodeFields($result); 
} 

/** 
* Prepare fields for API 
* 
* @param array $fields 
* @return array 
*/ 
private function encodeFields(array $fields) 
{ 
    return array_map('urlencode', $fields); 
} 

/** 
* Make response readable 
* 
* @param array $fields 
* @return array 
*/ 
private function decodeFields(array $fields) 
{ 
    return array_map('urldecode', $fields); 
} 

/** 
* Get API url based on environment 
* 
* @return string 
*/ 
private function getUrl() 
{ 
    if (is_null($this->url)) { 
    switch ($this->config['environment']) { 
     case 'sandbox': 
     case 'beta-sandbox': 
     $this->url = "https://api-3t.".$this->config['environment'].".paypal.com/nvp"; 
     break; 
     default: 
     $this->url = 'https://api-3t.paypal.com/nvp'; 
    } 
    } 
    return $this->url; 
} 
} 
$paypal = new Paypal('xxxxxxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); 



print_r($paypal->call('TransactionSearch', array("STARTDATE"=>"2016-02-24T00:00:00Z"))); 
+0

正確的樣本應該是:STARTDATE = 2016-05-25T00:00:00Z。請參閱https://developer.paypal.com/docs/classic/api/merchant/TransactionSearch_API_Operation_NVP/ –

回答

1

我覺得你要$this->encodeFields()調用(內部call()),導致您的參數值是雙urlencode()「d。 $this->encodeFields()在您的$fields陣列中的每個元素上調用urlencode();然而,http_build_query()自動爲你做這個。因此,您在撥打PayPal時可能會以STARTDATE=2016-02-24T00%253A00%253A00Z結束,實際上它應該是STARTDATE=2016-02-24T00%3A00%3A00Z

+0

這很有道理。會試試看 – MindHacker