c# .net Paypal支付Webhooks回调验证


前言

记录一下,那些年踩过的坑!


一、添加web窗体接收通知

用于接收第三方支付回调通知,请求链接例如:https://editor.csdn.net/Paypal/PaypalNotifyPage.aspx
在这里插入图片描述

二、使用步骤

1.引入bll

代码如下:

   using Newtonsoft.Json.Linq;
   using PayPal.Api; 
   using System; 
   using System.IO;
   using System.Net; 
   using System.Text;
   using System.Web;
   using System.Web.UI;  

2.config配置文件

代码如下:

<paypal>
    <settings>
      <!-- 将模式替换为“ security-test-sandbox”以测试您的服务器是否支持TLSv1.2。 有关更多信息,请遵循README说明。-->
      <add name="connectionTimeout" value="360000" />
      <add name="requestRetries" value="1" />
      <!-- 测试 -->
      <add name="mode" value="sandbox" />
      <add name="clientId" value="ASx_gEpY2EynTh_SfDGIWzo7fSVJlrb8YDxr_X1YLz_SXU5Q5eTwC9_0r3d0rTrhyKPEe2lgwlAzb2Tc" />
      <add name="clientSecret" value="EGKDuKiVXK0TX3996cuHBba8UmEA29q9W3yoCfB_TAHS5KypxfirBvHrqUc-8u7CPy-lzFY4VaWF6L04" />
      <!-- 正式 -->
      <!--<add name="mode" value="live" />
      <add name="clientId" value="" />
      <add name="clientSecret" value="" />-->
    </settings>
 </paypal>

1、该处用于获取config 和accessToken的值。
2、clientId和clientSecret获取方式:
a、登录: PayPal Developer
b、选择Sandbox,创建app在这里插入图片描述
c、点击进去就能看到 clientId和clientSecret 值在这里插入图片描述


3.代码

代码如下:

        public Page page { get; set; }
        public PaypalService(Page page)
        {
            this.page = page;
        }
        public void PaypalPayNotify()
        {
            string strRequest = "";
            try
            {
                page.Response.Write("200 OK");

                var param = page.Request.BinaryRead(page.Request.ContentLength);
                strRequest = Encoding.ASCII.GetString(param);
                if (VerificationResponse(page.Request, strRequest).Equals("SUCCESS"))
                {
                    WriteLog("执行业务操作VERIFIED");

                    JObject obj = JObject.Parse(strRequest);

                    string AmountTotal = obj["resource"]["amount"]["value"].ToString();//金额
                    string OrderNumber = obj["resource"]["invoice_id"].ToString();//订单号
                    string PayID = obj["resource"]["id"].ToString();//Paypal支付订单号
                    string PaymentStatus = obj["resource"]["status"].ToString();//交易状态
                    if (PaymentStatus == "COMPLETED")
                    {
                        //更新业务
                    }
                    else
                    {
                       //打印日志输出错误
                       // " Paypal更新支付出错,交易状态不正确!PaymentStatus:" + PaymentStatus
                    }
                }
            }
            catch (Exception ex)
            {
                //捕获异常,打印日志输出错误
            }
            page.Response.End();
            page.Response.Close();
        }

        /// <summary>
        /// Webhooks回调响应验证
        /// </summary>
        /// <param name="ipnRequest"></param>
        /// <param name="strRequest"></param>
        /// <returns></returns>
        public string VerificationResponse(HttpRequest ipnRequest, string strRequest)
        {
            try
            {
                //处理HttpWebRequest访问https有安全证书的问题( 请求被中止: 未能创建 SSL/TLS 安全通道。)
                ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                System.Net.ServicePointManager.Expect100Continue = false;
                
                var url = "https://api-m.sandbox.paypal.com/v1/notifications/verify-webhook-signature";//沙盒webhook回调通知

                string transmissionId = ipnRequest.Headers["PAYPAL-TRANSMISSION-ID"];
                string transmissionTime = ipnRequest.Headers["PAYPAL-TRANSMISSION-TIME"];
                string certUrl = ipnRequest.Headers["PAYPAL-CERT-URL"];
                string signatureAlgorithm = ipnRequest.Headers["PAYPAL-AUTH-ALGO"];
                string transmissionSig = ipnRequest.Headers["PAYPAL-TRANSMISSION-SIG"];
                var webhookId = "9XY05847MO097611P";

                var dataStr = "{\"transmission_id\":\"" + transmissionId + "\",\"transmission_time\":\"" + transmissionTime + "\",\"cert_url\":\"" + certUrl + "\",\"auth_algo\":\"" + signatureAlgorithm + "\"" +
                        ",\"transmission_sig\":\"" + transmissionSig + "\",\"webhook_id\":\"" + webhookId + "\",\"webhook_event\":" + strRequest + "}";
               
                var config = ConfigManager.Instance.GetProperties();//读取配置文件
                var accessToken = new OAuthTokenCredential(config).GetAccessToken();
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/json";
                request.Headers.Add("Authorization", accessToken);

                //将有效负载附加到验证请求
                var streamOut = new StreamWriter(request.GetRequestStream(), Encoding.ASCII);
                streamOut.Write(dataStr);
                streamOut.Close();

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(myResponseStream);
                string retString = myStreamReader.ReadToEnd();
                myStreamReader.Close();
                myResponseStream.Close();

                JObject obj = JObject.Parse(retString);
                var VerificationStatus = obj["verification_status"].ToString();

                return VerificationStatus;
            }
            catch (Exception exception)
            {
                //捕获异常,打印日志输出错误
                return "";
            }
        }

1、该处用于支付Webhooks回调验证。
2、官方文档: 如何使用网络钩子模拟器验证 webhook 签名api:/v1/notifications/verify-webhook-signature
3、添加网络钩子步骤:
a、点击打开新建的app,添加Webhooks在这里插入图片描述在这里插入图片描述
在这里插入图片描述
b、保存后就可以获取到WebhookId了
4、也可以模拟Webhooks回调请求在这里插入图片描述


总结

已经是按零基础去描述了,这样都看不懂,那你联系我,让我好好羞辱你一番!(狗头。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值