在 Sandbox 中使用 PayPal .NET SDK 验证 PayPal Webhook 调用

Validating PayPal Webhook calls with PayPal .NET SDK in Sandbox

我一直在尝试设置 PayPal Webhooks(在沙盒模式下)以接收有关拒绝和成功付款的通知。我的问题是我无法进行验证。关于我的尝试的一些细节:

  1. 该应用程序是一个 OWIN 自托管网站 API 2.
  2. 托管为 Azure Web 应用程序,也在 Azure 上进行了测试。
  3. 我将 Paypal 仪表板中的 Paypal Webhook 接收器 URL 设置为我在 Azure 上的端点的 URL。
  4. 我使用 Paypal 仪表板中的 Paypal Webhooks 模拟器向 Azure 端点发送消息。

我尝试通过两种方式监听 Webhook 调用:

  1. ASP.NET Webhook 接收器 (http://blogs.msdn.com/b/webdev/archive/2015/09/04/introducing-microsoft-asp-net-webhooks-preview.aspx),它不起作用。我收到错误消息 "WebHook validation failed: "
  2. 尝试创建 Web API 端点来接收和验证请求,但也没有用。代码在这里:

    [HttpPost]
    public async Task<IHttpActionResult> PaymentCaptureCompleted()
    {
        // Get the received request's headers
        NameValueCollection nvc = new NameValueCollection();
        foreach (var item in Request.Headers)
        {
            nvc.Add(item.Key, string.Join(",", item.Value));
        }
    
        // Get the received request's body
        var requestBody = await Request.Content.ReadAsStringAsync();
    
        var isValid = WebhookEvent.ValidateReceivedEvent(Api, nvc, requestBody, ConfigurationManager.AppSettings["paypal.webhook.id"]);
    
        if (isValid)
        {
            return Ok();
        }
        else
        {
            return BadRequest("Could not validate request");
        }
    }
    

当然还有很多细节,但我不确定需要多少信息才能回答我的问题。让我知道你需要什么,我会编辑这个问题。

请参考 PayPal Dot Net SDK 获取代码示例。 https://github.com/paypal/PayPal-NET-SDK

另外如果你的模拟器不工作,排除webhook或azure的配置有问题,你可能需要使用Runscope。 Ypu 可以将 Runscope 存储桶配置为 webhook 端点,如果您在那里收到 webhook 通知,您可能需要在 Azure 配置中进行更改。

真的不要去看文档。它是旧的,但对象仍然很好。 您可以为此使用 WebhookEvent class。 只需在您的控制器中使用此操作即可。

public JsonResult Index(WebhookEvent event)
{
    // event has all the data 
    return Json(new { success = true });
}

验证不适用于 IPN 沙箱和来自模拟的 Webhook 事件。它在 PayPal 文档中有说明。验证仅适用于 PayPal 的生产环境。

将 WebhookEvent.ValidateReceivedEvent 包裹在 try catch 中。如果调用失败,它可以挂起而不用挂起。异常将向您显示错误。

  try
  {
    var isValid = WebhookEvent.ValidateReceivedEvent(apiContext, nv, requestBody, hookId);
  }
  catch(Exception e)
  {

  }

在我的例子中,异常显示“无法加载受信任的证书”