5

我在这里使用omnipay 设置:https ://github.com/adrianmacneil/omnipay来处理贝宝快速结帐。

该过程很好,因为用户被重定向到贝宝->他们登录并选择支付->他们返回到我的网站,此时我捕获了付款。

我遇到的问题是我需要将他们输入贝宝的地址作为他们的账单/送货地址。

要将用户发送到贝宝,我有以下内容:

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

响应消息或原始数据中没有任何内容包含客户地址。

有没有人在我苦苦挣扎的时候得到了这个工作,这是完成交易的最后一步。

4

3 回答 3

3

对于那些试图获得这项工作的人来说,就像 Adrian 所说的那样。

您首先进行正常的omnipay paypal付款,然后:

  1. 得到你得到的令牌
  2. 使用 call getexpresscheckoutdetails 方法对 paypal 进行第二次调用
  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

于 2013-07-19T10:58:20.807 回答
1

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

这不会是最好的。但它有效。:)

于 2014-06-17T02:09:23.373 回答
0

如果该$response->getData()方法没有返回,您可能需要调用 PayPal 的GetExpressCheckoutDetailsAPI 方法来获取有关交易的额外详细信息。

Omnipay 不支持开箱即用,因此您可能需要复制和自定义现有请求之一,以便在确认付款后进行单独的 API 调用。

于 2013-07-10T11:20:49.070 回答