Как позвонить в GetExpressCheckoutDetails из Omnipay/PayPal?

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

omnipay PayPal Express не возвращая адрес

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

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

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

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();

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

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

  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-4autoload в 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',
    

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

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

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

Другие вопросы по тегам