PayPal Express Checkout始终显示用户"此交易已过期".页面,但没有API错误

Hug*_*葛修远 10 php redirect curl paypal

我正在尝试使用PayPal的Express Checkout设置简单的付款顺序.我的SetExpressCheckout调用似乎工作正常,我得到ACK=Success了一个令牌.但是,当我使用该令牌将用户重定向到PayPal时,它总是向他们显示一个屏幕,说:

此交易已过期.请返回收件人的网站,使用他们的常规结帐流程完成您的交易.

您的会话已结束

很抱歉,您的会话已经结束.您的帐户尚未收费.请返回商家网站,再次使用PayPal结账.

为了澄清,我没有从SetExpressCheckout API调用中获取任何错误代码,但令牌似乎总是过期.我已经尝试重定向到无意义的令牌,但这会生成一个不同的页面.看来我正在接收一个有效的令牌并正确地重定向到它,但它总是在1-2秒内到期.

示例请求的详细信息:

我在初始的SetExpressCheckout请求中发送的内容:

Array
(
    [PAYMENTACTION] => Sale
    [useraction] => commit
    [RETURNURL] => xxxx
    [CANCELURL] => xxxxx
    [PAYMENTREQUEST_0_AMT] => 49.00
    [PAYMENTREQUEST_0_SHIPPINGAMT] => 0
    [PAYMENTREQUEST_0_CURRENCYCODE] => USD
    [PAYMENTREQUEST_0_ITEMAMT] => 49.00
    [L_PAYMENTREQUEST_0_NAME0] => xxxxx
    [L_PAYMENTREQUEST_0_DESC0] => xxxxx
    [L_PAYMENTREQUEST_0_NUMBER0] => xxxxx
    [L_PAYMENTREQUEST_0_AMT0] => 49
    [L_PAYMENTREQUEST_0_QTY0] => 1
    [METHOD] => SetExpressCheckout
    [VERSION] => 74.0
    [USER] => xxxxx
    [PWD] => xxxxx
    [SIGNATURE] => xxxxx
)
Run Code Online (Sandbox Code Playgroud)

关于请求的Curl_getinfo:

Array
(
    [url] => https://api-3t.sandbox.paypal.com/nvp
    [content_type] => text/plain; charset=utf-8
    [http_code] => 200
    [header_size] => 255
    [request_size] => 798
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 1.139
    [namelookup_time] => 0
    [connect_time] => 0.187
    [pretransfer_time] => 0.64
    [size_upload] => 660
    [size_download] => 136
    [speed_download] => 119
    [speed_upload] => 579
    [download_content_length] => 136
    [upload_content_length] => 660
    [starttransfer_time] => 1.139
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [primary_ip] => 23.4.59.42
    [primary_port] => 443
    [local_ip] => 192.168.0.102
    [local_port] => 63049
    [redirect_url] => 
)
Run Code Online (Sandbox Code Playgroud)

我通过curl从PayPal得到的回复:

Array
(
    [TOKEN] => EC-59031295261754641
    [TIMESTAMP] => 2014-01-20T10:12:27Z
    [CORRELATIONID] => 84d3d68cbd574
    [ACK] => Success
    [VERSION] => 74.0
    [BUILD] => 9285531
)
Run Code Online (Sandbox Code Playgroud)

然后,我将用户重定向到该令牌的相关URL(使用令牌urlencoded),在这种情况下:

https://www.paypal.com/webscr?cmd=_express-checkout&useraction=commit&token=EC-59031295261754641
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎都很好,但是当我重定向到该URL时,它总是显示"事务已过期屏幕".

谁能指出我做错了什么?

Hug*_*葛修远 32

问题是它处于沙箱模式,应该进行重定向

https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&useraction=commit&token=

而不是上面显示的URL.

这在Express Checkout集成指南的第36页上显示.