从 cURL 请求时的 Paypal Adaptivepayments 问题
Paypal Adaptivepayments Issue when requesting from cURL
我在 php 中创建了一个简单的 Web 应用程序,它使用 paypal 的 adaptivePayments/Pay Api,我使用 POSTMAN 进行了一些测试,一切正常,我发出了初始请求并获得了我的 payKey,也有了这个 payKey,我可以使用 /AdaptivePayments/PaymentDetails Api 检查交易状态,问题是当我尝试通过 php 代码发出请求时:
$endpoint = 'https://svcs.sandbox.paypal.com/AdaptivePayments/Pay';
$payload['actionType'] = "PAY";
$payload['clientDetails']['applicationId'] = "APP-80W284485P519543T";
$payload['clientDetails']['ipAddress'] = "xxx.xxx.xxx.xxx";
$payload['currencyCode'] = "USD";
$payload['feesPayer'] = "EACHRECEIVER";
$payload['memo'] = "Transaction";
$payload['receiverList']['receiver'] = $receivers;
$payload['requestEnvelope']['errorLanguage'] = "en_US";
$payload['returnUrl'] = "URL";
$payload['cancelUrl'] = "URL";
$json = json_encode($payload);
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'X-PAYPAL-SECURITY-USERID: ACCOUNT',
'X-PAYPAL-SECURITY-PASSWORD: PASSWORD',
'X-PAYPAL-SECURITY-SIGNATURE: SIGNATURE',
'X-PAYPAL-REQUEST-DATA-FORMAT: JSON',
'X-PAYPAL-RESPONSE-DATA-FORMAT: JSON',
'X-PAYPAL-APPLICATION-ID: APP-80W284485P519543T',
'Content-Type: application/json',
'Content-Length: ' . strlen($json)
));
$result = curl_exec($ch);
$receivers 是一个 PHP 数组,其中包含有关电子邮件和付款金额的信息,如下所示:
Array
(
[0] => Array
(
[amount] => 19.8
[email] => client2-ubs@gmail.com
[primary] =>
)
[1] => Array
(
[amount] => 20.7
[email] => client1-ubs@gmail.com
[primary] =>
)
[2] => Array
(
[amount] => 45
[email] => store-ubs@gmail.com
[primary] => 1
)
)
我没有得到任何错误,我什至得到了我用来创建 html 按钮的 payKey,这样用户就可以为他的商品付款,问题是当我检查付款状态时 /AdaptivePayments/PaymentDetails, 我得到:
{
"responseEnvelope": {
"timestamp": "2015-08-06T23:59:23.075-07:00",
"ack": "Success",
"correlationId": "bab22ca0bd887",
"build": "17603431"
},
"cancelUrl": "https://23410a33.ngrok.com/universal-bank-of-souls/",
"currencyCode": "USD",
"paymentInfoList": null,
"returnUrl": "https://23410a33.ngrok.com/universal-bank-of-souls/",
"status": "CREATED",
"payKey": "AP-8ML17897XK803351A",
"actionType": "PAY",
"feesPayer": "EACHRECEIVER",
"sender": {
"useCredentials": "false"
}
}
由于某些奇怪的原因,paymentInfoList 为空,因此用户在单击 paypal 按钮时看到错误(交易错误)。
正如我之前所说,如果我使用 POSTMAN 进行交易然后检查状态,我会得到正确的响应:
{
"responseEnvelope": {
"timestamp": "2015-08-07T00:14:08.510-07:00",
"ack": "Success",
"correlationId": "b9049ba0d4cf1",
"build": "17603431"
},
"cancelUrl": "URL",
"currencyCode": "USD",
"memo": "Bank of souls payment",
"paymentInfoList": {
"paymentInfo": [
{
"receiver": {
"amount": "123.30",
"email": "client2-ubs@gmail.com",
"primary": "false",
"paymentType": "SERVICE",
"accountId": "SLKM4ZQ5FMSHG"
},
"pendingRefund": "false"
},
{
"receiver": {
"amount": "510.30",
"email": "client1-ubs@gmail.com",
"primary": "false",
"paymentType": "SERVICE",
"accountId": "8PUDR7LSRS4MJ"
},
"pendingRefund": "false"
},
{
"receiver": {
"amount": "704.00",
"email": "store-ubs@gmail.com",
"primary": "true",
"paymentType": "SERVICE",
"accountId": "E29BAQX7C7P3N"
},
"pendingRefund": "false"
}
]
},
"returnUrl": "URL",
"status": "CREATED",
"payKey": "AP-9MU4806743660523S",
"actionType": "PAY",
"feesPayer": "EACHRECEIVER",
"reverseAllParallelPaymentsOnError": "false",
"sender": {
"useCredentials": "false"
}
}
(paymentInfoList 实际上包含一个 json 对象与商品,但这是使用 POSTMAN 手动执行请求)[=14=]
这可能是 PHP 问题吗?调试 curl 连接的一些想法对我有很大帮助。
PD:我整天都在调试这个,我什至 print_r $json 变量(我得到 json 格式)并直接复制/粘贴到邮递员和它的工作原理,但出于某种原因,使用 curl 的相同请求没有发送 $receivers 信息。
已解决,我正在使用两个不同的 api 凭据发出请求(创建订单和请求订单信息),而且,似乎贝宝在收到 api 凭据时隐藏了订单商品与原始订单不同,但仍显示订单状态(CREATE、COMPLETED 等)
我在 php 中创建了一个简单的 Web 应用程序,它使用 paypal 的 adaptivePayments/Pay Api,我使用 POSTMAN 进行了一些测试,一切正常,我发出了初始请求并获得了我的 payKey,也有了这个 payKey,我可以使用 /AdaptivePayments/PaymentDetails Api 检查交易状态,问题是当我尝试通过 php 代码发出请求时:
$endpoint = 'https://svcs.sandbox.paypal.com/AdaptivePayments/Pay';
$payload['actionType'] = "PAY";
$payload['clientDetails']['applicationId'] = "APP-80W284485P519543T";
$payload['clientDetails']['ipAddress'] = "xxx.xxx.xxx.xxx";
$payload['currencyCode'] = "USD";
$payload['feesPayer'] = "EACHRECEIVER";
$payload['memo'] = "Transaction";
$payload['receiverList']['receiver'] = $receivers;
$payload['requestEnvelope']['errorLanguage'] = "en_US";
$payload['returnUrl'] = "URL";
$payload['cancelUrl'] = "URL";
$json = json_encode($payload);
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'X-PAYPAL-SECURITY-USERID: ACCOUNT',
'X-PAYPAL-SECURITY-PASSWORD: PASSWORD',
'X-PAYPAL-SECURITY-SIGNATURE: SIGNATURE',
'X-PAYPAL-REQUEST-DATA-FORMAT: JSON',
'X-PAYPAL-RESPONSE-DATA-FORMAT: JSON',
'X-PAYPAL-APPLICATION-ID: APP-80W284485P519543T',
'Content-Type: application/json',
'Content-Length: ' . strlen($json)
));
$result = curl_exec($ch);
$receivers 是一个 PHP 数组,其中包含有关电子邮件和付款金额的信息,如下所示:
Array
(
[0] => Array
(
[amount] => 19.8
[email] => client2-ubs@gmail.com
[primary] =>
)
[1] => Array
(
[amount] => 20.7
[email] => client1-ubs@gmail.com
[primary] =>
)
[2] => Array
(
[amount] => 45
[email] => store-ubs@gmail.com
[primary] => 1
)
)
我没有得到任何错误,我什至得到了我用来创建 html 按钮的 payKey,这样用户就可以为他的商品付款,问题是当我检查付款状态时 /AdaptivePayments/PaymentDetails, 我得到:
{
"responseEnvelope": {
"timestamp": "2015-08-06T23:59:23.075-07:00",
"ack": "Success",
"correlationId": "bab22ca0bd887",
"build": "17603431"
},
"cancelUrl": "https://23410a33.ngrok.com/universal-bank-of-souls/",
"currencyCode": "USD",
"paymentInfoList": null,
"returnUrl": "https://23410a33.ngrok.com/universal-bank-of-souls/",
"status": "CREATED",
"payKey": "AP-8ML17897XK803351A",
"actionType": "PAY",
"feesPayer": "EACHRECEIVER",
"sender": {
"useCredentials": "false"
}
}
由于某些奇怪的原因,paymentInfoList 为空,因此用户在单击 paypal 按钮时看到错误(交易错误)。
正如我之前所说,如果我使用 POSTMAN 进行交易然后检查状态,我会得到正确的响应:
{
"responseEnvelope": {
"timestamp": "2015-08-07T00:14:08.510-07:00",
"ack": "Success",
"correlationId": "b9049ba0d4cf1",
"build": "17603431"
},
"cancelUrl": "URL",
"currencyCode": "USD",
"memo": "Bank of souls payment",
"paymentInfoList": {
"paymentInfo": [
{
"receiver": {
"amount": "123.30",
"email": "client2-ubs@gmail.com",
"primary": "false",
"paymentType": "SERVICE",
"accountId": "SLKM4ZQ5FMSHG"
},
"pendingRefund": "false"
},
{
"receiver": {
"amount": "510.30",
"email": "client1-ubs@gmail.com",
"primary": "false",
"paymentType": "SERVICE",
"accountId": "8PUDR7LSRS4MJ"
},
"pendingRefund": "false"
},
{
"receiver": {
"amount": "704.00",
"email": "store-ubs@gmail.com",
"primary": "true",
"paymentType": "SERVICE",
"accountId": "E29BAQX7C7P3N"
},
"pendingRefund": "false"
}
]
},
"returnUrl": "URL",
"status": "CREATED",
"payKey": "AP-9MU4806743660523S",
"actionType": "PAY",
"feesPayer": "EACHRECEIVER",
"reverseAllParallelPaymentsOnError": "false",
"sender": {
"useCredentials": "false"
}
}
(paymentInfoList 实际上包含一个 json 对象与商品,但这是使用 POSTMAN 手动执行请求)[=14=]
这可能是 PHP 问题吗?调试 curl 连接的一些想法对我有很大帮助。
PD:我整天都在调试这个,我什至 print_r $json 变量(我得到 json 格式)并直接复制/粘贴到邮递员和它的工作原理,但出于某种原因,使用 curl 的相同请求没有发送 $receivers 信息。
已解决,我正在使用两个不同的 api 凭据发出请求(创建订单和请求订单信息),而且,似乎贝宝在收到 api 凭据时隐藏了订单商品与原始订单不同,但仍显示订单状态(CREATE、COMPLETED 等)