Я использую классический API PayPal для авторизации и обработки платежа с помощью Express Checkout (https://developer.paypal.com/docs/classic/express-checkout/ht_ec-singleAuthPayment-curl-etc/).
Хотя авторизация действительна в течение трех дней согласно документации, срок действия токена истекает в течение трех часов.
Итак, как я могу перехватить транзакцию после истечения срока действия токена?
PS.
Я знаю, что это дубликат Как я могу получить платеж через 1 день после его авторизации, если срок действия токена PayPal истекает через 3 часа? но, как и опрашивающий пользователь, «DoExpressCheckoutPayment» может быть выполнен после трехчасового периода.
И автор упомянутого вопроса, и вы делаете одну и ту же ошибку в понимании концепций PayPal.
Токен и авторизация — это не одно и то же. Токен — это механизм для подключения пользовательского соглашения к предстоящей финансовой транзакции; думать об этом как о расширении или части веб-сессии. Маркер описывает внутрипроцессное действие и может использоваться для генерации финансовой транзакции, но НЕ является финансовой транзакцией.
Авторизация — это один тип финансовой транзакции, который может быть сгенерирован из этого токена / сеанса. Разрешение резервирует средства от покупателя, таким образом давая продавцу / получателю гарантию, что средства будут доступны от покупателя в течение определенного периода времени. Это фактически не перемещает фонды; это происходит только тогда, когда (если) выполняется вторая финансовая транзакция со ссылкой на авторизацию: «захват». Короче, авторизация & захват разделить «продажу» на две части: один, который обеспечивает транзакцию Можно происходят, и второй, который на самом деле делает это возможным.
Вы должны выполнить DoExpressCheckout с пометкой «авторизация», как только пользователь вернется (ну, возможно, после еще одной или двух страниц на вашем сайте … но не спустя несколько дней). Затем вы выбрасываете токен EC и просто сохраняете авторизацию #. Единственное действие, которое вы должны выполнить через несколько дней, — это захват, для которого требуется только # авторизация.
Я предполагаю, что выполнение заказа клиента каким-либо образом, цифровым или физическим, является причиной задержки до того, как вы его захватите.
Если вы хотите избежать удержания средств на счете клиента и готовы принять на себя некоторый риск того, что средства не будут присутствовать при захвате, вы также можете использовать оплату «заказ», чтобы сделать то, что не обязательная авторизация во время взаимодействия с покупателем.
Если у вас более сложная ситуация, например, сумма не известна во время сеанса взаимодействия с пользователем, поэтому вместо использования авторизации вам нужно использовать другой продукт PayPal, такой как ссылочные транзакции / соглашения о выставлении счетов / будущие платежи, которые позволяют пользователю предоставлять вам более открытый доступ разрешение выставить их счет в будущем.
решил (вроде) благодаря @geewiz.
1) Я делаю параллельный платеж с «paymentaction = order» в два магазина.
2) После того, как пользователь принимает параллельный платеж, я получаю токен, с помощью которого я делаю DoExpressCheckoutPayment в оба магазина PayPal. оплата остается заказом.
3) Затем я получаю ссылку, с помощью которой я делаю DoCapture, которая высвобождает деньги и переводит их на мой счет.
ВТОРОЙ ВОПРОС —
как второй владелец магазина (так как у меня есть параллельный платеж) может получить свою долю оплаты?
Вызов той же функции с его идентификатором транзакцииУ вас нет прав для выполнения этого вызова APImsgstr «ошибка, так как подпись скрипта php принадлежит моему магазину.
решено путем:
1) Установить ExpressCheckout на свой аккаунт (действие оплаты == заказ)
$request_params = array(
'RETURNURL' => $obj['SUCCESSURL'],
'CANCELURL' => $obj['CANCELURL'],
'NOSHIPPING' => '1',
'BRANDNAME' => $obj['BRANDNAME'],
'PAYMENTREQUEST_0_CURRENCYCODE' => $obj['CURRENCY'],
'PAYMENTREQUEST_0_DESC' => $obj['ITEMDESCRIPTION'],
'PAYMENTREQUEST_0_PAYMENTACTION' => 'Order',
'PAYMENTREQUEST_0_AMT' => $obj['AMOUNTTOTAL'],
'PAYMENTREQUEST_0_SELLERPAYPALACCOUNTID' => $obj['RECEIVER1'],
'PAYMENTREQUEST_0_PAYMENTREQUESTID' => $obj['REQUESTID1']
);
$response = $obj['PAYPAL']->request('SetExpressCheckout', $request_params);
2) DoExpressCheckout
$request_params = array(
'TOKEN' => $obj['TOKEN'],
// 'PAYMENTACTION' => 'Authorization',
'PAYERID' => $obj['PAYERID'],
'PAYMENTREQUEST_0_PAYMENTACTION' => 'Order',
'PAYMENTREQUEST_0_AMT' => $obj['AMOUNTTOTAL'],
'PAYMENTREQUEST_0_SELLERPAYPALACCOUNTID' => $obj['RECEIVER1'],
'PAYMENTREQUEST_0_PAYMENTREQUESTID' => $obj['REQUESTID1'],
'PAYMENTREQUEST_0_CURRENCYCODE' => $obj['CURRENCY']
);
$response = $obj['PAYPAL']->request('DoExpressCheckoutPayment', $request_params);
echo '<b>02. DO TRANSACTION</b><br />';
echo '<pre>';
print_r($response);
echo '</pre>';
3) DoCapture в течение 24 часов на свой счет
echo '<a href="pay_app.php?tid=' . $response['PAYMENTINFO_0_TRANSACTIONID'] . '&amt='. $response['PAYMENTINFO_0_AMT'] . '">CAPTURE AS APP</a><br/>';
4) в случае успеха DoCapture сделайте MassPayment на второй аккаунт
$request_params = array(
'L_EMAIL0' => $obj['RECEIVERHOST'],
'L_AMT0' => $obj['AMT'],
'L_NOTE0' => "transaction complete",
'CURRENCYCODE' => $obj['CURRENCY']
);
$response = $obj['PAYPAL']->request('MassPay', $request_params);
echo '<b> MASSPAY</b><br />';
echo '<pre>';
print_r($response);
echo '<br/>';
print_r($obj);
echo '</pre>';
echo '<br/>';