Оформите мою корзину заказов с PayPal - PullRequest
1 голос
/ 03 ноября 2011

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

Как только это будет сделано, они могут нажать кнопку «Оформить заказ».

Я хочу, чтобы они оформляли заказ через PayPal.

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

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

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

Моя форма оформления заказа выглядит следующим образом:

<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;
}

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

1 Ответ

1 голос
/ 03 ноября 2011

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

Подведем итог:
Чтобы использовать Express Checkout, вы должны вызвать API SetExpressCheckout. В вызове API вы указываете детали продуктов, суммы и ВОЗВРАТ. Это то, что вы делаете в приведенном выше коде.
После публикации этих данных в конечной точке 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 и списать средства с покупателя. Не забудьте указать токен и идентификатор PayerID при вызове DoExpressCheckoutPayment.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...