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

Я использую настройку omnipay здесь: https://github.com/adrianmacneil/omnipay для обработки экспресс-оплаты PayPal.

Процесс работает нормально, так как пользователь перенаправляется на PayPal -> они входят в систему и выбирают оплатить -> они возвращаются на мой сайт, и в этот момент я фиксирую платеж.

Проблема, с которой я столкнулся, заключается в том, что мне нужно указать адрес, который они указали в PayPal, в качестве адреса для выставления счета / доставки.

Чтобы отправить пользователя через PayPal у меня есть следующее:

$gateway = GatewayFactory::create('PayPal_Express');
$gateway->setUsername('XX-USERNAME_XX');
$gateway->setPassword('XX_PASSWORDXX');
$gateway->setSignature('XX_SIG_XX');
$gateway->setTestMode(true);

$response = $gateway->purchase(
    array(
        'cancelUrl'=>'http://www.XXX.co.uk/',
        'returnUrl'=>'http://www.XXX.co.uk/paypalexpress_confirm',
        'amount' =>  $totalamount,
        'currency' => 'GBP'
    )
)->send();

$response->redirect(); 

Когда пользователь возвращается, у меня есть следующее:

$gateway = GatewayFactory::create('PayPal_Express');
$gateway->setUsername('XX-USERNAME_XX');
$gateway->setPassword('XX_PASSWORDXX');
$gateway->setSignature('XX_SIG_XX');
$gateway->setTestMode(true);

$response = $gateway->completePurchase(
    array(
        'cancelUrl'=>'http://www.XXX.co.uk/',
        'returnUrl'=>'http://www.XXX.co.uk/paypalexpress_confirm',
        'amount' =>  $totalamount,
        'currency' => 'GBP'
    )
    )->send();

    echo $responsemsg=$response->getMessage(); 

    echo '<br><br><br>';
    $data = $response->getData(); 
    print_r($data);

Ничто в ответном сообщении или необработанных данных не содержит адрес клиента.

Кто-нибудь получил это работает, как я изо всех сил, и это последний шаг для завершения транзакции.

3 ответа

Решение

Для тех, кто пытается получить эту работу, как сказал Адриан.

Сначала вы делаете обычный платеж PayPal через Omnipay, а затем:

  1. получить токен, который вам дали
  2. предварительно выполнить второй вызов PayPal, используя метод getexpresscheckoutdetails
  3. это возвращает всю необходимую информацию

Информация об API здесь: https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_GetExpressCheckoutDetails

PHP-скрипт PayPal предоставит вам все это:

https://cms.paypal.com/cms_content/ES/es_ES/files/developer/nvp_ECGetExpressCheckout_php.txt

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

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

Если он не возвращается $response->getData() метод, вам может понадобиться позвонить в PayPal GetExpressCheckoutDetails Метод API для получения дополнительной информации о транзакции.

Omnipay не поддерживает это сразу, поэтому вам, вероятно, потребуется скопировать и настроить один из существующих запросов, чтобы выполнить отдельный вызов API после подтверждения оплаты.

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