PayPal Webhook 永远不会返回已验证

问题描述 投票:0回答:1

我无法让 paypal 通过 webhooks 模拟器验证 webhook 请求。我的VerifyTask 和示例之间的唯一区别是我从webclient 转换为HttpClient。此代码与 paypal 站点中的示例 ipn 侦听器非常接近。以下是c# asp.net代码:

public class IPNSendBack
{
    public HttpRequest? IPNRequest { get; set; }
    public string? RequestBody { get; set; }
    public string? Verification { get; set; }
}
[AllowAnonymous]
[HttpPost()]
public async Task<IActionResult> ReceiveWebHook()
{
    var headers = HttpContext.Request.Headers;
    string transmissionid = headers["Paypal-Transmission-Id"].ToString();
    IPNSendBack ipnContext = new IPNSendBack()
    {
        IPNRequest = Request
    };
    using (StreamReader reader = new StreamReader(ipnContext.IPNRequest.Body, Encoding.ASCII))
    {
        ipnContext.RequestBody = await reader.ReadToEndAsync();
    }
    await Task.Run(() => VerifyTask(ipnContext, transmissionid));   
}
private async Task VerifyTask(IPNSendBack ipnContext, string? transmissionid)
{
    string url = isSandbox
           ? "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr"
           : "https://ipnpb.paypal.com/cgi-bin/webscr";

    using (HttpClient client = new HttpClient())
    {
        // Set values for the verification request
        var content = new StringContent($"cmd=_notify-validate&{ipnContext.RequestBody}", Encoding.ASCII, "application/x-www-form-urlencoded");

        // Send the request to PayPal and get the response
        HttpResponseMessage response = await client.PostAsync(url, content);
        response.EnsureSuccessStatusCode(); // Ensure successful response
        if (response.IsSuccessStatusCode)
        {
            string verificationResult = await response.Content.ReadAsStringAsync();
            ipnContext.Verification = verificationResult;
        }
    }
    await ProcessVerificationResponse(ipnContext, transmissionid);
}

除了总是得到无效响应之外,我还能够获得我需要的内容并且可以正确处理响应正文,所以我知道请求正文是好的,至少从模拟器来看是这样。

c# paypal-ipn paypal-subscriptions paypal-webhooks
1个回答
0
投票

PayPal Webhooks 和 IPN(即时付款通知)是两种不同的服务。两者之间没有任何联系。区分它们的一个简单方法是,Webhook 始终采用 JSON 格式,而 IPN 消息始终采用 NVP 或名称-值对格式 (

&name=value
)。

假设您有兴趣验证 JSON 格式的 PayPal Webhook 消息,有两种方法。

  1. 使用 Webhook 消息负载的哈希值进行加密验证。此操作的 Java 伪代码位于 Webhooks Guide
  2. 发布 Webhook JSON 消息正文(未修改,按照您收到的顺序)以及 HTTP 标头中的元数据以及您首次创建/注册 Webhook 时的 17 位 ID(不是 WH-#-#事件 id)发送到 Webhook 签名验证端点,详情请参阅Webhooks API 参考。它会为您检查哈希签名。
© www.soinside.com 2019 - 2024. All rights reserved.