Этот платежный запрос должен быть авторизован отправителем — Paypal

Хорошо, вот что я сделал:

  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 = "[email protected]"; //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;

1

Решение

Надеюсь, я вас правильно понял.

Мне кажется, что вы пропускаете шаг, когда пользователь должен авторизовать платеж. Когда вы делаете операцию Pay (Create), вы должны увидеть получение RedirectURL в ответе PayPal. Вам необходимо перенаправить пользователя на этот URL, чтобы он авторизовал платеж через PayPal.

Как только они одобрили платеж, вы сможете выполнить платеж.

Ваши шаги должны измениться на:

  1. Создать PayRequest
  2. Установить PaymentOptions
  3. Перенаправить на PayPal (RedirectURL из ответа PayRequest) для авторизации пользователя
  4. Если разрешено, ExecutePayment

PayPal намекает на это страница операции Pay API

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 пользователь будет возвращен на URL, указанный вами в $data['returnUrl'] = $returnURL;

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 не использовался для осуществления платежа)

Решение

обновить базу данных последним payKey, который использовался для осуществления платежа, получив одобрение отправителя

шаг 3 должен быть как

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

По вопросам рекламы [email protected]