Оформить заказ на мою корзину заказов с помощью PayPal

На моем сайте пользователь может заполнить свою корзину заказов предметами.

Как только это будет завершено, они могут нажать кнопку проверки.

Я хочу, чтобы они проверяли использование PayPal.

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

Если пользователь проходит процесс оплаты, пользователь перенаправляется на мою страницу успеха.

Однако я ожидаю, что страница успеха также получит идентификатор транзакции платежа, но paypal отправит обратно токен и плательщик.

Форма моего оформления выглядит так:

<form action="/en/checkout"> <input type="submit" name="submit" value="Checkout"> </form> 

Мой код, который выполняет проверку:

 function checkoutAction() { $request = $this->getRequest(); require_once(LIB_PATH.'/MFW/Paypal/Flows/Paypal_NVP.php'); $paypal_nvp = new MFW_Paypal_NVP(); // this should normally be filled by looping though the basket items $data = array('L_PAYMENTREQUEST_0_NAME0'=>'Single License', 'L_PAYMENTREQUEST_0_NUMBER0'=>'1111-2222-3333-4444-5555-6666-7777-8888', 'L_PAYMENTREQUEST_0_AMT0'=>39.99, // or enterprise 299.00 'L_PAYMENTREQUEST_0_QTY0'=>1, ); $_SESSION['Payment_Amount'] = 39.99; $result = $paypal_nvp->CallShortcutExpressCheckout(59.98, $data); $ack = strtoupper($result['ACK']); if($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING') { $paypal->RedirectToPayPal($result['TOKEN']); exit(); } } 

Код в классе Paypal_NCP:

 function generate_nvp_string($total_value, $data = array()) { $params = array('PAYMENTREQUEST_0_AMT'=>$total_value, 'PAYMENTREQUEST_0_PAYMENTACTION'=>$this->payment_type, 'RETURNURL'=>$this->return_url, 'CANCELURL'=>$this->cancel_url, 'PAYMENTREQUEST_0_CURRENCYCODE'=>$this->currency, ); $params = array_merge($params, $data); $nvp_string = ''; foreach($params as $name => $value) { $nvp_string.= '&'.$name.'='.$value; } // example string // &PAYMENTREQUEST_0_AMT=39.99&PAYMENTREQUEST_0_PAYMENTACTION=Sale&RETURNURL=http://return-address&CANCELURL=http://cancel-address&PAYMENTREQUEST_0_CURRENCYCODE=EUR&L_PAYMENTREQUEST_0_NAME0=Single License&L_PAYMENTREQUEST_0_NUMBER0=1111-2222-3333-4444-5555-6666-7777-8888&L_PAYMENTREQUEST_0_AMT0=39.99&L_PAYMENTREQUEST_0_QTY0=1 return $nvp_string; } function CallShortcutExpressCheckout($total_value, $data = array()) { $_SESSION['currencyCodeType'] = $this->currency; $_SESSION['PaymentType'] = $this->payment_type; $result = $this->hash_call('SetExpressCheckout', $this->generate_nvp_string($total_value, $data)); $ack = strtoupper($result['ACK']); if ($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING') { $_SESSION['TOKEN'] = urldecode($result['TOKEN']); } return $result; } 

Итак, как мне получить информацию о транзакции для меня, чтобы иметь возможность обрабатывать платеж в backoffice? (Для этого мне нужен идентификатор транзакции)

Вы вызываете SetExpressCheckout. Чтобы завершить транзакцию с помощью Express Checkout, вы также должны вызвать (необязательно) GetExpressCheckoutDetails, чтобы получить PayerID (уникальный идентификатор покупателя) и (обязательно) DoExpressCheckoutPayment.

Напомним:
Чтобы использовать Express Checkout, вы должны вызвать API SetExpressCheckout. В вызове API вы указываете детали продуктов, сумм и RETURNURL. Это то, что вы делаете в коде выше.
Как только вы разместите эти данные в конечной точке API PayPal, вы получите в ответ токен. Затем вы перенаправите покупателя и добавите токен по следующему URL-адресу: https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-XXXXXXX

Как только покупатель согласится на покупку, он перенаправляется обратно на URL-адрес, указанный вами в RETURNURL.
Теперь вы должны подтвердить подтверждение заказа и вызвать API GetExpressCheckoutDetails **. При вызове GetExpressCheckoutDetails поставьте токен. В ответе API GetExpressCheckoutDetails вы найдете идентификатор PayerID.

Теперь вы можете позвонить в DoExpressCheckoutPayment и зарядить покупателя. Не забывайте включать токен и идентификатор плательщика при вызове DoExpressCheckoutPayment.

Что касается IPN: вам это больше не нужно, так как вы также получите TransactionID в ответ API на DoExpressCheckoutPayment. IPN был бы полезен, если впоследствии вы захотите «отслеживать» транзакцию. Например, получать уведомления в случае любых возвратов / платежей и т. Д.
Это просто требует установки сценария IPN и включая NOTIFYURL = http: // …. как в SetExpressCheckout, так и в DoExpressCheckoutPayment.

** Идентификатор PayerID добавляется в GET вашего RETURNURL. Поэтому вы можете пропустить вызов GetExpressCheckoutDetails, если хотите.

(Частичная копия моего ответа на вопрос, почему DoExpressCheckoutPayment требуется для Paypal? )