Как вызвать GetExpressCheckoutDetails из Omnipay/PayPal?

Мне нужно принимать платежи PayPal Express из приложения Laravel-4, поэтому я пытаюсь решить, является ли Omnipay лучшим решением. Камнем преткновения является то, что он не реализует GetExpressCheckoutDetails, поэтому контактные данные покупателя недоступны. Я видел эти обсуждения проблемы:

omnipay paypal express не возвращает адрес

получить дополнительные данные ответа в codeigniter библиотеки ci-merchant

Однако ни один из них не дает окончательного решения. Если я использую Omnipay, нужно ли мне также устанавливать классический API PayPal (в таком случае, зачем возиться с Omnipay), или я могу внедрить GetExpressCheckoutDetails в Omnipay, и если да, то как?

Заранее спасибо за любую помощь в этом.


person Keith M    schedule 02.06.2014    source источник


Ответы (3)


omnipay\paypal\ProGateway.php добавить новую функцию

public function fetchExpressCheckoutDetail(array $parameters = array())
{
    return $this->createRequest('\Omnipay\PayPal\Message\FetchExpressCheckoutRequest', $parameters);
}

omnipay\paypal\src\Message добавить новый файл FetchExpressCheckoutRequest.php

namespace Omnipay\PayPal\Message;
class FetchExpressCheckoutRequest extends AbstractRequest
{
    public function getData()
    {
        $data = $this->getBaseData('GetExpressCheckoutDetails');

        $this->validate('transactionReference');
        $data['TOKEN'] = $this->getTransactionReference();
        $url = $this->getEndpoint()."?USER={$data['USER']}&PWD={$data['PWD']}&SIGNATURE={$data['SIGNATURE']}&METHOD=GetExpressCheckoutDetails&VERSION={$data['VERSION']}&TOKEN={$data['TOKEN']}";
        parse_str (file_get_contents( $url ),$output);
        $data = array_merge($data,$output);
        return $data;
    }
}

Применение:

$response = $gateway->completePurchase($params)->send();
$data = $response->getData();
$gateway->fetchExpressCheckoutDetail(array('transactionReference'=>$data['TOKEN']))->getData();

Это будет не самое лучшее. Но это работает. :)

person kei.    schedule 16.06.2014
comment
tomsowerby реализовал другое решение в запросе на вытягивание по этой ссылке. Это работает, и я надеюсь, что это будет объединено. - person Keith M; 17.06.2014

Omnipay не поддерживает GetExpressCheckoutDetails (пока). Для этого в настоящее время открыт запрос на вытягивание.

Однако он реализует GetTransactionDetails, которые могут оказаться полезными, так как это может вернуть большую часть информации о существующей транзакции.

person Adrian Macneil    schedule 03.06.2014
comment
Запрос на вытягивание был тихим в течение нескольких месяцев. Есть идеи, что такое задержка? Я попытался вызвать GetTransactionDetails через completePurchase, но он не возвращает контактные данные покупателя. - person Keith M; 04.06.2014
comment
Просто это большой запрос на вытягивание, и я был очень занят, поэтому у меня не было времени сделать работу самостоятельно. Если бы он был разбит на отдельные PR для GetExpressCheckoutDetails, а API улучшился в соответствии с комментариями в этой ветке, его было бы довольно легко объединить. - person Adrian Macneil; 04.06.2014

На основе кей. ответ Предлагаю следующее дополнение к заявке:

  1. Создать новый путь app/omnipay/paypal/Message/
  2. Создать новый файл app/omnipay/paypal/ExtendedExpressGateway.php

    namespace App\Omnipay\PayPal;
    
    use Omnipay\PayPal\ExpressGateway;
    
    /**
     * PayPal Express extended Class
     */
    class ExtendedExpressGateway extends ExpressGateway
    {
        public function getName()
        {
            return 'PayPal Express extended';
        }
    
        public function fetchExpressCheckoutDetail(array $parameters = array())
        {
            return $this->createRequest('\\App\\Omnipay\\PayPal\\Message\\FetchExpressCheckoutRequest', $parameters);
        }
    }
    
  3. Создать новый файл app/omnipay/paypal/Message/FetchExpressCheckoutRequest.php

    namespace App\Omnipay\PayPal\Message;
    
    use Omnipay\PayPal\Message\AbstractRequest;
    
    class FetchExpressCheckoutRequest extends AbstractRequest
    {
        public function getData()
        {
            $data = $this->getBaseData('GetExpressCheckoutDetails');
    
            $this->validate('transactionReference');
    
            $data['TOKEN'] = $this->getTransactionReference();
            $url = $this->getEndpoint() . "?USER={$data['USER']}&PWD={$data['PWD']}&SIGNATURE={$data['SIGNATURE']}&METHOD=GetExpressCheckoutDetails&VERSION={$data['VERSION']}&TOKEN={$data['TOKEN']}";
            parse_str(file_get_contents($url), $output);
            $data = array_merge($data, $output);
    
            return $data;
        }
    }
    
  4. Добавить в psr-4 autoload в composer.json

    "autoload": {
        "classmap": [
            ...
        ],
        "psr-4": {
            "App\\Omnipay\\PayPal\\": "app/omnipay/paypal/"
        }
    },
    
  5. бегать:

    php artisan dump-autoload
    
  6. Теперь в app/config/packages/ignited/laravel-omnipay/config.php можно написать:

    'driver' => '\\App\\Omnipay\\PayPal\\ExtendedExpressGateway',
    

Теперь при обновлении проблем не будет

person Anatoli    schedule 22.09.2014
comment
Предупреждение. После выполнения этих шагов и использования $gateway = new App\Omnipay\PayPal\ExtendedExpressGateway(); вместо Omnipay::create('PayPal_Express'); Я обнаружил, что функция ExtendedExpressGateway::fetchExpressCheckoutDetail() возвращает ту же информацию, что и встроенная в Omnipay функция $data = $gateway-›fetchCheckout($params)-›send()-›getData();». так что, наверное, не стоит заморачиваться. В любом случае, если у вас возникли проблемы с автозагрузчиком psr-4, который не находит ExtendedExpressGateway, не забудьте поставить ‹?php в начале файлов php! - person Zack Morris; 17.02.2015
comment
Спасибо @ZackMorris, это очень помогло мне и в идеале должно быть принятым лучшим ответом, пожалуйста, напишите полный ответ, чтобы я мог проголосовать за него. Преимущество использования этого метода заключается в том, что если payer_id или transaction_id не были сохранены, у вас есть только идентификатор ссылки на транзакцию, это единственный способ получить эти данные программно. - person TeeHays; 10.05.2018