Пример #1
0
        public Task <T> ExecuteAsync <T>(HttpRequest request) where T : UnionPayNotifyResponse
        {
            var parameters = new UnionPayDictionary();

            if (request.Method == "POST")
            {
                foreach (var item in request.Form)
                {
                    parameters.Add(item.Key, item.Value);
                }
            }

            if (parameters == null || parameters.Count == 0)
            {
                throw new Exception("sign check fail: sign is Empty!");
            }

            if (!UnionPaySignature.Validate(parameters, Options.SecureKey))
            {
                throw new Exception("sign check fail: check Sign and Data Fail!");
            }

            var parser = new UnionPayDictionaryParser <T>();
            var rsp    = parser.Parse(parameters);

            return(Task.FromResult(rsp));
        }
Пример #2
0
        public async Task <T> ExecuteAsync <T>(IUnionPayRequest <T> request, UnionPayOptions options) where T : UnionPayResponse
        {
            var version = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion();

            var merId = options.MerId;

            if (options.TestMode && (request is UnionPayGatewayPayFileTransferRequest || request is UnionPayNoRedirectPayFileTransferRequest || request is UnionPayQrCodePayFileTransferRequest || request is UnionPayWapPayFileTransferRequest))
            {
                merId = "700000000000001";
            }

            var txtParams = new UnionPayDictionary(request.GetParameters())
            {
                { VERSION, version },
                { ENCODING, options.Encoding },
                { SIGNMETHOD, options.SignMethod },
                { ACCESSTYPE, options.AccessType },
                { MERID, merId }
            };

            if (request.HasEncryptCertId() && options.EncryptCertificate?.key != null)
            {
                if (txtParams.TryGetValue(ACCNO, out var accNo))
                {
                    if (!string.IsNullOrEmpty(accNo))
                    {
                        // 对敏感信息加密
                        txtParams[ACCNO] = UnionPaySignature.EncryptData(accNo, options.EncryptCertificate.key);

                        txtParams.Add(ENCRYPTCERTID, options.EncryptCertificate.certId);
                    }
                }
            }

            UnionPaySignature.Sign(txtParams, options.SignCertificate.certId, options.SignCertificate.key, options.SecureKey);

            var query = UnionPayUtility.BuildQuery(txtParams);

            using (var client = _httpClientFactory.CreateClient(nameof(UnionPayClient)))
            {
                var body = await client.DoPostAsync(request.GetRequestUrl(options.TestMode), query);

                var dictionary = ParseQueryString(body);

                var ifValidateCNName = !options.TestMode;
                if (!UnionPaySignature.Validate(dictionary, options.RootCertificate.cert, options.MiddleCertificate.cert, options.SecureKey, ifValidateCNName))
                {
                    throw new UnionPayException("sign check fail: check Sign and Data Fail!");
                }

                var parser = new UnionPayDictionaryParser <T>();
                var rsp    = parser.Parse(dictionary);
                rsp.Body = body;
                return(rsp);
            }
        }
Пример #3
0
        public async Task <T> ExecuteAsync <T>(HttpRequest request, UnionPayOptions options) where T : UnionPayNotify
        {
            var parameters = await GetParametersAsync(request);

            var parser = new UnionPayDictionaryParser <T>();
            var rsp    = parser.Parse(parameters);

            CheckNotifySign(parameters, options);
            return(rsp);
        }
Пример #4
0
        public Task <T> ExecuteAsync <T>(HttpRequest request) where T : UnionPayNotifyResponse
        {
            var parameters = GetParameters(request);

            var query = HttpClientEx.BuildQuery(parameters);

            Logger.LogInformation(0, "Request Content:{query}", query);

            var parser = new UnionPayDictionaryParser <T>();
            var rsp    = parser.Parse(parameters);

            CheckNotifySign(parameters);
            return(Task.FromResult(rsp));
        }
Пример #5
0
        public async Task <T> ExecuteAsync <T>(HttpRequest request) where T : UnionPayNotifyResponse
        {
            var parameters = await GetParametersAsync(request);

            var query = HttpClientEx.BuildQuery(parameters);

            Logger?.LogTrace(0, "Request:{query}", query);

            var parser = new UnionPayDictionaryParser <T>();
            var rsp    = parser.Parse(parameters);

            CheckNotifySign(parameters);
            return(rsp);
        }
Пример #6
0
        public async Task <T> ExecuteAsync <T>(HttpRequest request, string optionsName) where T : UnionPayNotify
        {
            var options    = string.IsNullOrEmpty(optionsName) ? _optionsSnapshotAccessor.Value : _optionsSnapshotAccessor.Get(optionsName);
            var parameters = await GetParametersAsync(request);

            var query = UnionPayUtility.BuildQuery(parameters);

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

            var parser = new UnionPayDictionaryParser <T>();
            var rsp    = parser.Parse(parameters);

            CheckNotifySign(parameters, options);
            return(rsp);
        }
Пример #7
0
        public async Task <T> ExecuteAsync <T>(IUnionPayRequest <T> request) where T : UnionPayResponse
        {
            var version = string.Empty;

            if (!string.IsNullOrEmpty(request.GetApiVersion()))
            {
                version = request.GetApiVersion();
            }
            else
            {
                version = Options.Version;
            }

            var merId = Options.MerId;

            if (Options.TestMode && (request is UnionPayForm05_7_FileTransferRequest || request is UnionPayForm_6_6_FileTransferRequest))
            {
                merId = "700000000000001";
            }

            var txtParams = new UnionPayDictionary(request.GetParameters())
            {
                { VERSION, version },
                { ENCODING, Options.Encoding },
                { SIGNMETHOD, Options.SignMethod },
                { ACCESSTYPE, Options.AccessType },
                { MERID, merId },
            };

            if (request.HasEncryptCertId())
            {
                txtParams.Add(ENCRYPTCERTID, EncryptCertificate.certId);
            }

            UnionPaySignature.Sign(txtParams, SignCertificate.certId, SignCertificate.key, Options.SecureKey);

            var query = HttpClientEx.BuildQuery(txtParams);

            Logger?.LogTrace(0, "Request:{query}", query);

            var body = await Client.DoPostAsync(request.GetRequestUrl(Options.TestMode), query);

            Logger?.LogTrace(1, "Response:{content}", body.Content);

            var dic = ParseQueryString(body.Content);

            if (string.IsNullOrEmpty(body.Content))
            {
                throw new Exception("sign check fail: Body is Empty!");
            }

            var ifValidateCNName = !Options.TestMode;

            if (!UnionPaySignature.Validate(dic, RootCertificate.cert, MiddleCertificate.cert, Options.SecureKey, ifValidateCNName))
            {
                throw new Exception("sign check fail: check Sign and Data Fail!");
            }

            var parser = new UnionPayDictionaryParser <T>();
            var rsp    = parser.Parse(dic);

            rsp.Body = body.Content;
            return(rsp);
        }
Пример #8
0
        public async Task <T> ExecuteAsync <T>(IUnionPayRequest <T> request) where T : UnionPayResponse
        {
            var version = string.Empty;

            if (!string.IsNullOrEmpty(request.GetApiVersion()))
            {
                version = request.GetApiVersion();
            }
            else
            {
                version = Options.Version;
            }

            var merId = Options.MerId;

            if (Options.TestMode && (request is UnionPayForm05_7_FileTransferRequest || request is UnionPayForm_6_6_FileTransferRequest))
            {
                merId = "700000000000001";
            }

            var txtParams = new UnionPayDictionary(request.GetParameters())
            {
                { VERSION, version },
                { ENCODING, Options.Encoding },
                { SIGNMETHOD, Options.SignMethod },

                { TXNTYPE, request.GetTxnType() },
                { TXNSUBTYPE, request.GetTxnSubType() },
                { BIZTYPE, request.GetBizType() },
                { CHANNELTYPE, request.GetChannelType() },

                { ACCESSTYPE, Options.AccessType },
                { MERID, merId },
            };

            UnionPaySignature.Sign(txtParams, SignCertificate.certId, SignCertificate.key, Options.SecureKey);

            var resContent = await Client.DoPostAsync(request.GetRequestUrl(Options.TestMode), txtParams);

            if (string.IsNullOrEmpty(resContent.Content))
            {
                throw new Exception("resContent is Empty!");
            }

            if (resContent.ContentType.Contains("text/plain"))
            {
                throw new Exception(resContent.Content);
            }

            var dic = ParseQueryString(resContent.Content);

            if (dic == null || dic.Count == 0)
            {
                throw new Exception("sign check fail: Body is Empty!");
            }

            if (!UnionPaySignature.Validate(dic, Options.SecureKey))
            {
                throw new Exception("sign check fail: check Sign and Data Fail!");
            }

            var parser = new UnionPayDictionaryParser <T>();
            var rsp    = parser.Parse(dic);

            rsp.Body = resContent.Content;
            return(rsp);
        }