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)); } }
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"); }
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"); } }