栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 前言
  • 一、添加web窗体接收通知
  • 二、使用步骤
    • 1.引入bll
    • 2.config配置文件
    • 3.代码
  • 总结


前言

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


一、添加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配置文件

代码如下:


    
      
      
      
      
      
      
      
      
      
    
 

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();
        }

        /// 
        /// Webhooks回调响应验证
        /// 
        /// 
        /// 
        /// 
        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回调请求


总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955210.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号