Braintree dropin UI - маркер доступа необходимо передать в Braintree \ Gateway - PullRequest
0 голосов
/ 12 января 2019

Приложение Symfony 4 с пользовательским интерфейсом Braintree JS

Я создал сервис Braintree для начала тестирования.

namespace App\Services;

use Braintree\ClientToken;


class Braintree
{

    // environment variables:
    const ENVIRONMENT = 'BRAINTREE_ENVIRONMENT';
    const MERCHANT_ID = 'BRAINTREE_MERCHANT_ID';
    const PUBLIC_KEY = 'BRAINTREE_PUBLIC_KEY';
    const PRIVATE_KEY = 'BRAINTREE_PRIVATE_KEY';

    /** @var \Braintree_Gateway */
    private $gateway;

    function __construct() {
        $gateway = new \Braintree_Gateway([
            'environment' => getenv(self::ENVIRONMENT),
            'merchantId' => getenv(self::MERCHANT_ID),
            'publicKey' => getenv(self::PUBLIC_KEY),
            'privateKey' => getenv(self::PRIVATE_KEY)
        ]);
    }

public function generate() {
    return ClientToken::generate();
}

Я получаю следующую ошибку:

HTTP 500 Internal Server Error
Braintree\Configuration::merchantId needs to be set (or accessToken needs to be passed to Braintree\Gateway).

Конфигурация BT была правильно введена в файл .env. Почему он не устанавливает MERCHANT_ID?

Edit:

Добавить конфигурацию

Braintree_Gateway:
    class: Braintree_Gateway
    arguments:
        -
          'environment': '%env(BRAINTREE_ENVIRONMENT)%'
          'merchantId': '%env(BRAINTREE_MERCHANT_ID)%'
          'publicKey': '%env(BRAINTREE_PUBLIC_KEY)%'
          'privateKey': '%env(BRAINTREE_PRIVATE_KEY)%'

Редактировать 2:

Трассировка стека:

Braintree\Exception\
Configuration
in vendor\braintree\braintree_php\lib\Braintree\Configuration.php (line 261)
    public function assertHasAccessTokenOrKeys()    {        if (empty($this->_accessToken)) {            if (empty($this->_merchantId)) {                throw new Exception\Configuration('Braintree\\Configuration::merchantId needs to be set (or accessToken needs to be passed to Braintree\\Gateway).');            } else if (empty($this->_environment)) {                throw new Exception\Configuration('Braintree\\Configuration::environment needs to be set.');            } else if (empty($this->_publicKey)) {                throw new Exception\Configuration('Braintree\\Configuration::publicKey needs to be set.');            } else if (empty($this->_privateKey)) {
Configuration->assertHasAccessTokenOrKeys()
in vendor\braintree\braintree_php\lib\Braintree\ClientTokenGateway.php (line 34)
ClientTokenGateway->__construct(object(Gateway))
in vendor\braintree\braintree_php\lib\Braintree\Gateway.php (line 59)
Gateway->clientToken()
in vendor\braintree\braintree_php\lib\Braintree\ClientToken.php (line 18)
ClientToken::generate()
in src\Services\Braintree.php (line 25)
Braintree->generate()
in src\Controller\ProfileController.php (line 50)
ProfileController->booking_new(object(EntityManager), object(Request), object(Braintree))
in vendor\symfony\http-kernel\HttpKernel.php (line 149)

Редактировать 3:

namespace App\Services;

use Braintree_Gateway;

class Braintree extends Braintree_Gateway
{

    //Configure Braintree Environment
    public function __construct(Braintree_Gateway $gateway)
    {
        $this->$gateway = new Braintree_Gateway([
            'environment' => 'sandbox',
            'merchantId' => 'n5z3tjxh8zd6272k',
            'publicKey' => 'v4rjdzqk3gykw4kv',
            'privateKey' => '4ab8b962e81ee8c43bf6fa837cecfb97'
        ]);
    }

    //Generate a client token
    public function generate() {
        return $clientToken = $this->clientToken()->generate();
    }

}

Ошибка сейчас:

Catchable Fatal Error: Object of class Braintree\Gateway could not be converted to string

Я становлюсь ближе к генерации токена клиента?

1 Ответ

0 голосов
/ 12 января 2019

Файл .env фактически не заполняет системную среду. Вместо этого он работает как запасной вариант, когда среда не установлена. Ваш звонок на getenv() учитывает только системную среду. Чтобы ваш файл вступил в силу, вы должны использовать контейнер Service.

#config/services.yaml
services:
    _defaults:
        autowire: true
        autoconfigure: true

    #... all the existing services

    Braintree_Gateway:
        class: Braintree_Gateway
        arguments:
            -
              'environment': '%env(BRAINTREE_ENVIRONMENT)%'
              'merchantId': '%env(BRAINTREE_MERCHANT_ID)%'
              'publicKey': '%env(BRAINTREE_PUBLIC_KEY)%'
              'privateKey': '%env(BRAINTREE_PRIVATE_KEY)%'

Специальный параметр %env()% сначала проверит вашу системную среду на наличие переменной, и если она не установлена, он будет проходить через файлы .env, чтобы увидеть, определен ли запасной вариант. Вы также можете прочитать об этом в документации: https://symfony.com/doc/current/configuration/external_parameters.html#environment-variables

Это даст сервис Braintree_Gateway, который вы построили вручную внутри своего сервиса. Как и в случае с любым другим сервисом, вы можете вместо этого внедрить его в свой сервис, и автоматическое подключение пройдет через уже созданный шлюз Braintree:

namespace App\Services;

use Braintree\ClientToken;

class Braintree
{
    private $gateway;

    public function __construct(\Braintree_Gateway $gateway)
    {
        $this->gateway = $gateway;
    }

    # ... methods using the gateway
}
...