Omnipay, PayPal REST с laravel 5

Ответ, который я продолжаю получать на dd($finalResponse);:

RestResponse {#298 ▼
  #statusCode: 400
  #request: RestCompletePurchaseRequest {#300 ▶}
  #data: array:4 [▼
    "name" => "PAYMENT_NOT_APPROVED_FOR_EXECUTION"
    "message" => "Payer has not approved payment"
    "information_link" => "https://developer.paypal.com/webapps/developer/docs/api/#PAYMENT_NOT_APPROVED_FOR_EXECUTION"
    "debug_id" => "5471589613718"
  ]
}

Вот код.

$gateway = Omnipay::create('PayPal_Rest');

    // Initialise the gateway
    $gateway->initialize(array(
       'clientId' => env('PAYMENT_SANDBOX_PAYPAL_CLIENTID'),
       'secret'   => env('PAYMENT_SANDBOX_PAYPAL_SECRET'),
       'testMode' => true, // Or false when you are ready for live transactions
    ));

    // Do an authorisation transaction on the gateway
    $transaction = $gateway->authorize(array(
        'returnUrl'=> env('PAYMENT_SANDBOX_PAYPAL_URL'),
        'cancelUrl' => 'http://localhost:8000/cancel',
       'amount'        => '10.00',
       'currency'      => 'AUD',
       'description'   => 'This is a test authorize transaction.',
       // 'card'          => $card,
    ));

    $response = $transaction->send();
    if ($response->isSuccessful()) {
       // Find the authorization ID
       $authResponse = $response->getTransactionReference();
       echo "Authorize transaction was successful!\n".$authResponse;
    }else{
        echo "Failed to auth transaction";
        dd($response);
    }

    // Once the transaction has been approved, we need to complete it.
    $transaction = $gateway->completePurchase(array(
        'payerId'             => $request->PayerID,
        'transactionReference' => $authResponse            
    ));

    $finalResponse = $transaction->send();

    dd($finalResponse);

    if ($finalResponse->getData()) {
       echo "Transaction was successful!\n";
       // Find the authorization ID
       $results = $finalResponse->getTransactionReference();
        dd($results);
    }else{
        dd($finalResponse->getData());
    }

После входа в систему в качестве плательщика и совершения покупки, что еще плательщику нужно подтвердить и как?


person Harry Bosh    schedule 27.10.2015    source источник


Ответы (1)


Нет, вы неправильно понимаете процесс оплаты PayPal. Вот правильный поток:

  1. Вы выполняете вызов Omnipay::create(), $gateway->initialize() и $gateway->authorize() точно так же, как и выше. Однако для returnUrl вы должны указать URL-адрес на своем сайте, как и для cancelUrl. Возможно, вы имеете в виду использовать http://localhost:8000/return (хотя лучше было бы иметь идентификатор транзакции или что-то еще в URL возврата ).

  2. Ответ от $gateway->authorize() будет иметь тип RedirectResponse. Вы можете проверить это:

// Делаем транзакцию авторизации на шлюзе

$transaction = $gateway->authorize(array(
    'returnUrl'=> env('PAYMENT_SANDBOX_PAYPAL_URL'),
    'cancelUrl' => 'http://localhost:8000/cancel',
    'amount'        => '10.00',
    'currency'      => 'AUD',
    'description'   => 'This is a test authorize transaction.',
    // 'card'          => $card,
));

$response = $transaction->send();
if ($response->isRedirect()) {
    // Yes it's a redirect.  Redirect the customer to this URL:
    $redirectUrl = $response->getRedirectUrl();
}

На этом первоначальное рукопожатие с клиентом закончено. Теперь вы перенаправили клиента на веб-сайт PayPal, где он авторизует транзакцию, войдя в систему со своим адресом электронной почты и паролем учетной записи PayPal, проверив счет, нажав кнопку, которая говорит, что они согласны платить.

Следующее, что происходит, это то, что клиент перенаправляется PayPal обратно на ваш веб-сайт по адресу redirectUrl, который вы указали в вызове authorize(). Это перейдет в другое место в вашем коде. В этот момент вы вызываете completeAuthorize, точно так же, как в коде ранее:

// Once the transaction has been approved, we need to complete it.
$transaction = $gateway->completePurchase(array(
    'payerId'             => $request->PayerID,
    'transactionReference' => $authResponse            
));

$finalResponse = $transaction->send();

dd($finalResponse);

if ($finalResponse->getData()) {
   echo "Transaction was successful!\n";
   // Find the authorization ID
   $results = $finalResponse->getTransactionReference();
    dd($results);
}else{
    dd($finalResponse->getData());
}

Обратите внимание, что вам необходимо сохранить идентификатор плательщика и транзакциюReference из вызова авторизации и иметь возможность восстановить их в коде returnUrl.

Вам также необходимо иметь возможность обрабатывать случай cancelUrl, когда клиент решил не соглашаться на оплату через PayPal и вместо этого возвращается на URL-адрес cancelUrl на вашем веб-сайте.

Наконец, вам нужно иметь возможность обрабатывать случайные случаи, когда клиент завершает платеж на веб-сайте PayPal, но не возвращается на ваш returnUrl. Это может быть из-за проблемы с сетью, сбоя браузера или из-за того, что клиент закрыл свой браузер между нажатием «Согласен на оплату» в PayPal и возвращением на ваш сайт. Лучший способ справиться с этим — использовать вызовы omnipay-paypal fetchPurchase() или listPurchase().

person delatbabel    schedule 27.10.2015
comment
Спасибо за ваше подробное объяснение, по крайней мере, теперь есть информация для других. Это, однако, не то, чего я желаю своему врагу, не говоря уже о моих клиентах. Существует решение, которое я использовал ранее, которое пропускало процесс утверждения. Я опубликую здесь, когда он будет завершен для других, которые могут быть заинтересованы. - person Harry Bosh; 27.10.2015
comment
Гарри, я хочу обновить документацию по модулю omnipay-paypal, чтобы внести ясность в то, что должно происходить для перенаправления платежей. Хотя платежи с перенаправлением обычно обрабатываются Omnipay, PayPal, по-видимому, является наиболее часто используемым шлюзом, требующим перенаправления. Другие, такие как VTPayments (для платежей UnionPay и AliPay China), также требуют перенаправления, как и выше, но используются реже. В любом случае, я отправлю несколько PR Кайле, и они пройдут обычный процесс проверки и утверждения. - person delatbabel; 28.10.2015
comment
Вот почему я перехожу на PayPal_Express, процесс PayPal_Rest, на мой взгляд, имеет собственную проблему UX, вызванную PayPal. - person Harry Bosh; 28.10.2015