omnipay paypal express 没有返回地址
Posted
技术标签:
【中文标题】omnipay paypal express 没有返回地址【英文标题】:omnipay paypal express not returning address 【发布时间】:2013-07-07 04:36:30 【问题描述】:我在这里使用全支付设置:https://github.com/adrianmacneil/omnipay 来处理贝宝快速结帐。
这个过程很好,因为用户被重定向到 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);
响应消息或原始数据中没有任何内容包含客户地址。
有没有人在我苦苦挣扎的时候得到这个工作,这是完成交易的最后一步。
【问题讨论】:
【参考方案1】:如果 $response->getData()
方法没有返回,您可能需要调用 PayPal 的 GetExpressCheckoutDetails
API 方法来获取有关交易的额外详细信息。
Omnipay 不支持开箱即用,因此您可能需要复制和自定义其中一个现有请求,以便在确认付款后进行单独的 API 调用。
【讨论】:
嗯,对了 - 你能指出我需要查看哪些文件才能进行此调整的正确方向吗?我很难在 paypal 文件夹中看到可以编辑以包含此内容的任何内容?【参考方案2】:对于那些试图完成这项工作的人来说,就像 Adrian 所说的那样。
您首先进行正常的omnipay paypal付款,然后:
-
获取您获得的令牌
使用调用 getexpresscheckoutdetails 方法对 paypal 进行第二次调用
这会返回您需要的所有信息
此处的 API 信息:https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_GetExpressCheckoutDetails
paypal 提供的 php 脚本为您完成这一切:
https://cms.paypal.com/cms_content/ES/es_ES/files/developer/nvp_ECGetExpressCheckout_php.txt
【讨论】:
【参考方案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();
这不会是最好的。但它有效。 :)
【讨论】:
你为什么使用 ProGateway.php 文件?不应该是ExpressGateway.php吗?以上是关于omnipay paypal express 没有返回地址的主要内容,如果未能解决你的问题,请参考以下文章
Paypal:通过 Express Checkout 定期付款,无需用户拥有 paypal 帐户
具有 Paypal 权限和 Paypal Express Checkout 的 Rails