public LianLianPayClient(
            ILogger <LianLianPayClient> logger,
            IHttpClientFactory clientFactory,
            IOptions <LianLianPayOptions> optionsAccessor)
        {
            Logger        = logger;
            ClientFactory = clientFactory;
            Options       = optionsAccessor.Value;

            if (string.IsNullOrEmpty(Options.OidPartner))
            {
                throw new ArgumentNullException(nameof(Options.OidPartner));
            }

            if (string.IsNullOrEmpty(Options.BusiPartner))
            {
                throw new ArgumentNullException(nameof(Options.BusiPartner));
            }

            if (string.IsNullOrEmpty(Options.RsaPrivateKey))
            {
                throw new ArgumentNullException(nameof(Options.RsaPrivateKey));
            }

            if (string.IsNullOrEmpty(Options.RsaPublicKey))
            {
                throw new ArgumentNullException(nameof(Options.RsaPublicKey));
            }
        }
Exemple #2
0
        public async Task <T> ExecuteAsync <T>(ILianLianPayRequest <T> request, LianLianPayOptions options) where T : LianLianPayResponse
        {
            var txtParams = new LianLianPayDictionary(request.GetParameters())
            {
                { OID_PARTNER, options.OidPartner },
                { SIGN_TYPE, options.SignType }
            };

            if (request is LianLianPayCreateBillRequest || request is LianLianPayUnifiedCardBindRequest)
            {
                txtParams.Add(TIME_STAMP, DateTime.Now);
                txtParams.Add(BUSI_PARTNER, options.BusiPartner);
            }

            // 添加签名
            var signContent = LianLianPaySecurity.GetSignContent(txtParams);

            txtParams.Add(SIGN, MD5WithRSA.SignData(signContent, options.PrivateKey));

            var content = string.Empty;

            if (request is LianLianPayPaymentRequest || request is LianLianPayConfirmPaymentRequest)
            {
                var plaintext  = Serialize(txtParams);
                var ciphertext = LianLianPaySecurity.Encrypt(plaintext, options.PublicKey);
                content = $"{{\"pay_load\":\"{ciphertext}\",\"oid_partner\":\"{options.OidPartner}\"}}";
            }
            else
            {
                content = Serialize(txtParams);
            }

            using (var client = _httpClientFactory.CreateClient(nameof(LianLianPay)))
            {
                var body = await client.DoPostAsync(request.GetRequestUrl(), content);

                var parser = new LianLianPayJsonParser <T>();
                var rsp    = parser.Parse(body);

                // 不签名参数
                var excludePara = new List <string>();
                if (request is LianLianPayOrderQueryRequest)
                {
                    excludePara.Add("bank_name");
                    excludePara.Add("card_no");
                }
                else if (request is LianLianPayQueryBankCardBindListRequest)
                {
                    excludePara.Add("agreement_list");
                }

                CheckNotifySign(rsp, excludePara, options);
                return(rsp);
            }
        }
        private void CheckNotifySign(LianLianPayDictionary dictionary, LianLianPayOptions options)
        {
            if (dictionary == null || dictionary.Count == 0)
            {
                throw new LianLianPayException("sign check fail: dictionary is Empty!");
            }

            if (!dictionary.TryGetValue("sign", out var sign))
            {
                throw new LianLianPayException("sign check fail: sign is Empty!");
            }

            var prestr = LianLianPaySecurity.GetSignContent(dictionary);

            if (!MD5WithRSA.VerifyData(prestr, sign, options.PublicKey))
            {
                throw new LianLianPayException("sign check fail: check Sign and Data Fail JSON also");
            }
        }
        public LianLianPayNotifyClient(
            ILogger <LianLianPayClient> logger,
            IOptions <LianLianPayOptions> optionsAccessor)
        {
            Logger  = logger;
            Options = optionsAccessor?.Value;

            if (string.IsNullOrEmpty(Options.OidPartner))
            {
                throw new ArgumentNullException(nameof(Options.OidPartner));
            }

            if (string.IsNullOrEmpty(Options.BusiPartner))
            {
                throw new ArgumentNullException(nameof(Options.BusiPartner));
            }

            if (string.IsNullOrEmpty(Options.RsaPublicKey))
            {
                throw new ArgumentNullException(nameof(Options.RsaPublicKey));
            }
        }
        public async Task <T> ExecuteAsync <T>(HttpRequest request, LianLianPayOptions options) where T : LianLianPayNotify
        {
            if (request.HasFormContentType)
            {
                var parameters = await GetParametersAsync(request);

                var parser = new LianLianPayDictionaryParser <T>();
                var rsp    = parser.Parse(parameters);
                CheckNotifySign(parameters, options);
                return(rsp);
            }

            if (request.HasTextJsonContentType())
            {
                var body = await new StreamReader(request.Body).ReadToEndAsync();

                var parser = new LianLianPayJsonParser <T>();
                var rsp    = parser.Parse(body);
                CheckNotifySign(rsp.Parameters, options);
                return(rsp);
            }

            throw new LianLianPayException("content type is not supported");
        }
Exemple #6
0
        private void CheckNotifySign(LianLianPayResponse response, List <string> excludePara, LianLianPayOptions options)
        {
            if (string.IsNullOrEmpty(response.Body))
            {
                throw new LianLianPayException("sign check fail: Body is Empty!");
            }

            if (response.Parameters.Count == 0)
            {
                throw new LianLianPayException("sign check fail: Parameters is Empty!");
            }

            if (!response.Parameters.TryGetValue("sign", out var sign))
            {
                throw new LianLianPayException("sign check fail: sign is Empty!");
            }

            var prestr = LianLianPaySecurity.GetSignContent(response.Parameters, excludePara);

            if (!MD5WithRSA.VerifyData(prestr, sign, options.PublicKey))
            {
                throw new LianLianPayException("sign check fail: check Sign and Data Fail JSON also");
            }
        }