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

时间:2015-02-02 06:10:16

标签: 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/

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

    我只是想在到达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;
    

2 个答案:

答案 0 :(得分:0)

我希望我能正确理解你。

对我而言,您似乎正在跳过用户需要授权付款的步骤。当您执行Pay(创建)操作时,您应该看到在PayPal的响应中获得RedirectURL。您需要将用户重定向到此URL,以便他们在PayPal上授权付款。

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

您的步骤需要更改为:

  1. 创建PayRequest
  2. 设置PaymentOptions
  3. 重定向到PayPal(来自PayRequest响应的RedirectURL)以进行用户授权
  4. 如果获得授权,则执行付款
  5. PayPal在the Pay API operation page

    上暗示这一点

    URL to redirect the sender's browser to after the sender has logged into PayPal and approved a payment; it is always required but only used if a payment requires explicit approval

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

    中提供的网址

答案 1 :(得分:0)

我正在使用延迟链式付款,我经常会遇到此错误“此付款申请必须由发件人授权”。实际上这是由于逻辑上的一个小错误。

错误的程序(@步骤3)

  1. 成功生成payKey
  2. 将其保存到数据库
  3. 因某种原因刷新页面,导致生成新的payKey(这个新的payKey不会更新到数据库)

    payRequest = pay();
    .....
    if(empty(db_record)) {
      .....
      db_record->payKey = payRequest->payKey;
      db_record->save();
    }
    
  4. 使用新的payKey付款(即发件人批准的付款)

  5. 尝试使用payKey从数据库执行付款(这确实很旧。那个payKey不习惯付款)
  6. 解决方案

    用最后一个payKey更新数据库,用于通过获得发件人的批准进行付款

    第3步应该是

        if(empty(db_record) || is_expired(db_record->payKey)) {
          payRequest = pay();
          .....
          .....
          db_record->payKey = payRequest->payKey;
          db_record->save();
        }