如何验证PayPal Webhook签名?

2024-01-11

验证从 PayPal 收到的 Webhook 时遇到问题。可用的示例并不多,集成商也没有足够的加密知识来完成任务。

遵循的指南是网络钩子通知 https://developer.paypal.com/docs/integration/direct/webhooks/notification-messages/.

不确定代码片段出了什么问题,结果总是错误的。

Calling 通知/验证 webhook 签名 https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature_post端点也导致错误。

        /// <summary>Verify PayPal Webhook Signature</summary>
        /// <param name="webhookId">0YF54686R9851380C</param>
        /// <param name="transmissionId">785bc690-901d-11ea-8fc5-17f05150a6df</param>
        /// <param name="transmissionTime">2020-05-07T04:44:33Z</param>
        /// <param name="certUrl">https://api.sandbox.paypal.com/v1/notifications/certs/CERT-.....</param>
        /// <param name="transmissionSignature"></param>
        /// <param name="webHookEvent">"{\"id\":\"WH-5P8216093E7920426-60J97470GW748563B\",\"create_time\":\"2020-05-07T11:43:48.000Z\",....</param>
        private static void VerifyWebhookSignature(string webhookId, string transmissionId, string transmissionTime,
            string certUrl, string transmissionSignature, string webHookEvent)
        {
            Crc32 crc32 = new Crc32();
            String hash = string.Empty;

            var arrayOfBytes = Encoding.UTF8.GetBytes(webHookEvent);
            foreach (byte b in crc32.ComputeHash(arrayOfBytes)) hash += b.ToString("x2").ToLower();

            string expectedSignature = String.Format("{0}|{1}|{2}|{3}", transmissionId,
                transmissionTime, webhookId, hash);

            string certData = new System.Net.WebClient().DownloadString(certUrl);
            X509Certificate2 cert = new X509Certificate2(Encoding.UTF8.GetBytes(certData));

            try
            {
                byte[] signature = Convert.FromBase64String(transmissionSignature);
                byte[] expectedBytes = Encoding.UTF8.GetBytes(expectedSignature);

                using (RSA rsa = cert.GetRSAPublicKey())
                {
                    var verified = rsa.VerifyData(
                        expectedBytes,
                        signature,
                        HashAlgorithmName.SHA256,
                        RSASignaturePadding.Pkcs1);

                    Console.WriteLine($"Verified: {verified}");
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }

我可以确认您的实现有效,但我不确定您使用哪种实现来计算 CRC32 校验和。使用时CRC32.NET https://github.com/force-net/Crc32.NET下面的代码片段就足够了:

var arrayOfBytes = Encoding.UTF8.GetBytes(webHookEvent);
string hash = Crc32Algorithm.Compute(arrayOfBytes).ToString();

感谢您在这里提供它,我也在努力寻找一个可行的示例!

PS:刚刚发现这里的官方实现:https://github.com/paypal/PayPal-NET-SDK/blob/master/Source/SDK/Api/WebhookEvent.cs#L156 https://github.com/paypal/PayPal-NET-SDK/blob/master/Source/SDK/Api/WebhookEvent.cs#L156

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证PayPal Webhook签名? 的相关文章

  • 自动映射器多对一映射

    我想将一种类型映射到另一种类型 但我在第一种类型中有多个属性 需要获取其他类型的一个属性 例如 public class A public int a get set public int b get set public int c ge
  • 创建文件并使用内存流保存到其中

    如何创建文件并使用内存流写入文件 我需要使用内存流来防止其他线程尝试访问该文件 我试图保存到文件的数据是 html 如何才能做到这一点 假设您的意思是如何将文件的内容复制到内存流 如果您使用的是框架4 var memoryStream ne
  • JQuery、ASCX 和 webmethods 似乎不起作用

    我有一个级联下拉列表 其中 3 个 类型 类别和子类别 首先类型负载 然后选择类型 类别负载以及选择类别 子类别负载 我还有 2 个按钮 添加类别 和 添加子类别 单击这些按钮后 我调用 JQuery 模态表单来添加它们 我在代码后面使用
  • 在 TPL Dataflow 中,是否可以在创建块之后但使用之前更改 DataflowBlockOptions?

    有效果吗 我想推迟设置 ExecutionDataflowBlockOptions SingleProducerConstrained 属性 直到我准备好将网络链接在一起 因为 我想将创建块及其语义与将网络及其语义链接在一起分开 但据我所知
  • 如何有效地测试action是否用属性(AuthorizeAttribute)修饰?

    我正在使用 MVC 并且有一种情况OnActionExecuting 我需要确定即将执行的Action方法是否用属性修饰 AuthorizeAttribute尤其 我不是问授权是否成功 失败 而是问该方法是否需要授权 对于非 MVC 人员
  • ASP.NET MVC 数据注释属性 Range 从另一个属性值设置

    您好 我的 Asp net MVc 模型中有以下内容 测试模型 cs public class TestModel public double OpeningAmount get set Required ErrorMessage Requ
  • 使用 Rhino Mocks 模拟集合

    所以我猜这是很多人想做的事情 模拟集合 过去我用 Rhino 做过这样的事情 var col mock MockRepository GenerateMock
  • std::istringstream >> 使奇怪的行为加倍

    下面的代码打印0在 mac osx 上使用 clang 其他地方都会打印5 clang https ideone com mVgpzS gcc https ideone com oZ0hy6 include
  • 如何转换 UTF-8 <-> UTF16 可移植

    有没有一种简单 可移植的方法 至少是 win32 linux 将 UTF 16 转换为 UTF 8 并返回 最好使用升压 谢谢你的帮助 托比亚斯 Both libiconv http www gnu org software libicon
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • 有没有一种方法可以在 TreeView.Nodes 集合中搜索 TreeNode.Text 字段?

    像这样 TreeNode treeNodes treeView Nodes Find searchString true 但我希望它在text字段而不是name field 我不知道有任何内置方法 但你可以使用 LINQ TreeNode
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • 使用 itextSharp 5.3.3 对 Pdf 文档进行数字签名和验证

    我正在尝试使用 iTextSharp 5 3 3 在服务器 c 上进行数字签名和验证 pdf 文档 我使用 DigiSign 在线工具 生成了 Pfx 文件 然后使用 Windows 生成证书 cer 文件
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • 在另一个类中使用一个类对象?

    我正在用 c 制作应用程序 在该应用程序中 我有一个类DataCapture cs 在同一个应用程序中 我有另一个类Listner cs 在 Listner cs 类中 我想使用以下对象DataCapture cs不创建新对象DataCap
  • 在 Windows 上构建 MLT 框架时出错

    我一直在遵循官方提供的构建指南here http www mltframework org bin view MLT WindowsBuild 我需要 MLT 来创建视频播放器 并且我选择仅安装前 4 个库 如指南中所述 FFmpeg SD
  • 使用智能指针在大型对象集合中创建多个索引

    我正在为一个大型对象集合创建多个索引 即使用不同的键 对象可以改变 集合可以缩小和增长 到目前为止我的想法 保留某种指向对象的指针的多个集合 使用set代替map以获得更好的封装 使用 unordered set 可以很好地扩展大型数据集
  • 如何同时正确使用管道和信号?

    我有 2 个孩子 我想将信号从孩子发送到父母 并将答案 随机数 为什么 为什么不 命名管道从父母发送到每个孩子 我有这个代码 include
  • GCC编译非常慢(文件大)

    我正在尝试编译一个大的 C 文件 专门用于 MATLAB mexing C 文件大约 20 MB 可用来自 GCC 错误跟踪器 https gcc gnu org bugzilla attachment cgi id 36632如果你想玩一
  • C# p/Invoke 如何使用 DirectX 游戏的 SendInput 模拟 keyPRESS 事件

    我经常为各种机器人或其他 GUI 自动化程序模拟键盘按下事件而苦苦挣扎 我已经成功地使用以下方法模拟按键事件 INPUT kInput new INPUT 1 kInput j type SendInputEventType InputKe

随机推荐

  • 可以请求从 htmlhelper 访问查询字符串

    你好 可以在 HTMLHelper 扩展方法中访问查询字符串 我们需要根据请求中的查询字符串进行不同的渲染 是的 通过当前上下文 这是 HTML Helper 上的一个属性 public static string DoThis this
  • Three.JS Orbit Controls - 启用和禁用,无需位置跳跃

    我正在使用 Three JS 创建一个几何操作原型 我正在使用 OrbitControls JS 来操作相机 但在启用和禁用控件时遇到问题 这是我的演示 http moczys com webGL Prototype V02 05 html
  • 标头位置无法正常工作

    我的网址是 1006 我这里有一个没有任何操作的表格
  • 如何使 is_pod 测试在编译期间执行而不是执行期间执行?

    这可能是一个简单的问题 我根本不掌握 C 11 模板 我有一个通用向量类 但不是std vector
  • jQuery - 轮询作业队列

    我有一个包含作业队列的数据库表 一个单独的程序处理这些作业 我想提供一个网页供用户观看队列的进度 用于查询表并以 JSON 格式返回的服务器端脚本没有问题 我读过一些关于 jQuery 和期刊更新插件 http enfranchisedmi
  • 为什么片段类可能无效?

    我刚刚使用 AndroidStudio 向导创建了一个 PreferenceActivity 运行它引发了一个奇怪的异常 java lang RuntimeException Subclasses of PreferenceActivity
  • 使用下面的 uiimagePickerController Delegate 函数时获得不明确的引用:

    我试图覆盖 UIImagePickerControllerDelegate 中的 uiimagePickerController 函数 但是 我似乎收到错误 Ambiguous reference to member subscript 我
  • Android简单的警报对话框[重复]

    这个问题在这里已经有答案了 我需要向点击我的 Android 应用程序上的按钮的用户显示一条小短信 在 IOS 上我只需要创建一个 AlertView 它使用起来很简单 但在 Android 上我很困难 因为解决方案似乎困难十倍 我看到我需
  • IIS7:如何定义Windows身份验证已打开?

    IIS7 如何定义Windows身份验证已打开 我知道IIS7 集成模式不支持两阶段身份验证 https stackoverflow com questions 436169 iis7 setup integrated windows au
  • 从bind返回的结果和使用function()的结果有什么区别

    bind 的返回值与通过 function 创建等效值的结果有什么区别 有什么有效的区别吗 我不是在问上下文保留属性bind 是否有任何技术 性能原因导致您可能更喜欢一种方法 i e var myFunc foo bind undefine
  • 感应悬停在 JPanel 中 Path2D 圆的外边缘上[重复]

    这个问题在这里已经有答案了 因此 我有一个程序可以将 Path2D 圆绘制到 JPanel 上 我想要做的是当用户单击并拖动圆圈的右下角时调整圆圈的大小 所以 我想要的是检测它们何时在圆的右下角外边缘 而不是圆周围边界的右下角 基本上 我需
  • 使用 Zend Framework 的 Android RESTful Web 应用程序

    我编写了一个基于 Zend Framework 版本 1 11 11 的 Web 应用程序 我想使用相同的后端代码来编码该应用程序的移动版本 Android 为了实现这个目标 我想要获取 XML 和 JSON 格式的控制器中每个操作的响应
  • 使用集成 SQL 语言的带有 schemaRDD 的 SQL 函数

    我想使用基于 SQL 函数的语言集成 SQL 来过滤 schemaRDD 例如我想运行 SELECT name FROM people WHERE name LIKE AHSAN AND name regexp A Z 20 如何在 peo
  • 重复用“.”包围。 VIM 中的命令

    有没有人得到环绕 vim http www vim org scripts script php script id 1697跟 共事重复vim http www vim org scripts script php script id 2
  • 如何在 C# 中创建基于 DataTable.Rows.Count 的对象?

    下面的所有代码仅创建两个进程 虽然我需要创建 n 个进程来打开 Chrome 浏览器并运行OpenNRowsInData user pwd 基于dtUser Rows Count因为这是动态的 我不知道为什么OpenNRowsInData
  • FFmpeg输出查找结果到Android LruCache

    亲爱的 StackOverflower 同胞 在我的 Android 应用程序中 我尝试使用以下命令快速从视频中检索帧ffmpeg android java http writingminds github io ffmpeg androi
  • Nginx 未在已启用站点中拾取站点?

    经过 10 多个小时的研究 我还没弄清楚为什么这不起作用 我正在尝试将本地主机移动到启用站点的文件夹 该文件夹位于 etc nginx sites enabled default 中 它是来自站点可用文件夹的符号链接 使用以下配置时 使用
  • C++ 区分单击和双击

    我有一个应用程序 其中双击图像视图区域会更改图像视图的布局 另外 单击一下 图像上就会放置一个点 我的问题是 双击时这两个功能都可以工作 我当然知道 当双击发生时 控件首先转到 LButtonDown 我不希望点功能在双击时起作用 我已经为
  • Angular UI-Router 在一种状态下有更多可选参数

    如何在不使用查询字符串且仅使用一个路由名称的情况下向我的路由允许可选参数 我目前将每条路线指定五次 以允许任意部分组合 所有部分都必须是可选的 路线必须解决任何变化 state login url login templateUrl log
  • 如何验证PayPal Webhook签名?

    验证从 PayPal 收到的 Webhook 时遇到问题 可用的示例并不多 集成商也没有足够的加密知识来完成任务 遵循的指南是网络钩子通知 https developer paypal com docs integration direct