tnblog
首页
视频
资源
登录

.NET接入微信支付(四)平台证书

3586人阅读 2023/2/23 17:05 总访问:28320 评论:0 收藏:0 手机
分类: 微信支付
  1.     /// <summary>
  2.     /// 平台证书类
  3.     /// </summary>
  4.     public class WxPayPlateformCertificate
  5.     {
  6.         public string serial_no { getset; }
  7.         public DateTimeOffset effective_time { getset; }
  8.         public DateTimeOffset expire_time { getset; }
  9.         public EncryptInfo encrypt_certificate { getset; }
  10.         InMemoryCertificateManager certificateManager = InMemoryCertificateManager.Instance;
  11.         /// <summary>
  12.         /// 获取平台证书
  13.         /// </summary>
  14.         /// <param name="serialNo"></param>
  15.         /// <param name="options"></param>
  16.         /// <returns></returns>
  17.         public X509Certificate2 GetPlatformCertificate(string url, string serialNo, string secretKey)
  18.         {
  19.             var certificate = certificateManager.GetCertificate(serialNo);
  20.             if (certificate != null)
  21.             {
  22.                 return certificate;
  23.             }
  24.             Logger loger = LogManager.GetCurrentClassLogger();
  25.             loger.Info("更新平台证书:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
  26.             var response = HttpService.Execute("", url, "GET");
  27.             if (string.IsNullOrWhiteSpace(response) || response.Length == 0)
  28.             {
  29.                 throw new Exception("GET PLATFORM CERTIFICATE FAILED! 获取平台证书失败!");
  30.             }
  31.             JObject jObject = JObject.Parse(response);
  32.             string resultStr = jObject["data"].ToString();
  33.             List<WxPayPlateformCertificate> platformCertificates = resultStr.FromJsonObj<List<WxPayPlateformCertificate>>();
  34.             foreach (var item in platformCertificates)
  35.             {
  36.                 switch (item.encrypt_certificate.algorithm)
  37.                 {
  38.                     case "AEAD_AES_256_GCM":
  39.                         {
  40.                             serialNo = item.serial_no;
  41.                             certificateManager.SetCertificate(item.serial_no, new X509Certificate2(WxPayDecrypt.Decrypt(secretKey, item.encrypt_certificate)));
  42.                         }
  43.                         break;
  44.                     default:
  45.                         throw new Exception("Unsupported Encrypt Algorithm!");
  46.                 }
  47.             }
  48.             return certificateManager.GetCertificate(serialNo);
  49.         }
  50.     }
  51.         /// <summary>
  52.     /// 微信商户平台证书管理器接口。
  53.     /// </summary>
  54.     public abstract class CertificateManager
  55.     {
  56.         /// <summary>
  57.         /// 根据证书序列号获取证书(cer 格式)。
  58.         /// </summary>
  59.         /// <param name="serialNumber"></param>
  60.         /// <returns></returns>
  61.         public abstract X509Certificate2 GetCertificate(string serialNumber);
  62.         /// <summary>
  63.         /// 设置证书序列号与证书(cer 格式)的映射关系。
  64.         /// </summary>
  65.         /// <param name="serialNumber"></param>
  66.         /// <param name="certificate"></param>
  67.         public abstract void SetCertificate(string serialNumber, X509Certificate2 certificate);
  68.     }
  69.     /// <summary>
  70.     /// 一个基于内存实现的 <see cref="CertificateManager"/>
  71.     /// </summary>
  72.     public class InMemoryCertificateManager : CertificateManager
  73.     {
  74.         private IDictionary<string, X509Certificate2> _dict;
  75.         private static object lockObject = new object();
  76.         static InMemoryCertificateManager _;
  77.         public static InMemoryCertificateManager Instance
  78.         {
  79.             get
  80.             {
  81.                 if (_ == null)
  82.                 {
  83.                     lock (lockObject)
  84.                     {
  85.                         if (_ == null)
  86.                             _ = new InMemoryCertificateManager();
  87.                     }
  88.                 }
  89.                 return _;
  90.             }
  91.         }
  92.         private InMemoryCertificateManager()
  93.         {
  94.             _dict = new ConcurrentDictionary<string, X509Certificate2>();
  95.         }
  96.         public override X509Certificate2 GetCertificate(string serialNumber)
  97.         {
  98.             if (serialNumber == nullthrow new ArgumentNullException(nameof(serialNumber));
  99.             return _dict[serialNumber];
  100.         }
  101.         public override void SetCertificate(string serialNumber, X509Certificate2 certificate)
  102.         {
  103.             if (serialNumber == nullthrow new ArgumentNullException(nameof(serialNumber));
  104.             if (certificate == nullthrow new ArgumentNullException(nameof(certificate));
  105.             _dict[serialNumber] = certificate;
  106.         }
  107.     }


评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

asp.net主动推送百度seo

虽然可以使用百度提供的js自动推送,但是估计度娘还是希望主动推送一点。哈哈^_^,女孩子嘛大多都喜欢被动一点。publicclass...
一木浮沉,吾与之。
排名
25
文章
22
粉丝
5
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
鲁迅:我没说过这句话。