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)); }
public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams) { sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType)); }
private static void CheckNotifySign(WeChatPayNotify notify, WeChatPayOptions options) { if (string.IsNullOrEmpty(notify.Body)) { throw new WeChatPayException("sign check fail: Body is Empty!"); } if (notify.Parameters.Count == 0) { throw new WeChatPayException("sign check fail: Parameters is Empty!"); } if (!notify.Parameters.TryGetValue("sign", out var sign)) { throw new WeChatPayException("sign check fail: sign is Empty!"); } string cal_sign; if (notify.Parameters.TryGetValue("sign_type", out var sign_type) && sign_type == WeChatPayConsts.HMAC_SHA256) { cal_sign = WeChatPaySignature.SignWithKey(notify.Parameters, options.APIKey, WeChatPaySignType.HMAC_SHA256); } else { cal_sign = WeChatPaySignature.SignWithKey(notify.Parameters, options.APIKey, WeChatPaySignType.MD5); } if (cal_sign != sign) { throw new WeChatPayException("sign check fail: check Sign and Data Fail!"); } }
public void PrimaryHandler(WeChatPayDictionary sortedTxtParams, WeChatPayOptions options) { sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.APIKey, signType)); }
public async Task <T> ExecuteAsync <T>(IWeChatPayPostRequest <T> request, WeChatPayOptions options) where T : WeChatPayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.MchId)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.MchId)} is Empty!"); } if (string.IsNullOrEmpty(options.Certificate)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.Certificate)} is Empty!"); } var client = _httpClientFactory.CreateClient(Name); var(headers, body, statusCode) = await client.PostAsync(request, options); var parser = new WeChatPayResponseJsonParser <T>(); var response = parser.Parse(body, statusCode); await CheckResponseSignAsync(headers, body, options); return(response); }
public Task <WeChatPayDictionary> ExecuteAsync(IWeChatPaySdkRequest request, WeChatPayOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.AppId)} is Empty!"); } if (string.IsNullOrEmpty(options.MchId)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.MchId)} is Empty!"); } if (string.IsNullOrEmpty(options.APIKey)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.APIKey)} is Empty!"); } var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(sortedTxtParams, options); return(Task.FromResult(sortedTxtParams)); }
public void PrimaryHandler(WeChatPayDictionary sortedTxtParams, WeChatPayOptions options) { sortedTxtParams.Add(WeChatPayConsts.timeStamp, WeChatPayUtility.GetTimeStamp()); sortedTxtParams.Add(WeChatPayConsts.nonceStr, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.signType, signType.ToString()); sortedTxtParams.Add(WeChatPayConsts.paySign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.APIKey, signType)); }
/// <summary> /// 构造函数 /// </summary> /// <param name="accessor"></param> /// <param name="client"></param> /// <param name="wechatPayOption"></param> public PaymentService(IHttpContextAccessor accessor, IWeChatPayClient client, IOptions <WeChatPayOptions> wechatPayOption) { _accessor = accessor; _client = client; _wechatPayOption = wechatPayOption.Value; }
public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams) { sortedTxtParams.Add(WeChatPayConsts.noncestr, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.timestamp, WeChatPayUtility.GetTimeStamp()); sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId); sortedTxtParams.Add(WeChatPayConsts.partnerid, options.MchId); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, WeChatPaySignType.MD5)); }
public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams) { sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); if (signType == WeChatPaySignType.HMAC_SHA256) { sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256); } }
/// <summary> /// 构造函数 /// </summary> /// <param name="logger"></param> /// <param name="client"></param> /// <param name="mediator"></param> /// <param name="wechatOptions"></param> public PaymentNotifyController(ILogger <PaymentNotifyController> logger, IWeChatPayNotifyClient client, IMediator mediator, IOptions <WeChatPayOptions> wechatOptions) { _logger = logger; _client = client; _mediator = mediator; _wechatOptions = wechatOptions.Value; }
public void PrimaryHandler(WeChatPayDictionary sortedTxtParams, WeChatPayOptions options) { sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId); sortedTxtParams.Add(WeChatPayConsts.sub_appid, options.SubAppId); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); sortedTxtParams.Add(WeChatPayConsts.sub_mch_id, options.SubMchId); sortedTxtParams.Add(WeChatPayConsts.sign_type, signType.ToString()); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.APIKey, signType)); }
public void PrimaryHandler(WeChatPayDictionary sortedTxtParams, WeChatPayOptions options) { sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); if (string.IsNullOrEmpty(sortedTxtParams.GetValue(WeChatPayConsts.brand_mch_id))) { sortedTxtParams.Add(WeChatPayConsts.sub_mch_id, options.SubMchId); } sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.APIKey, signType)); }
public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams) { sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); sortedTxtParams.Add(WeChatPayConsts.sub_mch_id, options.SubMchId); if (signType == WeChatPaySignType.HMAC_SHA256) { sortedTxtParams.Add(WeChatPayConsts.sign_type, WeChatPayConsts.HMAC_SHA256); } sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType)); }
/// <summary> /// 构造函数 /// </summary> /// <param name="client"></param> /// <param name="options"></param> /// <param name="withdrawalHistoryRepository"></param> /// <param name="custoemrRepository"></param> /// <param name="customerManager"></param> /// <param name="mapper"></param> public AdminWithdrawalController(IWeChatPayClient client, IOptions <WeChatPayOptions> options, IRepositoryByInt <WithdrawalHistory> withdrawalHistoryRepository, IRepositoryByInt <Customer> custoemrRepository, ICustomerManager customerManager, IMapper mapper) { _client = client; _weChatPayOptions = options.Value; _withdrawalHistoryRepository = withdrawalHistoryRepository; _custoemrRepository = custoemrRepository; _customerManager = customerManager; _mapper = mapper; }
public async Task <T> ExecuteAsync <T>(IWeChatPayCertRequest <T> request, WeChatPayOptions options) where T : WeChatPayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.AppId)} is Empty!"); } if (string.IsNullOrEmpty(options.MchId)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.MchId)} is Empty!"); } if (string.IsNullOrEmpty(options.APIKey)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.APIKey)} is Empty!"); } if (string.IsNullOrEmpty(options.Certificate)) { throw new WeChatPayException($"options.{nameof(WeChatPayOptions.Certificate)} is Empty!"); } var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(sortedTxtParams, options); if (!_clientCertificateManager.ContainsKey(options.CertificateSerialNo)) { _clientCertificateManager.TryAdd(options.CertificateSerialNo, options.Certificate2); } var client = _httpClientFactory.CreateClient(Prefix + options.CertificateSerialNo); var body = await client.PostAsync(request, sortedTxtParams); var parser = new WeChatPayResponseXmlParser <T>(); var response = parser.Parse(body); if (request.GetNeedCheckSign()) { var signType = request.GetSignType(); CheckResponseSign(response, options, signType); } return(response); }
public void PrimaryHandler(WeChatPayDictionary sortedTxtParams, WeChatPayOptions options) { if (string.IsNullOrEmpty(options.RsaPublicKey)) { throw new WeChatPayException($"{nameof(WeChatPayPayBankRequest)}.{nameof(PrimaryHandler)}: {nameof(options.RsaPublicKey)} is empty!"); } sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); sortedTxtParams.Add(WeChatPayConsts.enc_bank_no, OaepSHA1WithRSA.Encrypt(BankNo, options.RsaPublicKey)); sortedTxtParams.Add(WeChatPayConsts.enc_true_name, OaepSHA1WithRSA.Encrypt(TrueName, options.RsaPublicKey)); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.APIKey, signType)); }
public async Task <PaymentOrderBaseResponse> GeneratePaymentOrder(PaymentOrderRequest request) { var ip = Dns.GetHostEntry(Dns.GetHostName()) .AddressList.FirstOrDefault(address => address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)?.ToString() ?? "127.0.0.1"; var apiHost = await _appSettingService.Get(ShopKeys.ApiHost); var wxRequest = new WeChatPayUnifiedOrderRequest { Body = request.Subject, OutTradeNo = request.OrderNo, TotalFee = Convert.ToInt32(request.TotalAmount * 100), OpenId = request.OpenId, TradeType = "JSAPI", //SpbillCreateIp = "127.0.0.1", SpBillCreateIp = ip, NotifyUrl = $"{apiHost.Trim('/')}/api/mp/pay/notify/{request.OrderNo}", }; var config = await _appSettingService.Get <MiniProgramOptions>(); var opt = new WeChatPayOptions() { AppId = config.AppId, MchId = config.MchId, Secret = config.AppSecret, Key = config.Key }; var response = await _client.ExecuteAsync(wxRequest, opt); if (response?.ReturnCode == WeChatPayCode.Success && response?.ResultCode == WeChatPayCode.Success) { var req = new WeChatPayLiteAppSdkRequest { Package = $"prepay_id={response.PrepayId}" }; // https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5 // 将参数(parameter)给 小程序前端 让他调起支付API var parameter = await _client.ExecuteAsync(req, opt); var json = JsonConvert.SerializeObject(parameter); return(JsonConvert.DeserializeObject <PaymentOrderResponse>(json)); } throw new Exception(response?.ReturnMsg); }
public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams) { sortedTxtParams.Add(WeChatPayConsts.timeStamp, WeChatPayUtility.GetTimeStamp()); sortedTxtParams.Add(WeChatPayConsts.nonceStr, WeChatPayUtility.GenerateNonceStr()); if (!string.IsNullOrEmpty(options.SubAppId)) { sortedTxtParams.Add(WeChatPayConsts.appId, options.SubAppId); } else { sortedTxtParams.Add(WeChatPayConsts.appId, options.AppId); } sortedTxtParams.Add(WeChatPayConsts.signType, WeChatPayConsts.MD5); sortedTxtParams.Add(WeChatPayConsts.paySign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.APIKey, WeChatPaySignType.MD5)); }
public Task <T> PageExecuteAsync <T>(IWeChatPayRequest <T> request, WeChatPayOptions options) where T : WeChatPayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new WeChatPayException("options.AppId is Empty!"); } if (string.IsNullOrEmpty(options.MchId)) { throw new WeChatPayException("options.MchId is Empty!"); } if (string.IsNullOrEmpty(options.Key)) { throw new WeChatPayException("options.Key is Empty!"); } var signType = request.GetSignType(); var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(options, signType, sortedTxtParams); var url = request.GetRequestUrl(); if (url.Contains("?")) { url += "&" + WeChatPayUtility.BuildQuery(sortedTxtParams); } else { url += "?" + WeChatPayUtility.BuildQuery(sortedTxtParams); } var rsp = Activator.CreateInstance <T>(); rsp.Body = url; return(Task.FromResult(rsp)); }
public async Task <IActionResult> NotifyByOrderNo(string no) { try { var config = await _appSettingService.Get <MiniProgramOptions>(); var opt = new WeChatPayOptions() { AppId = config.AppId, MchId = config.MchId, Secret = config.AppSecret, Key = config.Key }; var notify = await _client.ExecuteAsync <WeChatPayUnifiedOrderNotify>(Request, opt); if (notify.ReturnCode == "SUCCESS") { if (notify.ResultCode == "SUCCESS") { await _mqService.Send(QueueKeys.PaymentReceived, new PaymentReceived() { Note = "微信支付成功结果通知", OrderNo = no, PaymentFeeAmount = notify.TotalFee / 100M, PaymentMethod = PaymentMethod.WeChat, PaymentOn = DateTime.ParseExact(notify.TimeEnd, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture) }); return(WeChatPayNotifyResult.Success); } } return(NoContent()); } catch { return(NoContent()); } finally { _logger.LogInformation("参数:{@no}", no); } }
public void PrimaryHandler(WeChatPayOptions options, WeChatPayDictionary sortedTxtParams) { if (!string.IsNullOrEmpty(options.SubAppId)) { sortedTxtParams.Add(WeChatPayConsts.appId, options.SubAppId); } else { sortedTxtParams.Add(WeChatPayConsts.appId, options.AppId); } sortedTxtParams.Add(WeChatPayConsts.timeStamp, WeChatPayUtility.GetTimeStamp()); sortedTxtParams.Add(WeChatPayConsts.nonceStr, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.signType, WeChatPayConsts.RSA); var signatureSourceData = BuildSignatureSourceData(sortedTxtParams); sortedTxtParams.Add(WeChatPayConsts.paySign, SHA256WithRSA.Sign(options.CertificateRSAPrivateKey, signatureSourceData)); }
public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams) { if (string.IsNullOrEmpty(options.RsaPublicKey)) { throw new WeChatPayException("WeChatPayPayBankRequest: RsaPublicKey is null!"); } sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); var no = OaepSHA1WithRSA.Encrypt(sortedTxtParams.GetValue(WeChatPayConsts.enc_bank_no), options.RsaPublicKey); sortedTxtParams.SetValue(WeChatPayConsts.enc_bank_no, no); var name = OaepSHA1WithRSA.Encrypt(sortedTxtParams.GetValue(WeChatPayConsts.enc_true_name), options.RsaPublicKey); sortedTxtParams.SetValue(WeChatPayConsts.enc_true_name, name); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType)); }
public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams) { sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.wxappid, options.AppId); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); var signList = new List <string> { "act_name", "mch_billno", "mch_id", "nonce_str", "re_openid", "total_amount", "wxappid", }; sortedTxtParams.Add(WeChatPayConsts.workwx_sign, WeChatPaySignature.SignWithSecret(sortedTxtParams, options.AppSecret, signList)); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType)); }
public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams) { sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.appid, options.AppId); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); var signList = new List<string> { "amount", "appid", "desc", "mch_id", "nonce_str", "openid", "partner_trade_no", "ww_msg_type", }; sortedTxtParams.Add(WeChatPayConsts.workwx_sign, WeChatPaySignature.SignWithSecret(sortedTxtParams, options.Secret, signList)); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType)); }
public async Task <T> ExecuteAsync <T>(IWeChatPayRequest <T> request, WeChatPayOptions options) where T : WeChatPayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new WeChatPayException("options.AppId is Empty!"); } if (string.IsNullOrEmpty(options.MchId)) { throw new WeChatPayException("options.MchId is Empty!"); } if (string.IsNullOrEmpty(options.Key)) { throw new WeChatPayException("options.Key is Empty!"); } var signType = request.GetSignType(); var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(options, signType, sortedTxtParams); var client = _httpClientFactory.CreateClient(Name); var body = await client.PostAsync(request, sortedTxtParams); var parser = new WeChatPayResponseXmlParser <T>(); var response = parser.Parse(body); if (request.GetNeedCheckSign()) { CheckResponseSign(response, options, signType); } return(response); }
private void CheckNotifySign(WeChatPayNotify notify, WeChatPayOptions options) { if (string.IsNullOrEmpty(notify.Body)) { throw new WeChatPayException("sign check fail: Body is Empty!"); } if (notify.Parameters.Count == 0) { throw new WeChatPayException("sign check fail: Parameters is Empty!"); } if (!notify.Parameters.TryGetValue("sign", out var sign)) { throw new WeChatPayException("sign check fail: sign is Empty!"); } var cal_sign = WeChatPaySignature.SignWithKey(notify.Parameters, options.Key, WeChatPaySignType.MD5); if (cal_sign != sign) { throw new WeChatPayException("sign check fail: check Sign and Data Fail!"); } }
private static void CheckResponseSign(WeChatPayResponse response, WeChatPayOptions options, WeChatPaySignType signType) { if (string.IsNullOrEmpty(response.Body)) { throw new WeChatPayException("sign check fail: Body is Empty!"); } if (response.Parameters.TryGetValue(WeChatPayConsts.return_code, out var return_code)) { if (return_code == WeChatPayCode.Success) { if (!response.Parameters.TryGetValue(WeChatPayConsts.sign, out var sign)) { throw new WeChatPayException("sign check fail: sign is Empty!"); } var cal_sign = WeChatPaySignature.SignWithKey(response.Parameters, options.APIKey, signType); if (cal_sign != sign) { throw new WeChatPayException("sign check fail: check Sign and Data Fail!"); } } } }
public async Task <T> ExecuteAsync <T>(Microsoft.AspNetCore.Http.HttpRequest request, WeChatPayOptions options) where T : WeChatPayNotify { if (request == null) { throw new ArgumentNullException(nameof(request)); } using (var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true)) { var body = await reader.ReadToEndAsync(); return(await ExecuteAsync <T>(body, options)); } }
private async Task CheckResponseSignAsync(WeChatPayHeaders headers, string body, WeChatPayOptions options) { if (string.IsNullOrEmpty(headers.Serial)) { throw new WeChatPayException($"sign check fail: {nameof(headers.Serial)} is empty!"); } if (string.IsNullOrEmpty(headers.Signature)) { throw new WeChatPayException($"sign check fail: {nameof(headers.Signature)} is empty!"); } var cert = await _platformCertificateManager.GetCertificateAsync(this, options, headers.Serial); var signSourceData = WeChatPayUtility.BuildSignatureSourceData(headers.Timestamp, headers.Nonce, body); var signCheck = SHA256WithRSA.Verify(cert.Certificate.GetRSAPublicKey(), signSourceData, headers.Signature); if (!signCheck) { throw new WeChatPayException("sign check fail: check Sign and Data Fail!"); } }