За последние 24 часа нас посетили 59929 программистов и 1774 робота. Сейчас ищут 819 программистов ...

paypal и статусы платежа

Тема в разделе "PHP для новичков", создана пользователем vikrorpert, 23 фев 2015.

  1. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    не могу разобраться как обработать ответ палки после платежа
    куча статусов-ACK, PAYERSTATUS,CHECKOUTSTATUS,PAYMENTSTATUS и что с ними делать?
    доку читаю но не могу ничего понять, в гугле нашел один пример , но там проверяют только ACK
    официальных примеров найти не могу
    делаю через http://payum.org/ но у них в доке тоже сложно разобраться
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    посмотрел пример по ссылке. насколько я понял это примеры данных, которые идут при запросе и ответе
    то что мне нужно я не нашел

    может это настолько тривиально что никто об этом не хочет писать?
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    А ты этот пример запустил как это было написано в readme файле?
    Там есть пример формирование ссылки на оплату и при получении ответа от paypal проверка статуса платежа.
    PayPal Payments - similar to Express Checkout in Classic APIs (Source I, Source II) что такое
    Step II: Execute after Success (required step after user approval)

    https://github.com/paypal/PayPal-PHP-SDK/blob/master/sample ... PayPal.php
    // # Create Payment using PayPal as payment method
    // This sample code demonstrates how you can process a
    // PayPal Account based Payment.
    // API used: /v1/payments/payment

    https://github.com/paypal/PayPal-PHP-SDK/blob/master/sample ... ayment.php
    // #Execute Payment Sample
    // This is the second step required to complete
    // PayPal checkout. Once user completes the payment, paypal
    // redirects the browser to "redirectUrl" provided in the request.
    // This sample will show you how to execute the payment
    // that has been approved by
    // the buyer by logging into paypal site.
    // You can optionally update transaction
    // information by passing in one or more transactions.
    // API used: POST '/v1/payments/payment/<payment-id>/execute'


    ------------
    в первом файле формируешь ссылку и указываешь куда вернуть пользователя, во втором файле когда пользователь оплатит или откажется пайпал из настроек первого файла перенаправит пользователя на второй файл где ты уже и решай что делать
     
  5. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    под Express попал только пример CreatePaymentUsingPayPal.php. source 2 показывает как получить объект платежа, но не показывает как обработать его с учетом статусов
    попытался найти в файлах упоминание ACK но не нашел

    может я не правильно объяснил- как получить сам ответ я знаю. мне нужно понять как с учетом статуса ответа определить засчитать на моем сайте оплату или нет
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    у меня нет песочницы paypal, во втором файле есть ResultPrinter::printResult("Executed Payment", "Payment", $payment->getId(), $execution, $result); что он пишет? Там и должен быть ответ на твою возможность.
     
  7. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    Код (Text):
    1.  
    2. Response Object
    3.  
    4. {
    5.     "intent": "sale",
    6.     "payer": {
    7.         "payment_method": "paypal",
    8.         "payer_info": {
    9.             "shipping_address": {
    10.  
    11.             }
    12.         }
    13.     },
    14.     "redirect_urls": {
    15.         "return_url": "http://test/vendor/paypal/rest-api-sdk-php/sample/payments/ExecutePayment.php?success=true",
    16.         "cancel_url": "http://test/vendor/paypal/rest-api-sdk-php/sample/payments/ExecutePayment.php?success=false"
    17.     },
    18.     "transactions": [
    19.         {
    20.             "amount": {
    21.                 "total": "20.00",
    22.                 "currency": "USD",
    23.                 "details": {
    24.                     "subtotal": "17.50",
    25.                     "tax": "1.30",
    26.                     "shipping": "1.20"
    27.                 }
    28.             },
    29.             "description": "Payment description",
    30.             "invoice_number": "54eaf6cbc0889",
    31.             "item_list": {
    32.                 "items": [
    33.                     {
    34.                         "name": "Ground Coffee 40 oz",
    35.                         "price": "7.50",
    36.                         "currency": "USD",
    37.                         "quantity": "1"
    38.                     },
    39.                     {
    40.                         "name": "Granola bars",
    41.                         "price": "2.00",
    42.                         "currency": "USD",
    43.                         "quantity": "5"
    44.                     }
    45.                 ]
    46.             },
    47.             "related_resources": {
    48.  
    49.             }
    50.         }
    51.     ],
    52.     "id": "PAY-5F461248J7086223KKTVPNTA",
    53.     "create_time": "2015-02-23T09:45:48Z",
    54.     "update_time": "2015-02-23T09:45:48Z",
    55.     "state": "created",
    56.     "links": [
    57.         {
    58.             "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-5F461248J7086223KKTVPNTA",
    59.             "rel": "self",
    60.             "method": "GET"
    61.         },
    62.         {
    63.             "href": "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-8DK66721XG429593M",
    64.             "rel": "approval_url",
    65.             "method": "REDIRECT"
    66.         },
    67.         {
    68.             "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-5F461248J7086223KKTVPNTA/execute",
    69.             "rel": "execute",
    70.             "method": "POST"
    71.         }
    72.     ]
    73. }
    вот что пишет
    из статусов только "state": "created"
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну вот ты сделал create и если клиент согласен, или автоматом делай execute чтобы платёж пошёл в обработку, и потом так же запросишь этот объект чтобы узнать о статусе completed

    Вот по шагам (переключи на PHP):
    https://developer.paypal.com/docs/integration/web/web-checkout/

    Добавлено спустя 5 минут 57 секунд:
    На счёт complete ошибся, там approved используют
     
  9. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    всю грязную работу по созданию токенов, и прочие проверки делает библиотека http://payum.org/
    я только создаю запрос на платеж, и обрабатываю ответ палки
    вот пример кода http://payum.org/doc/0.13/PayumYiiExtension/get-it-started

    Код (Text):
    1.  
    2. class PaypalController extends CController
    3. {
    4.     public function actionPrepare()
    5.     {
    6.         $paymentName = 'paypal_ec';
    7.  
    8.         $payum = $this->getPayum();
    9.  
    10.         $storage = $payum->getRegistry()->getStorage(
    11.             'PaymentDetails',
    12.             $paymentName
    13.         );
    14.  
    15.         $details = $storage->create();
    16.         $details['PAYMENTREQUEST_0_CURRENCYCODE'] = 'USD';
    17.         $details['PAYMENTREQUEST_0_AMT'] = 1.23;
    18.         $storage->update($details);
    19.  
    20.         $captureToken = $payum->getTokenFactory()->createCaptureToken($paymentName, $details, 'paypal/done');
    21.  
    22.         $this->redirect($captureToken->getTargetUrl());
    23.     }
    24.  
    25.     public function actionDone()
    26.     {
    27.         $token = $this->getPayum()->getHttpRequestVerifier()->verify($_REQUEST);
    28.         $payment = $this->getPayum()->getRegistry()->getPayment($token->getPaymentName());
    29.  
    30.         $status = new \Payum\Core\Request\GetHumanStatus($token);
    31.         $payment->execute($status);
    32.  
    33.         echo CHtml::tag('h3', array(), 'Payment status is ' . $status->getValue());
    34.         echo CHtml::tag('pre', array(), json_encode(iterator_to_array($status->getModel()), JSON_PRETTY_PRINT));
    35.         Yii::app()->end();
    36.     }
    37.  
    38.     /**
    39.      * @return \Payum\YiiExtension\PayumComponent
    40.      */
    41.     private function getPayum()
    42.     {
    43.         return Yii::app()->payum;
    44.     }
    45. }
    больше всего смущают статусы ACK и CHECKOUTSTATUS. ACK может быть success но оплата не произведена
    думаю сделать такую проверку
    Код (Text):
    1. if ($model["ACK"] == Api::ACK_SUCCESS ||
    2.             $model["ACK"] == Api::ACK_SUCCESS_WITH_WARNING ||
    3.             $model['CHECKOUTSTATUS'] == Api::CHECKOUTSTATUS_PAYMENT_ACTION_COMPLETED
    4.         ) {
    5.  
    6.             принимает оплату
    7.  
    8.            
    9.  
    10.         } else {
    11.             throw new CHttpException(503, $model["L_LONGMESSAGE0"]);
    12.         }