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, а затем:
- получить токен, который вам дали
- предварительно выполнить второй вызов PayPal, используя метод getexpresscheckoutdetails
- это возвращает всю необходимую информацию
Информация об 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 после подтверждения оплаты.