Пример #1
0
        public async Task <T> ExecuteAsync <T>(HttpRequest request, WeChatPayOptions options) where T : WeChatPayNotify
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            if (string.IsNullOrEmpty(options.Key))
            {
                throw new ArgumentNullException(nameof(options.Key));
            }

            var body   = await new StreamReader(request.Body, Encoding.UTF8).ReadToEndAsync();
            var parser = new WeChatPayXmlParser <T>();
            var notify = parser.Parse(body);

            if (notify is WeChatPayRefundNotify)
            {
                var key  = MD5.Compute(options.Key).ToLowerInvariant();
                var data = AES.Decrypt((notify as WeChatPayRefundNotify).ReqInfo, key, CipherMode.ECB, PaddingMode.PKCS7);
                notify = parser.Parse(body, data);
            }
            else
            {
                CheckNotifySign(notify, options);
            }

            return(notify);
        }
Пример #2
0
        public Task <T> ExecuteAsync <T>(string body, WeChatPayOptions options) where T : WeChatPayNotify
        {
            if (string.IsNullOrEmpty(body))
            {
                throw new ArgumentNullException(nameof(body));
            }

            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            if (string.IsNullOrEmpty(options.Key))
            {
                throw new WeChatPayException("options.Key is Empty!");
            }

            var parser = new WeChatPayNotifyXmlParser <T>();
            var notify = parser.Parse(body);

            if (notify is Notify.WeChatPayRefundNotify)
            {
                var key  = MD5.Compute(options.Key).ToLowerInvariant();
                var data = AES.Decrypt((notify as Notify.WeChatPayRefundNotify).ReqInfo, key, CipherMode.ECB, PaddingMode.PKCS7);
                notify = parser.Parse(body, data);
            }
            else
            {
                CheckNotifySign(notify, options);
            }

            return(Task.FromResult(notify));
        }
Пример #3
0
        /// <summary>
        /// 计算指定证书的序列号
        /// </summary>
        /// <param name="certificate">证书</param>
        public static string GetCertSN(X509Certificate2 certificate)
        {
            // 删除逗号后面的空格
            var issuer = certificate.Issuer.Replace(", ", ",");

            //提取出的证书的issuerDN本身是以CN开头的,则无需逆序,直接返回
            if (issuer.StartsWith("CN", StringComparison.Ordinal))
            {
                return(MD5.Compute(issuer + BigInteger.Parse(certificate.SerialNumber, NumberStyles.HexNumber).ToString()).ToLowerInvariant());
            }
            else
            {
                var attributes = issuer.Split(',').ToList();
                attributes.Reverse();

                return(MD5.Compute(string.Join(",", attributes.ToArray()) + BigInteger.Parse(certificate.SerialNumber, NumberStyles.HexNumber).ToString()).ToLowerInvariant());
            }
        }
Пример #4
0
        public async Task <T> ExecuteAsync <T>(HttpRequest request, string optionsName) where T : WeChatPayNotify
        {
            var options = string.IsNullOrEmpty(optionsName) ? _optionsSnapshotAccessor.Value : _optionsSnapshotAccessor.Get(optionsName);
            var body    = await new StreamReader(request.Body, Encoding.UTF8).ReadToEndAsync();

            _logger.Log(options.LogLevel, "Request:{body}", body);

            var parser = new WeChatPayXmlParser <T>();
            var notify = parser.Parse(body);

            if (notify is WeChatPayRefundNotify)
            {
                var key  = MD5.Compute(options.Key).ToLower();
                var data = AES.Decrypt((notify as WeChatPayRefundNotify).ReqInfo, key, CipherMode.ECB, PaddingMode.PKCS7);
                _logger.Log(options.LogLevel, "Decrypt Content:{data}", data); // AES-256-ECB 解密内容
                notify = parser.Parse(body, data);
            }
            else
            {
                CheckNotifySign(notify, options);
            }

            return(notify);
        }