/// <summary> /// 初始化微信支付参数生成器 /// </summary> /// <param name="config">配置</param> public WechatpayParameterBuilder(WechatpayConfig config) { config.CheckNull(nameof(config)); Config = config; _builder = new ParameterBuilder(); _jsonSerializer = IocManager.GetContainer().Resolve <IJsonSerializer>(); }
/// <summary> /// 初始化微信支付服务 /// </summary> /// <param name="configProvider">微信支付配置提供器</param> protected WechatpayServiceBase(IWechatpayConfigProvider configProvider, IHttpClientFactory httpClientFactory, ILoggerFactory loggerFactory) { configProvider.CheckNull(nameof(configProvider)); HttpClientFactory = httpClientFactory; Config = configProvider.GetConfig(); Logger = loggerFactory.CreateLogger <WechatpayServiceBase>(); }
/// <summary> /// 初始化微信支付参数生成器 /// </summary> /// <param name="config">配置</param> public WechatpayParameterBuilder(WechatpayConfig config, HttpRequest httpRequest = null) { config.CheckNull(nameof(config)); Config = config; Builder = new ParameterBuilder(); Request = httpRequest; }
/// <summary> /// 创建签名服务 /// </summary> /// <param name="config">微信支付配置</param> /// <param name="builder">参数生成器</param> public static ISignManager Create(WechatpayConfig config, HttpRequest httpRequest, ParameterBuilder builder, WechatpaySignType?signType = null) { if (signType != null && signType == WechatpaySignType.Md5) { return(new Md5SignManager(new SignKey(config.PrivateKey), httpRequest, builder)); } if (signType != null && signType == WechatpaySignType.HmacSha256) { return(new HmacSha256SignManager(new SignKey(config.PrivateKey), httpRequest, builder)); } if (builder.GetValue(WechatpayConst.SignType)?.ToString() == WechatpaySignType.Md5.Description()) { return(new Md5SignManager(new SignKey(config.PrivateKey), httpRequest, builder)); } if (builder.GetValue(WechatpayConst.SignType)?.ToString() == WechatpaySignType.HmacSha256.Description()) { return(new HmacSha256SignManager(new SignKey(config.PrivateKey), httpRequest, builder)); } if (config.SignType == WechatpaySignType.Md5) { return(new Md5SignManager(new SignKey(config.PrivateKey), httpRequest, builder)); } if (config.SignType == WechatpaySignType.HmacSha256) { return(new HmacSha256SignManager(new SignKey(config.PrivateKey), httpRequest, builder)); } throw new NotImplementedException($"未实现签名算法:{config.SignType.Description()}"); }
/// <summary> /// 验证配置 /// </summary> /// <param name="config">配置参数</param> protected void ValidateConfig(WechatpayConfig config) { if (config.Certificate.IsEmpty()) { throw new Warning("必须设置证书"); } }
/// <summary> /// 请求结果 /// </summary> /// <param name="config">微信支付配置</param> /// <param name="builder">微信支付参数生成器</param> /// <returns></returns> protected virtual async Task <PayResult> RequestResult(WechatpayConfig config, WechatpayParameterBuilder builder) { var result = new WechatpayResult(ConfigProvider, await Request(config, builder)); WriteLog(config, builder, result); return(await CreateResult(config, builder, result)); }
public async Task Test1() { var config = new WechatpayConfig(); var request = new WechatTradeAppPayRequest { TotalFee = 100, OutTradeNo = "202007297777", Body = "产品", Detail = "产品", TimeExpire = DateTime.Now.AddDays(15).ToString("yyyyMMddHHmmss"), TradeType = WechatConstants.APP, TimeStart = DateTime.Now.ToString("yyyyMMddHHmmss"), NotifyUrl = "" }; var response = await WechatpayClient.CreateOrderAsync(request, config); if (string.IsNullOrEmpty(response.Body)) { Assert.Fail(); } else { Assert.Pass(); } }
public async Task <IActionResult> Wechatpay() { var config = new WechatpayConfig { AppId = "wxefd7e95dd1ec11ae", SignKey = "I2lgA4cnK75mHULNqAaoZ3o4SSHMAY48", MchId = "1495057202" }; var request = new WechatTradeAppPayRequest { TotalFee = 100, OutTradeNo = $"test_{DateTime.Now.ToString("yyyyMMddHHmmss")}", ProductId = $"test_{DateTime.Now.ToString("yyyyMMddHHmmss")}", Body = "产品", Detail = "产品", TimeExpire = DateTime.Now.AddHours(2).ToString("yyyyMMddHHmmss"), TradeType = WechatConstants.MWEB, TimeStart = DateTime.Now.ToString("yyyyMMddHHmmss"), NotifyUrl = "http://mobiletest.emoney.cn/mdata/payment/api/wechat/wechatnotity" }; var response = await WechatpayClient.CreateOrderAsync(request, config); var ms = Convert.FromBase64String((await GetImage(response.CodeUrl)).Replace("data:image/jpeg;base64,", "")); return(File(ms, "image/png")); }
/// <summary> /// 验证 /// </summary> /// <param name="config">微信支付配置</param> /// <param name="param">支付参数</param> protected void Validate(WechatpayConfig config, PayParam param) { config.CheckNotNull(nameof(config)); param.CheckNotNull(nameof(param)); config.Validate(); param.Validate(); ValidateParam(param); }
/// <summary> /// 注册微信支付 /// </summary> /// <param name="services"></param> /// <param name="setupAction"></param> public static void AddWechatPay(this IServiceCollection services, Action <WechatpayConfig> setupAction = null) { var wechatpayConfig = new WechatpayConfig(); setupAction?.Invoke(wechatpayConfig); services.TryAddSingleton <IWechatpayConfigProvider>(new WechatpayConfigProvider(wechatpayConfig)); services.TryAddScoped <IWechatpayNotifyService, WechatpayNotifyService>(); }
/// <summary> /// 初始化微信支付结果 /// </summary> /// <param name="configProvider">配置提供器</param> /// <param name="response">xml响应消息</param> public WechatpayResult(WechatpayConfig wechatpayConfig, string response, HttpRequest httpRequest = null) { wechatpayConfig.CheckNull(nameof(wechatpayConfig)); _wechatpayConfig = wechatpayConfig; Raw = response; Resolve(response); Request = httpRequest; }
/// <summary> /// 获取配置 /// </summary> public Task <WechatpayConfig> GetConfigAsync() { var config = new WechatpayConfig { SignType = WechatpaySignType.Md5, PrivateKey = "VVHZOaJEj44WbX0f3Lj7DHkfwEqvlURA", }; return(Task.FromResult(config)); }
/// <summary> /// 请求失败 /// </summary> private async Task <WechatpayDownloadBillResult> Fail(string response, WechatpayConfig config, WechatpayParameterBuilder builder) { var result = new WechatpayResult(ConfigProvider, response, config, builder); WriteLog(config, builder, result); var success = (await result.ValidateAsync()).IsValid; return(new WechatpayDownloadBillResult(success, result)); }
/// <summary> /// 请求结果 /// </summary> protected virtual async Task <WechatpayResult> RequstResult(WechatpayConfig config, WechatpayParameterBuilder builder) { var response = await SendRequest(config, builder); var result = new WechatpayResult(ConfigProvider, response, config, builder); WriteLog(config, builder, result); return(result); }
/// <summary> /// 验证 /// </summary> protected void Validate(WechatpayConfig config, WechatRefundRequest param) { config.CheckNull(nameof(config)); param.CheckNull(nameof(param)); config.Validate(); param.Validate(); ValidateConfig(config); ValidateParam(param); }
/// <summary> /// 请求结果 /// </summary> protected async Task <WechatpayResult <TResponse> > RequstResult <TResponse>(WechatpayConfig config, WechatpayParameterBuilder builder) where TResponse : WechatpayResponse { var result = new WechatpayResult <TResponse>(Config, await Request(config, builder)); WriteLog(config, builder, result); await ValidateResult(result); return(result); }
/// <summary> /// 获取结果 /// </summary> /// <param name="config">支付配置</param> /// <param name="builder">参数生成器</param> /// <param name="result">支付结果</param> protected string GetResult(WechatpayConfig config, WechatpayRefundParameterBuilder builder, WechatpayResult result) { return(new WechatpayParameterBuilder(config) .Add("appId", config.AppId) .Add("timeStamp", Time.GetUnixTimestamp().SafeString()) .Add("nonceStr", Id.Guid()) .Add("signType", config.SignType.Description()) .SignParamName("paySign") .ToJson()); }
/// <summary> /// 初始化微信支付结果 /// </summary> /// <param name="configProvider">配置提供器</param> /// <param name="response">xml响应消息</param> /// <param name="config">配置</param> /// <param name="parameterBuilder">参数生成器</param> public WechatpayResult(IWechatpayConfigProvider configProvider, string response, WechatpayConfig config = null, WechatpayParameterBuilder parameterBuilder = null) { configProvider.CheckNull(nameof(configProvider)); ConfigProvider = configProvider; Raw = response; Config = config; Builder = parameterBuilder; _builder = new ParameterBuilder(); Resolve(response); }
/// <summary> /// 请求结果 /// </summary> protected async Task <WechatpayDownloadBillResult> Requst(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayDownloadBillRequest request) { var response = await SendRequest(config, builder); if (response.StartsWith("交易时间")) { return(Success(response, builder, request)); } return(await Fail(response, config, builder)); }
/// <summary> /// 发送请求 /// </summary> protected async Task <string> Request(WechatpayConfig config, WechatpayParameterBuilder builder) { var client = HttpClientFactory.CreateClient("wechat"); var resonse = await Web.Client(client) .Post(GetRequestUrl(config)) .XmlData(builder.ToXml(true, builder.Get(WechatpayConst.SignType).ToWechatpaySignType())) .ResultAsync(); return(await resonse.Content.ReadAsStringAsync()); }
/// <summary> /// 创建签名服务 /// </summary> /// <param name="config">微信支付配置</param> /// <param name="builder">参数生成器</param> public static ISignManager Create(WechatpayConfig config, ParameterBuilder builder) { if (config.SignType == WechatpaySignType.Md5) { return(new Md5SignManager(new SignKey(config.PrivateKey), builder)); } // if( config.SignType == WechatpaySignType.HmacSha256 ) // return new HmacSha256SignManager( new SignKey( config.PrivateKey ), builder ); throw new NotImplementedException($"未实现签名算法:{EnumUtil.GetEnumDescription( config.SignType)}"); }
/// <summary> /// 获取结果 /// </summary> /// <param name="config">支付配置</param> /// <param name="builder">参数生成器</param> /// <param name="result">支付结果</param> protected override string GetResult(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result) { return(new WechatpayParameterBuilder(config) .Add("appId", config.AppId) .Add("timeStamp", Time.GetUnixTimestamp().SafeString()) .Add("nonceStr", Id.Guid()) .Package($"prepay_id={result.GetPrepayId()}") .Add("signType", config.SignType.Description()) .ToJson()); }
/// <summary> /// 注册阿里支付 /// </summary> /// <param name="services"></param> /// <param name="setupAction"></param> //public static void AddAliPay(this IServiceCollection services, Action<AlipayConfig> setupAction = null) //{ // var alipayConfig = new AlipayConfig(); // setupAction?.Invoke(alipayConfig); // services.TryAddSingleton<IAlipayConfigProvider>(new AlipayConfigProvider(alipayConfig)); // services.TryAddScoped<IAlipayNotifyService, AlipayNotifyService>(); // services.TryAddScoped<IAlipayReturnService, AlipayReturnService>(); // services.AddPayService(PayOriginType.AliPay); //} /// <summary> /// 注册阿里支付 /// </summary> /// <typeparam name="TAlipayConfigProvider"></typeparam> /// <param name="services"></param> //public static void AddAliPay<TAlipayConfigProvider>(this IServiceCollection services) where TAlipayConfigProvider : class, IAlipayConfigProvider //{ // services.TryAddSingleton<IAlipayConfigProvider, TAlipayConfigProvider>(); // services.TryAddScoped<IAlipayNotifyService, AlipayNotifyService>(); // services.TryAddScoped<IAlipayReturnService, AlipayReturnService>(); // services.AddPayService(PayOriginType.AliPay); //} /// <summary> /// 注册微信支付 /// </summary> /// <param name="services"></param> /// <param name="setupAction"></param> public static IServiceCollection AddWechatPay(this IServiceCollection services, Action <WechatpayConfig> setupAction = null) { var wechatpayConfig = new WechatpayConfig(); setupAction?.Invoke(wechatpayConfig); services.AddHttpClient("wechat", wechatpayConfig); services.TryAddSingleton <IWechatpayConfigProvider>(new WechatpayConfigProvider(wechatpayConfig)); services.TryAddScoped <IWechatpayNotifyService, WechatpayNotifyService>(); services.AddPayService(PayOriginType.WechatPay); return(services); }
/// <summary> /// 获取结果 /// </summary> /// <param name="config">微信支付配置</param> /// <param name="builder">微信支付参数生成器</param> /// <param name="result">微信支付结果</param> /// <returns></returns> protected override string GetResult(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result) { return(new WechatpayParameterBuilder(config) .AppId(config.AppId) .PartnerId(config.MerchantId) .Add("prepayid", result.GetPrepayId()) .Add("noncestr", Id.Guid()) .Timestamp() .Package() .ToJson()); }
/// <summary> /// 发送请求 /// </summary> /// <param name="config">微信支付配置</param> /// <param name="builder">微信支付参数生辰器</param> protected virtual async Task <string> Request(WechatpayConfig config, WechatpayParameterBuilder builder) { if (IsSend == false) { return(string.Empty); } return(await Web.Client() .Post(string.IsNullOrWhiteSpace(GetOrderUrl()) ? config.GetOrderUrl() : GetOrderUrl()) .XmlData(builder.ToXml()) .ResultAsync()); }
/// <summary> /// 写日志 /// </summary> protected virtual void WriteLog <TResponse>(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult <TResponse> result) where TResponse : WechatpayResponse { var logContent = LogContentBuilder.CreateLogContentBuilder() .SetEventId(Guid.NewGuid()).SetMoudle(GetType().FullName).SetTitle("微信支付") .AddContent($"支付方式 : {GetType()}") .AddContent($"支付网关 : {config.GetOrderUrl()}") .AddContent($"原始响应:{result?.Raw}") .Build(); Logger.LogInfo(logContent); }
/// <summary> /// 创建支付结果 /// </summary> /// <param name="config">支付配置</param> /// <param name="builder">参数生成器</param> /// <param name="result">支付结果</param> protected virtual async Task <PayResult> CreateResult(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result) { var success = (await result.ValidateAsync()).IsValid; return(new PayResult(success, result.GetPrepayId(), result.Raw) { Parameter = builder.ToString(), Message = result.GetReturnMessage(), Result = success ? GetResult(config, builder, result) : null }); }
/// <summary> /// 发送请求 /// </summary> protected virtual async Task <string> Request(WechatpayConfig config, WechatpayParameterBuilder builder) { if (IsSend == false) { return(string.Empty); } return(await Web.Client() .Post(GetRequestUrl(config)) .XmlData(builder.ToXml()) .ResultAsync()); }
/// <summary> /// 请填写正确的微信支付配置 /// </summary> public Task <WechatpayConfig> GetConfigAsync(object parameter = null) { var config = new WechatpayConfig { AppId = "", MerchantId = "", PrivateKey = "", NotifyUrl = "" }; return(Task.FromResult(config)); }
/// <summary> /// 写日志 /// </summary> protected void WriteLog(WechatpayConfig config, WechatpayParameterBuilder builder, WechatpayResult result) { Logger.Error(GetType().FullName + " 微信支付:" + $"支付方式 : {EnumUtil.GetEnumDescription(GetPayWay())}" + $"支付网关 : {config.GetOrderUrl()}" + "请求参数:" + builder.ToXml() + "返回结果:" + result.GetParams() + "原始请求:" + builder.ToString() + "原始响应: " + result.Raw ); }