PayPal Exception PayPalInvalidCredentialException: учетные данные не найдены для пользователя по умолчанию - PullRequest
0 голосов
/ 27 сентября 2018

Я внедрил PayPal (PHP, Laravel), и во время оплаты возникли некоторые проблемы.Я получаю следующее исключение в прямом эфире.

PayPal\Exception\PayPalInvalidCredentialException: Credential not found for default user. Please make sure your configuration/APIContext has credential information in /var/www/project/project-files/vendor/paypal/rest-api-sdk-php/lib/PayPal/Core/PayPalCredentialManager.php

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

Сценарий: Как только пользовательский запрос на оплату, администратор одобряет его, платеж будет обработан.

Для этой цели задание Laravelсоздан и код для следующего задания:

namespace Test\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use PayPal;
use Test\Models\Transaction;

class ProcessPayout implements ShouldQueue
{

use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

/**
 * @var Transaction
 */
protected $transaction;

/**
 * Create a new job instance.
 *
 * @param Transaction $transaction
 */
public function __construct(Transaction $transaction) {
    $this->transaction = $transaction;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle() {
    try {
        \Log::info($this->transaction); // I am getting all the data in this to be processed from Transaction Model

        $response = PayPal::makePayoutEnvironment()
            ->setPayoutEmailSubject($this->transaction->sender_batch_id)
            ->setPayoutItem($this->transaction->receiver, $this->transaction->amount, $this->transaction->sender_item_id)
            ->makePayout();

        if(empty($response)){
            throw new \Exception();
        }

    }catch(\Exception $e){
        \Log::info($e); 
    }
}

}

PayPal.php выглядит следующим образом:

namespace Test\PayPal;

use PayPal\Api\Currency;
use PayPal\Api\Payout;
use PayPal\Api\PayoutItem;
use PayPal\Api\PayoutSenderBatchHeader;
use PayPal\Rest\ApiContext;
use ResultPrinter;

class PayPal
{

/**
 * @var ApiContext
 */
protected $context;

/**
 * @var Payout
 */
protected $payout;

/**
 * @var PayoutSenderBatchHeader
 */
protected $senderHeader;

/**
 * PayPal constructor.
 */
public function __construct()
{
    $this->context = app('PayPalContext');
}

/**
 * Create payout environment.
 */
public function makePayoutEnvironment()
{
    $this->payout = new Payout();
    $this->senderHeader = new PayoutSenderBatchHeader();
    return $this;
}

/**
 * Set payout sender email subject.
 *
 * @param      $senderId
 * @param null $subject
 *
 * @return $this
 */
public function setPayoutEmailSubject($senderId, $subject = null)
{
    $this->senderHeader->setSenderBatchId($senderId)
        ->setEmailSubject($subject ?: config('mail.subject_prefix') . 'Payout accepted.');
    $this->payout->setSenderBatchHeader($this->senderHeader);

    return $this;
}

/**
 * Set the payout item with receiver and amount of.
 *
 * @param $receiverEmail
 * @param $amount
 *
 * @param $itemId
 *
 * @return $this
 */
public function setPayoutItem($receiverEmail, $amount, $itemId)
{
    $item = (new PayoutItem())->setRecipientType('Email')
        ->setNote($this->senderHeader->getEmailSubject())
        ->setReceiver($receiverEmail)
        ->setSenderItemId($itemId)
        ->setAmount(new Currency(sprintf('{
                    "value":"%s",
                    "currency":"%s"
                }', $amount, config('currency.fallback'))));

    $this->payout->addItem($item);

    return $this;
}

/**
 * Make payout for recipient.
 *
 * @return bool|\PayPal\Api\PayoutBatch
 */
public function makePayout()
{
    try {
        $output = $this->payout->create(['sync_mode' => false], $this->context);
    } catch (\Exception $ex) {
        \Log::info($ex);
        return false;
    }

    return $output;
}

}

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

namespace Test\Providers;
use Illuminate\Support\ServiceProvider;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Rest\ApiContext;
use Test\PayPal\PayPal;
class PayPalServiceProvider extends ServiceProvider
{
    public function boot() {

    }
    public function register()
    {
        $this->app->singleton('PayPalContext', function ($app) {

        $config = array('mode' => 'live');

        $apiContext = new ApiContext(
            new OAuthTokenCredential(
                config('services.paypal.client_id'),// ClientID
                config('services.paypal.client_secret')// ClientSecret
            )
        );

        $apiContext->setConfig($config);

        return $apiContext;
    });

    $this->app->singleton('PayPal', function ($app) {
        return new PayPal();
    });
}

/**
 * Get the services provided by the provider.
 *
 * @return array
 */
    public function provides(){
        return [ 'PayPal' ];
    }
}

После некоторой отладки PaypalServiceProvider ничего не возвращал в конструкторе PayPal.php в прямом эфире, не знаю почему.Поэтому, когда я устанавливаю учетные данные и конфигурацию в контексте $ this-> Paypal.php, ошибка Credential не появляется, но теперь я вижу новую ошибку.

Получил Http код ответа 403 при доступе к https://api.paypal.com/v1/payments/payouts

name : AUTHORIZATION_ERROR, debug_id : 6dd18f794dd9, message : Authorization erroroccurred

Я следил это и его проблема с проверкой аккаунта, и я проверил, подтвержден ли мой аккаунти это.Любые другие предложения, чтобы решить эту проблему, пожалуйста.

1 Ответ

0 голосов
/ 27 сентября 2018

Не могли бы вы попробовать с этим?

PayPals PHP REST-API-SDK поставляется с некоторыми отличными образцами.Взгляните на файл bootstrap.php в / vendor / paypal / rest-api-sdk-php / sample / в строке 84. После получения контекста API происходит несколько конфигураций.

$apiContext = new ApiContext(
    new OAuthTokenCredential(
        $clientId,
        $clientSecret
    )
);

// Comment this line out and uncomment the PP_CONFIG_PATH
// 'define' block if you want to use static file
// based configuration

$apiContext->setConfig(
    array(
        'mode' => 'sandbox',
        'log.LogEnabled' => true,
        'log.FileName' => '../PayPal.log',
        'log.LogLevel' => 'DEBUG', // PLEASE USE `INFO` LEVEL FOR LOGGING IN LIVE ENVIRONMENTS
        'cache.enabled' => true,
      implementing \PayPal\Log\PayPalLogFactory
    )
);
...