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

Posted

技术标签:

【中文标题】在 Sandbox 中使用 PayPal .NET SDK 验证 PayPal Webhook 调用【英文标题】:Validating PayPal Webhook calls with PayPal .NET SDK in Sandbox 【发布时间】:2016-04-25 16:24:45 【问题描述】:

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

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

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

    ASP.NET Webhook 接收器 (http://blogs.msdn.com/b/webdev/archive/2015/09/04/introducing-microsoft-asp-net-webhooks-preview.aspx),它不起作用。我收到错误消息“WebHook 验证失败:”

    尝试创建一个 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 webhook 时,我总是收到 500 个服务器错误。 还没有回到这个问题。一旦我这样做了,我会留下另一条评论,并验证它现在是否有效。 【参考方案1】:

将 WebhookEvent.ValidateReceivedEvent 包装在 try catch 中。如果呼叫失败,它可以挂断没有。异常会显示错误。

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

  

在我的情况下,异常显示“无法加载受信任的证书”

【讨论】:

【参考方案2】:

验证不适用于模拟中的 IPN 沙盒或 Webhook 事件。 PayPal 文档中对此进行了说明。验证仅适用于 PayPal 的生产环境。

【讨论】:

【参考方案3】:

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

public JsonResult Index(WebhookEvent event)

    // event has all the data 
    return Json(new  success = true );

【讨论】:

我认为这个答案是不完整的。接收 WebhookEvent 作为参数,如何通过验证事件来进行呢?我们如何检索 txnId 以确保它尚未被处理,我们如何确保 receiver_email 是主要的 PayPal 电子邮件,等等。【参考方案4】:

有关代码示例,请参阅 PayPal Dot Net SDK。 https://github.com/paypal/PayPal-NET-SDK

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

【讨论】:

以上是关于在 Sandbox 中使用 PayPal .NET SDK 验证 PayPal Webhook 调用的主要内容,如果未能解决你的问题,请参考以下文章

无法解析远程名称:'api-3t.sandbox.paypal.com'

.NET 中的 Paypal v2 快速结帐集成

通过 PayPal 余额付款选项在 Sandbox 帐户中不可用

无法使用selenium在PayPal Sandbox中插入电子邮件

如何登录 Sandbox Paypal 帐户?

强制 Rails Paypal gem 使用 Sandbox 而不是 Live