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

Posted

技术标签:

【中文标题】PayPal Webhook URL 中的 HTTP 基本身份验证【英文标题】:HTTP Basic Authentication in PayPal Webhook URLs 【发布时间】:2017-11-29 13:41:24 【问题描述】:

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

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

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

【问题讨论】:

您可能应该阅读文档developer.paypal.com/docs/integration/direct/… 关于如何拨打第一个电话。您需要访问令牌才能将 URL 作为参数或标头传递。在您的情况下,您可以将其放在 URL 中,但您必须先完成所有步骤..获取 clientid 和 clientsecret 并将它们交换为访问令牌,就像文档中的示例一样。之后您可以使用访问令牌发出任何请求 感谢 Rada,并为不清楚的问题道歉。 API 身份验证工作正常。这个问题是关于 API 的不同方面的。我已对问题进行了澄清,并将很快添加答案。 【参考方案1】:

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

尝试使用包含 HTTP Basic 凭据的 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 Webhooks 支持 HTTP 基本身份验证) 作为一种解决方法,请考虑在 URL 查询字符串中包含一个长而随机的秘密令牌,而不是作为身份验证检查。为此,URL 必须是 HTTPS。当心检查令牌的代码中的时间和长度攻击,简单的== 相等检查容易受到时间攻击。有关时间和长度攻击的更多信息,请参阅 https://github.com/rails/rails/blob/d66e7835bea9505f7003e5038aa19b6ea95ceea1/activesupport/lib/active_support/security_utils.rb#L22。

【讨论】:

【参考方案2】:

我们知道 PayPal Webhooks 不支持 HTTP Basic 身份验证, 但是对于这类问题,我们有一个解决方案。 我们需要一台实时服务器 [没有 HTTP 基本身份验证],因此我们可以在 paypal 应用程序中为 webhook URL 设置 php 文件。

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

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

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

现在您可以通过实时服务器获取所有发布值给您 devlopment[HTTP Basic authentication server]。

【讨论】:

以上是关于PayPal Webhook URL 中的 HTTP 基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Paypal REST API - 尝试使用其 HATEOS 自身 url 获取 webhook 事件时得到 404

从 paypal webhook 获取事件数据

关于无法从开发者沙箱触发 Paypal REST API webhook 事件

PayPal Sandbox 订阅 webhook 响应未收到

node.js 中 PayPal webhook 的签名是啥?

Paypal 不会在沙盒中的 BILLING.SUBSCRIPTION.CANCELLED 上触发 webhook