【问题标题】:Paypal NVP API - Keep getting error 81002Paypal NVP API - 不断收到错误 81002
【发布时间】:2011-02-15 01:15:39
【问题描述】:

我是 PayPal API 的新手,在 PHP 中使用 CURL 调用 SetExpressCheckout 时遇到问题。 就我而言,我已经正确设置了所有内容,但我一直收到 81002 错误“不支持指定的方法”。

代码 sn-p 如下。我从here 获得了 CA Root 证书文件。

<?php

$paypal_data = array(
    'USER' => urlencode('andree_1272823561_biz_api1.gmail.com'),
    'PWD' => urlencode('1272823576'),
    'SIGNATURE' => urlencode('Am1t0wiu2tv7VwZ5ebdeY9zv1GF6Ad0PFz-qTGFFf7vbWU6ee4bxy8KL'),
    'VERSION' => urlencode('52.0'),
    'PAYMENTACTION' => urlencode('Sale'),
    'METHOD' => urlencode('SetExpressCheckout'),
    'AMT' => urlencode('52.00'),
    'RETURNURL' => urlencode('get_express_checkout_details.php'),
    'CANCELURL' => urlencode('index.php')
);

$url = 'https://api-3t.sandbox.paypal.com/nvp?' . http_build_query($paypal_data);
$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');

$result = curl_exec($curl);
curl_close($curl);
parse_str($result, $result);
?>

<pre>Data sent: <?php print_r($paypal_data); ?></pre>
<pre>Result: <?php print_r($result); ?></pre>

当我运行代码时,输​​出如下:

Data sent: Array
(
    [USER] => andree_1272823561_biz_api1.gmail.com
    [PWD] => 1272823576
    [SIGNATURE] => Am1t0wiu2tv7VwZ5ebdeY9zv1GF6Ad0PFz-qTGFFf7vbWU6ee4bxy8KL
    [VERSION] => 52.0
    [PAYMENTACTION] => Sale
    [METHOD] => SetExpressCheckout
    [AMT] => 52.00
    [RETURNURL] => get_express_checkout_details.php
    [CANCELURL] => index.php
)

Result: Array
(
    [ACK] => Failure
    [L_ERRORCODE0] => 81002
    [L_SHORTMESSAGE0] => Unspecified Method
    [L_LONGMESSAGE0] => Method Specified is not Supported
    [L_SEVERITYCODE0] => Error
)

有人知道可能是什么问题吗?

问候,安德烈。

【问题讨论】:

  • 它对我来说运行良好,唯一的区别。是我没有使用证书选项,并添加了这两个选项 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  • 嗯 .. 很奇怪。我已经用您建议的两行更改了 CAINFO 选项,但仍然收到相同的错误消息。

标签: php paypal


【解决方案1】:

问题在于当您使用 urlencode + http_build_query 时。您最终会得到双重编码,而 PayPal 将拒绝某些信息。

【讨论】:

  • 刚才我自己的代码也遇到了同样的问题。我发现我正在对请求进行“双重编码”,并将&amp; 名称-值对分隔符转换为%26,因此出现“未指定方法”错误。 [这很糟糕,而且非常令人困惑,错误包括“长消息”“不支持指定的方法”,因为这与“短消息”直接矛盾!我想我被告知 SetExpressCheckout 方法不受支持!]
  • 我遇到了类似的问题,因为我使用的是 ';'作为分隔符。 Paypal 仅支持 '&'。
【解决方案2】:

我遇到了这个问题,最后发现这是获取 传输的所有参数。我正在使用以下类型的代码来传递 参数(如网上各种 PayPal 示例所示):

   http.set_form_data({"q" => "ruby", "lang" => "en"}, ';')

当我将其更改为:

   http.form_data = {"q" => "ruby", "lang" => "en"}

它停止给我未知方法错误(并转移到其他错误:-)

下面的 Ruby 代码对我有用(尽管我已经删除了返回 URL)。 用户名等是标准沙盒。

# http://www.ensta-paristech.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html
# https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ECGettingStarted

require 'net/https'
require 'uri'

uri = URI('https://api-3t.sandbox.paypal.com/nvp')

request_object = Net::HTTP::Post.new(uri.path)

request_object.form_data = {
'USER'=>'sdk-three_api1.sdk.com', # Sandbox value. See e_howto_api_ECGettingStarted
'PWD'=>'QFZCWN5HZM8VBG7Q',  # Sandbox value. See e_howto_api_ECGettingStarted
'SIGNATURE'=>'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU',  # Sandbox value. See e_howto_api_ECGettingStarted
'METHOD'=>'SetExpressCheckout',
'VERSION'=>'88.0',
'PAYMENTREQUEST_0_PAYMENTACTION'=>'Sale',
'PAYMENTREQUEST_0_AMT'=>'23.00',  # Must have exactly two decimals for cents. See e_howto_api_ECGettingStarted above.
'PAYMENTREQUEST_0_CURRENCYCODE'=>'USD',
'cancelUrl'=>'http://www.add your own URL here',
'returnUrl'=>'http://www.add your own URL here'
}

http = Net::HTTP.new(uri.host,uri.port)
# HACK: The following two lines turn off secure certificate checking!!
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
response = http.request(request_object)

【讨论】:

    【解决方案3】:

    我没有使用 PHP API,但我在使用回调 API (java) 时遇到了相同的 81002 错误,当某些参数丢失或格式错误时我得到了这个错误。

    我不知道您是否解决了问题,但我的建议是检查 SetExpressCheckout (API Reference) 的需要参数。如果您设置了这些,请检查是否满足参数描述的 limitations 部分。

    遗憾的是,它们有时会抛出不适当的错误(或开发人员无法完全理解的错误)。另一方面,我通常会在他们的论坛上得到大部分回复。如果遇到“麻烦”,您还可以给轮班的贝宝团队成员(或已经解决您问题的人)写一条私人消息。

    希望有所帮助!
    暴君

    【讨论】:

    • 呃; API 参考文档不是很好。例如,对于SetExpressCheckout 操作,显然参数AMT 已被“弃用”,但不知何故它也是“必需的”!这似乎不是真正需要的,因为我能够在不包含该参数的情况下成功请求该操作。
    【解决方案4】:

    所有人都存在重大问题。只需将所有参数传递给正文键

    例子

    wp_remote_post("https://api-3t.sandbox.paypal.com/nvp",
                    array(
                        'timeout'   => 60,
                        'sslverify' => FALSE,
                        'httpversion' => '1.1',
                        'body' => "METHOD=SetExpressCheckout&VERSION=72.0&PWD="" &USER=''&SIGNATURE=''&RETURNURL=''&CANCELURL=''&PAYMENTREQUEST_0_PAYMENTACTION=Sale&PAYMENTREQUEST_0_AMT=10&PAYMENTREQUEST_0_CURRENCYCODE=USD&PAYMENTREQUEST_0_DESC=test EC payment"
    )
    

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 2014-11-10
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2016-07-10
      • 2014-11-11
      相关资源
      最近更新 更多