php - 此付款请求必须由发件人授权 - Paypal

标签 php paypal paypal-adaptive-payments

好的,这是我所做的:

  1. 创建了一个 PayRequest

  2. SetPaymentOptions - https://developer.paypal.com/webapps/developer/docs/classic/api/adaptive-payments/SetPaymentOptions_API_Operation/

  3. ExecutePayment - “此付款请求必须由发件人授权”。我不知道为什么我无法执行付款。据我了解,一旦我成功执行付款,我将获得一个 payKey,我将使用它来将用户重定向到 paypal。 https://developer.paypal.com/webapps/developer/docs/classic/api/adaptive-payments/ExecutePayment_API_Operation/

附件是我使用的源代码。这些值都是硬编码的。我已经尽力浏览了类似的问题,这对我来说毫无意义,因为它与我的理解相矛盾。一些答案指出,在您执行付款之前,买家需要先批准付款。

我只想在到达paypal登录页面时查看所有项目的详细信息。

//1. Obtain endpoint. For live, no need sandbox?
$endPoint = "https://svcs.sandbox.paypal.com/AdaptivePayments/Pay";

//2. Format the HTTP headers needed to make the call.
$appID = "xxx"; //Sandbox test AppID:
$username = "xxx;
$password = "xxx";
$signature = "xxx";

$paypalHeaders = array(
    "X-PAYPAL-SECURITY-USERID :" . $username,
    "X-PAYPAL-SECURITY-PASSWORD :" . $password,
    "X-PAYPAL-SECURITY-SIGNATURE :" . $signature,
    "X-PAYPAL-APPLICATION-ID :" . $appID,
    "X-PAYPAL-REQUEST-DATA-FORMAT : JSON",
    "X-PAYPAL-RESPONSE-DATA-FORMAT : JSON"
);


$data = array();
$data['actionType'] = "CREATE"; //PAY
$data['currencyCode'] = "SGD";
$receiver['amount'] = $orderTotal;
$receiver['email'] = $receiverEmail;
$data['receiverList'] = array();
$data['receiverList']['receiver'][] = $receiver;
$data['returnUrl'] = $returnURL;
$data['cancelUrl'] = $cancleURL;
$requestEnvelope = array();
$requestEnvelope['errorLanguage'] = "en_US";
$data['requestEnvelope'] = $requestEnvelope;

//I omitted the POST call
//print_r($returnedData);
$payKey = $returnedData->payKey;  
$paymentStatus = $returnedData->paymentExecStatus;

/* * 设置支付选项 */

$endPoint = "https://svcs.sandbox.paypal.com/AdaptivePayments/SetPaymentOptions";

//paymentDetailsData
$paymentDetailsData = array();

//set payKey
echo "payKey: " . $payKey;
$paymentDetailsData['payKey'] = $payKey;

//displayOptions
$displayOptions['businessName'] = "My Business";
$paymentDetailsData['displayOptions'] = $displayOptions;

//senderOptions
$senderOptions = array();
$senderOptions['requireShippingAddressSelection'] =  true; //set to true if courier is chosen
$senderOptions['shippingAddress']['addresseeName'] = "Ny Name";
$senderOptions['shippingAddress']['street1'] = "Address 1Avenue 3";
$senderOptions['shippingAddress']['street2'] = "#xx-112";
$senderOptions['shippingAddress']['city'] = "Singapore";
$senderOptions['shippingAddress']['state'] = "Singapore";
$senderOptions['shippingAddress']['zip'] = "123456";
$senderOptions['shippingAddress']['country'] = "Singapore";
$paymentDetailsData['senderOptions'] = $senderOptions;

//item
$item = array();
$item['name'] = "Korea";
$item['itemPrice'] = 11;
//there is still price, and itemcount

//invoiceData
$invoiceData = array();
$invoiceData['item'] = $item;

//receiverOptions
$receiverOptions = array();
$receiverOptions['description'] = "Product description.";
$receiverOptions['invoiceData'] = $invoiceData;

$paypalEmail = "test@test.com"; //I may need to change this
$receiver['email'] = $paypalEmail;
$receiverOptions['receiver'] = $receiver;
$paymentDetailsData['receiverOptions'] = $receiverOptions;

//requestEnvelope. I have set the request envelope above. It is the same. Can still be used.
$paymentDetailsData['requestEnvelope'] = $requestEnvelope;

makePaypalCall($endPoint, $paypalHeaders, $paymentDetailsData);

/*
 * Get payment options. I can see the result of get payment options correctly,
 */
echo "GETTING PAYMENT OPTIONS";
$endPoint = "https://svcs.sandbox.paypal.com/AdaptivePayments/GetPaymentOptions";
$getPaymentData['payKey'] = $payKey;
$getPaymentData['requestEnvelope'] = $requestEnvelope;
makePaypalCall($endPoint, $paypalHeaders, $getPaymentData);

$endPoint = "https://svcs.sandbox.paypal.com/AdaptivePayments/ExecutePayment";


/*
 * ExecutePayment. Ok, I get the error here. This payment request must be authorized by the sender
 */
$executePaymentData = array();
echo "paykey: " . $payKey;
$executePaymentData['payKey'] = $payKey;
//$executePaymentData['actionType'] = "PAY";
$executePaymentData['requestEnvelope'] = $requestEnvelope;

最佳答案

希望我理解正确。

对我来说,您似乎跳过了用户需要授权付款的步骤。当您执行支付(创建)操作时,您应该会在 PayPal 的响应中看到一个 RedirectURL。您需要将用户重定向到此 URL,以便他们授权在 PayPal 上付款。

一旦他们批准了付款,您就可以执行付款了。

您的步骤需要更改为:

  1. 创建支付请求
  2. 设置付款方式
  3. 重定向到 PayPal(来自 PayRequest 响应的 RedirectURL)以进行用户授权
  4. 如果授权,执行付款

PayPal 在 the Pay API operation page 上对此进行了提示

在发件人登录 PayPal 并批准付款后将发件人的浏览器重定向到的 URL;它始终是必需的,但仅在付款需要明确批准时使用

在第 3 步之后,用户将返回到您在 $data['returnUrl'] = $returnURL;

中提供的 URL

关于php - 此付款请求必须由发件人授权 - Paypal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28272014/

相关文章:

php - mysql_real_escape_string 将数据与反斜杠一起存储在数据库中

ios - iOS 移动应用程序中的 Paypal 集成

php - Paypal 返回 true 或 false

api - 通过 stripe api 将付款拆分给多个供应商?

ios - iOS 中使用 MPL 的 Paypal 登录 session

paypal - 在 Paypal Embedded Payments 中获取请稍后重试

php - Symfony 编码标准在类型转换后是否需要保留空间?

PHP 到 Quickbooks - 如果她在桌面上运行,我如何连接两者?

javascript - .JS 格式的 base_url

javascript - 如何在 paypal.payment.create 中声明变量并在外部使用它