NewGaoKaoApi/PaymentSDK/AliPay/Util/CertEnvironment.cs

90 lines
3.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.IO;
using Org.BouncyCastle.X509;
using System.Collections.Generic;
using System;
using System.Text;
using System.Linq;
namespace Aop.Api.Util
{
public class CertEnvironment
{
/// <summary>
/// 支付宝根证书内容,用于验证下载的支付宝公钥证书有效性
/// </summary>
public string RootCertContent { get; set; }
/// <summary>
/// 支付宝根证书序列号用于每次调动OpenAPI时发送给网关
/// </summary>
public string RootCertSN { get; set; }
/// <summary>
/// 商户证书序列号用于每次调动OpenAPI时发送给网关
/// </summary>
public string AppCertSN { get; set; }
/// <summary>
/// 不同支付宝公钥证书序列号对应的公钥内容
/// </summary>
private readonly Dictionary<String, String> SN2PublicKey = new Dictionary<String, String>();
private readonly Object DictionaryLock = new Object();
/// <summary>
/// 初始化证书所需运行时参数
/// </summary>
/// <param name="certParams">用户传入的证书相关参数</param>
/// <param name="signType">算法类型</param>
public CertEnvironment(CertParams certParams, string signType)
{
//解析支付宝根证书序列号
this.RootCertContent = File.ReadAllText(certParams.RootCertPath);
this.RootCertSN = AntCertificationUtil.GetRootCertSN(RootCertContent, signType);
//解析应用证书序列号
X509Certificate appCert = AntCertificationUtil.ParseCert(File.ReadAllText(certParams.AppCertPath));
this.AppCertSN = AntCertificationUtil.GetCertSN(appCert);
//解析支付宝公钥证书序列号
X509Certificate alipayPublicKeyCert = AntCertificationUtil.ParseCert(File.ReadAllText(certParams.AlipayPublicCertPath));
string alipayPublicKeyCertSN = AntCertificationUtil.GetCertSN(alipayPublicKeyCert);
//解析支付宝公钥
string alipayPublicKey = AntCertificationUtil.ExtractPemPublicKeyFromCert(alipayPublicKeyCert);
//缓存支付宝公钥证书序号对应的支付宝公钥
AddNewAlipayPublicKey(alipayPublicKeyCertSN, alipayPublicKey);
}
public bool ContainsAlipayPublicKey(String sn)
{
if (sn == null)
{
return false;
}
lock (DictionaryLock)
{
return SN2PublicKey.ContainsKey(sn);
}
}
public string GetAlipayPublicKey(String sn)
{
lock (DictionaryLock)
{
return SN2PublicKey[sn];
}
}
public void AddNewAlipayPublicKey(String sn, String alipayPublicKey)
{
lock (DictionaryLock)
{
SN2PublicKey[sn] = alipayPublicKey;
}
}
}
}