【问题标题】:One Paypal API request isn't sending all the data, but others are一个 Paypal API 请求未发送所有数据,但其他请求是
【发布时间】:2016-05-13 00:20:04
【问题描述】:

我正在制作一些使用 Paypal 的东西,但我在 Paypal 流程的最后一步遇到了一些麻烦。我有四个对 Paypal API 的调用,它们工作得很好,但最后一个没有。首先,这是我的 curl 函数

function curl($PayPalMode,$nvpreq) {
    $API_Endpoint = "https://api-3t.".$PayPalMode.".paypal.com/nvp";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $API_Endpoint);
    curl_setopt($ch, CURLOPT_VERBOSE, 1)
    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);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);

    $httpResponse = curl_exec($ch);

    $httpResponseAr = explode("&", $httpResponse);
    $httpParsedResponseAr = array();
    foreach ($httpResponseAr as $i => $value) {
        $tmpAr = explode("=", $value);
        if(sizeof($tmpAr) > 1) {
            $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
        }
    }
    if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
        return "Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.";
    }

    return $httpParsedResponseAr;
}

然后,如前所述,这用于不同的事物四次,例如

$data_set = array(
    USER = $PayPalApiUsername,
    PWD = $PayPalApiPassword,
    SIGNATURE = $PayPalApiSignature,
    METHOD = "SetExpressCheckout",
    VERSION = urlencode(109.0),
    L_BILLINGTYPE0 = "RecurringPayments",
    L_BILLINGAGREEMENTDESCRIPTION0 = urlencode($paypal_obj->name)." (".urlencode($paypal_obj->price)."/Month)",
    CANCELURL = $PayPalCancelURL,
    RETURNURL = $PayPalReturnURL,
    CURRENCYCODE = $PayPalCurrencyCode
);
$nvpreq_set = http_build_query($data_set);
$set_express_checkout_curl = curl($PayPalMode,$nvpreq_set);

前四个请求(还包括 GetExpressCheckoutDetails、CreateRecurringPaymentsProfile 和 GetRecurringPaymentsProfileDetails)都可以正常工作,使用完全相同的方法。但是,第五个也是最后一个没有。这是使用 UpdateRecurringPaymentsProfile,因为我有时想试用一个月。它使用与上面完全相同的方法

$data_update = array(
    USER = $PayPalApiUsername,
    PWD = $PayPalApiPassword,
    SIGNATURE = $PayPalApiSignature,
    METHOD = "UpdateRecurringPaymentsProfile",
    VERSION = urlencode(109.0),
    PROFILEID = $payer_id,
    TRIALBILLINGPERIOD = "Month",
    TRIALBILLINGFREQUENCY = 1,
    TRIALTOTALBILLINGCYCLES = 1,
    TRIALAMT = 10.00,
    CURRENCYCODE = "GBP"
);
$nvpreq_update = http_build_query($data_update);
$update_profile_curl = curl($PayPalMode,$nvpreq_update);

但是,这不起作用,而是返回错误 11510 - 试用金额无效,试用金额必须 >= 0。在向 Paypal 发送支持消息后,他们确认没有通过 TRIALAMT,这就是他们的全部正在接收

Timestamp 20-Jan-2016 17:40:41 GMT (1453311641)
UpdateRecurringPaymentsProfileRequest 
profileid "(profileid)"
currencycode "GBP"
trialtotalbillingcycles "1"
method "UpdateRecurringPaymentsProfile"
version "109"
user (email address)
correlation_id (correlation id)

如您所见,不只是 TRIALAMT 没有通过,还有 TRIALBILLINGPERIOD 和 TRIALBILLINGFREQUENCY。这是所有这一切中唯一没有传递某些数据的实例——我的问题是有人知道为什么会这样吗?我完全迷失了,我不知道为什么这些数据不会被传递,除非我的最终请求有问题?

【问题讨论】:

  • 如果您将数字括在引号中是否有效,例如:-“10.00”和“1”甚至“109.0”,因此它们作为文本值而不是数字值传递?

标签: php curl paypal


【解决方案1】:

据我所知,对您的参数进行 urlencoding(在 curl 函数中)可以防止数据丢失,如以下网址所述:http://www.brandonchecketts.com/archives/array-versus-string-in-curlopt_postfields

...所以,在 PHP/cURL 中发送 POST 请求时,首先将其 urlencode 为字符串是很重要的。

这将生成多部分/表单数据版本

$data = array('name' => 'value', 'name2' => 'value2');
curl_setopt($curl_object, CURLOPT_POSTFIELDS,  $data)

而且这个简单的改变将确保它使用 application/x-www-form-urlencoded 版本:

$data = array('name' => 'value', 'name2' => 'value2');
$encoded = '';
foreach($data as $name => $value){
    $encoded .= urlencode($name).'='.urlencode($value).'&';
}
// chop off the last ampersand
$encoded = substr($encoded, 0, strlen($encoded)-1);
curl_setopt($curl_object, CURLOPT_POSTFIELDS,  $encoded)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2021-09-19
    • 2020-02-11
    • 2020-09-22
    • 2017-08-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多