Ruby PayPal Webhook URL中的HTTP基本身份验证

Ruby PayPal Webhook URL中的HTTP基本身份验证,ruby,paypal,paypal-rest-sdk,basic-authentication,Ruby,Paypal,Paypal Rest Sdk,Basic Authentication,(补充:对于这个问题,假设PayPal API上的操作正在运行并经过验证。) PayPal webhook是否支持带有HTTP基本身份验证凭据的URL,因此下面将创建一个使用给定凭据的有效webhookfoo:secret webhook_attrs = { # NOTE the URL has HTTP Basic credentials of # user is 'foo' and password is 'secret': url: 'https://foo:secret@ex

(补充:对于这个问题,假设PayPal API上的操作正在运行并经过验证。)

PayPal webhook是否支持带有HTTP基本身份验证凭据的URL,因此下面将创建一个使用给定凭据的有效webhook
foo:secret

webhook_attrs = {
  # NOTE the URL has HTTP Basic credentials of
  # user is 'foo' and password is 'secret':
  url: 'https://foo:secret@example.com/paypal_events',
  event_types: [
      { name: 'PAYMENT.AUTHORIZATION.CREATED' },
      { name: 'PAYMENT.AUTHORIZATION.VOIDED' }
  ]
}
webhook = PayPal::SDK::REST::Webhook.new(webhook_attrs)
if webhook.create && webhook.error.nil?
  p "Created webhook:", webhook
else
  p "Failed to create webhook:", webhook.error, webhook
end

PayPal Webhook不支持HTTP基本身份验证(在撰写本文时)

尝试使用包含HTTP基本凭据的URL创建Webhook将失败,并出现以下错误:

{
  "name" => "VALIDATION_ERROR",
  "details" => [ { "field" => "url", "issue" => "Not a valid webhook URL" } ], 
  "message" => "Invalid data provided",
  "information_link" => "https://developer.paypal.com/docs/api/webhooks/#errors"
}
对于希望这样做的开发人员,有几点建议:

  • 请PayPal支持此功能(可能值得一提的是,Stripe Webhook支持HTTP基本身份验证)
  • 作为一种解决方案,考虑在URL查询字符串中包含一个长的、随机的秘密令牌,而不是作为身份验证检查。为使其值得,URL必须是HTTPS。注意检查令牌的代码中的定时和长度攻击,简单的
    ==
    相等性检查容易受到定时攻击。有关计时和长度攻击的更多信息,请参阅
    我们知道PayPal Webhook不支持HTTP基本身份验证, 但对于这类问题,我们有一个解决方案。 我们需要一个实时服务器[没有HTTP基本身份验证],这样我们就可以在PHP文件上设置paypal应用程序中的webhook URL

  • 在live服务器上创建一个名为
    paypalWebhook.PHP
    的PHP文件。 下面是这个文件的代码

  • 现在可以像这样设置Webhook URL:
    https://{live server}/paypalWebhook.php


  • 现在,您可以通过live server向您的开发者[HTTP Basic authentication server]获取所有post值。

    您可能应该阅读有关如何进行第一次呼叫的文档。您需要一个访问令牌作为参数或标头传入URL。在你的情况下,你可以把它放在URL中,但是你必须先完成所有的步骤。获取一个clientid和一个clientsecret,并将它们交换为访问令牌,就像文档中的示例一样。在此之后,您可以使用访问令牌发出任何请求,感谢Rada,并为问题不明确表示歉意。API身份验证工作正常。这个问题与API的另一个方面有关。我已经对这个问题进行了澄清,并将很快给出答案。
    $body = @file_get_contents('php://input');
    
    $url = 'https://foo:secret@example.com/paypal_events';
    
    //open connection
    $ch = curl_init();
    //set the url, number of POST vars, POST data
    curl_setopt($ch,CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_POST, count($fields));
    curl_setopt($ch,CURLOPT_POSTFIELDS, $body);
    
    //execute post
    $result = curl_exec($ch);
    
    //close connection
    curl_close($ch);