gpt4 book ai didi

php - 一个 Paypal API 请求不会发送所有数据,但其他请求会

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:33 25 4
gpt4 key购买 nike

我正在制作一些使用 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。这是所有这些数据未被传递的唯一实例 - 我的问题是有人知道为什么会这样吗?我完全迷失了,我不知道为什么这些数据不会被传递,除非我的最终请求有问题?

最佳答案

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

...So, when sending POST requests in PHP/cURL, it is important to urlencode it as a string first.

This will generate the multipart/form-data version

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

And this simple change will ensure that it uses the application/x-www-form-urlencoded version:

$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)

关于php - 一个 Paypal API 请求不会发送所有数据,但其他请求会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35183215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com