如何使用PayPal REST API解决400错误请求?

5

我正在使用PayPal Payments Pro Rest API进行信用卡支付测试。

但是我一直遇到以下错误:

Exception in HttpConnection Execute: Invalid HTTP response The remote server returned an error: (400) Bad Request. ---> 

我创建并激活了我的PayPal测试账户,具体步骤如下:

Credit card
Credit card number:
ccnumber here
Credit card type:
Visa
Expiration date:
3/2019

当我在付款表单中输入上述信息并提交时,我一直收到400错误的请求。
我之前用PayPal joe shopper账户使其工作过,但是丢失了测试信用卡号码。
我可以100%确定我已经使用oauth2凭据进行了身份验证。
这个错误的可能原因是什么?
我输入了一个随机的支付人名字和姓氏。
这个名字必须存在吗?
这个错误的原因可能是什么?
10个回答

16
如果数据出现问题,PayPal API 将返回一个 400 - Bad request 错误。当我遇到这个错误(使用 PHP SDK),我捕获了异常并通过 $ex->getData() 返回了一个 JSON 对象,其中包含有关错误请求的详细信息,例如在我的情况下,货币代码是错误的。
    try {
        $payment->create($apiContext);
    } catch (PayPal\Exception\PPConnectionException $ex) {
        var_dump(json_decode($ex->getData()));
        exit(1);
    }

3
这非常有用! - dave
是的,非常有用。 - Murwa
这非常有用。如果你像我一样使用expressJs,你可以通过error.data来获取它。 - undefined

3

像其他人所说,导致(HTTP 400 - 错误请求)的原因有几个。

在我的情况下,是由于使用相同的发票号码。为了进行临时测试,我只使用了生成的购物车ID和guid。您也可以使用随机数生成器。最终,您需要根据客户规格生成发票号码。

-祝好运


1
我正在测试PayPal,为了让它工作,我硬编码了一个发票号码。它确实起作用了。一次而已。哈哈哈哈,我白费了这么多时间,我爱编程。 - Alexandre

1
首先找出您的错误是什么。
payment = PayPal::SDK::REST::DataTypes::Payment.new(...)
payment.create 
# got Response[400]: Bad Request here
payment.error
# got {"name"=>"VALIDATION_ERROR", "details"=>[{"field"=>"transactions", "issue"=>"

然后找出你的问题,以获取更多信息。

https://developer.paypal.com/webapps/developer/docs/api/#validation-issues


1
我遇到了同样的问题(HTTP 400 - 请求出错)。原因是REST API请求中存在“错误”。在我的情况下,有两个原因:
  • 我把金额详情传递给了一个Amount对象,但是小计、运费和税费的总和不等于总金额。
  • 我传递了带有小数的货币值,但只传递了不足两位小数而是只有一位。显然,REST API有点挑剔,只接受没有或者有两位小数。
  • 我在Transaction对象中传递了一个item_list,但是Item对象中的价格总和并不等于金额详情中给定的小计。

我不知道如何找到错误的实际原因(如果有的话)。

在您的情况下,可能是您添加的付款人名称。试着不要添加。

编辑:

我刚才尝试了一下:确实是付款人信息的问题。我传递了一个带有名字和姓氏的payer_info,得到了HTTP 400的错误(没有这些信息是正常的)。我认为payer_info不能由我们设置,而是由PayPal在返回Payment对象时设置。

Payer payer = new Payer { payment_method = "paypal", payer_info = new PayerInfo {
   first_name = "Zaphod", last_name = "Beeblebrox"}  }; // => HTTP 400 - Bad Request

0

我曾经遇到过同样的问题。在我的情况下,是由于信用卡使用过度导致的问题。因此,我从这个网站测试信用卡获取了一个新的信用卡号码,并将其替换为旧的信用卡号码。 以下是我使用的信用卡信息

 credit_card = new CreditCard()
                        {
                            billing_address = new Address()
                            {
                                city = "Johnstown",
                                country_code = "US",
                                line1 = "52 N Main ST",
                                postal_code = "43210",
                                state = "OH"
                            },
                            cvv2 = "874",
                            expire_month = 11,
                            expire_year = 2018,
                            first_name = "Joe",
                            last_name = "Shopper",
                            number = "4024007185826731", //New Credit card Number, Only Card type should match other details does not matter
                            type = "visa"
                        }

注意:PayPal网站中提到的所有信用卡都无法使用,对我来说也是同样的问题。如果它对您有效,则很好,否则请使用新的测试信用卡号码。希望这能帮助到某些人。
谢谢!享受编程吧!

0

了解您的错误 PayPal会针对每个异常(除了500 INTERNAL_SERVER_ERROR)返回详细数据,解释您所看到的确切错误是什么。您可以按照以下方式检索:

更新您的异常处理程序以捕获PayPalConnectionException并打印$ex->getData(),如下所示:

try {
    $payment->create($apiContext);
} catch (PayPal\Exception\PayPalConnectionException $ex) {
    echo $ex->getCode(); // Prints the Error Code
    echo $ex->getData(); // Prints the detailed error message 
    die($ex);
} catch (Exception $ex) {
    die($ex);
}

0

这是由于您提供的货币或金额不正确导致的。 我在React JS中遇到了这个问题。

我正在createOrder方法中执行此操作。

purchase_units: [{
                amount: {
                    currency_code: 'PHP',
                    value: totalAmount
                }
            }],

这就是问题所在。如果我提供的货币不是美元,我会收到400错误。因此,我从这里删除了currency_code

然后,我将货币声明移动到我的组件声明中。 像这样。

 options={{
            clientId: " Your_ID " ,
            currency: "PHP"
          }}

在这里,您可以选择任何您想要的货币。这解决了我的400错误问题。


0
我最近也遇到了400错误请求。在我的情况下,我正在使用RefundRequest进行退款处理,而PayPal最近更改了“原因”字段的约束条件(尽管我找不到文档),因此不再接受我返回的详细说明。我之所以发现错误,是因为我看到了另一个字段,PayPal现在要求该字段只包含单字节字母数字字符。实际上有帮助的是,将我发送的数据缩短为简单的“退货商品”。
显然,这是一个旧线程,我相信原始问题早已解决,但如果使用上面提到的方法无法确定更多关于错误的信息,我建议仅提交最少量的信息请求,直到您可以使其通过。然后,开始添加额外的字段/信息,以查看是否可以确定哪个字段包含导致错误请求的信息。至少对于我的问题,这种做法有效。

0

如果您在使用Paypal沙盒测试驱动程序时,第一次尝试使用有缺陷的代码,它会向客户端显示400错误请求。

原因:Paypal发送了JWT授权并将其存储在客户端的本地存储中。

建议:尝试清除客户端的本地存储缓存(您只需要清除Paypal令牌)。

这对我很有效,希望对您也有用 :)


0

我也遇到了这个问题,可能有许多其他可能导致失败的根本原因,但在我的情况下,所有传递的参数都是正确的,但在沙盒环境中失败了,我只是将付款选项从PayPal余额更改为Visa,然后它开始工作。

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接