/// <summary> /// 支付回调配置 /// </summary> /// <param name="logAction"></param> /// <param name="iocManager"></param> private static void PayNotifyConfig(Action <string, string> logAction, IIocManager iocManager) { void PayAction(string key, string outTradeNo, string transactionId, int totalFee, JObject data) { using (var paymentCallbackManagerObj = iocManager.ResolveAsDisposable <PaymentCallbackManager>()) { var paymentCallbackManager = paymentCallbackManagerObj?.Object; if (paymentCallbackManager == null) { throw new ApplicationException("支付回调管理器异常,无法执行回调!"); } AsyncHelper.RunSync(async() => await paymentCallbackManager.ExecuteCallback(key, outTradeNo, transactionId, totalFee, data)); } } //支付回调设置 PayNotifyBuilder .Create() //设置日志记录 .WithLoggerAction(logAction).WithPayNotifyFunc(input => { switch (input.Provider) { case "wechat": { using (var obj = iocManager.ResolveAsDisposable <WeChatPayApi>()) { var api = obj.Object; return(api.PayNotifyHandler(input.Request.Body, (output, error) => { //获取微信支付自定义数据 if (string.IsNullOrWhiteSpace(output.Attach)) { throw new UserFriendlyException("自定义参数不允许为空!"); } var data = JsonConvert.DeserializeObject <JObject>(output.Attach); var key = data["key"]?.ToString(); var outTradeNo = output.OutTradeNo; var totalFee = int.Parse(output.TotalFee); PayAction(key, outTradeNo, output.TransactionId, totalFee, data); })); } } case "alipay": { using (var obj = iocManager.ResolveAsDisposable <IAlipayAppService>()) { var api = obj.Object; var dictionary = input.Request.Form.ToDictionary(p => p.Key, p2 => p2.Value.FirstOrDefault()?.ToString()); //签名校验 if (!api.PayNotifyHandler(dictionary)) { throw new UserFriendlyException("支付宝支付签名错误!"); } var outTradeNo = input.Request.Form["out_trade_no"]; var tradeNo = input.Request.Form["trade_no"]; var charset = input.Request.Form["charset"]; var totalFee = (int)(decimal.Parse(input.Request.Form["total_fee"]) * 100); var businessParams = input.Request.Form["business_params"]; if (string.IsNullOrWhiteSpace(businessParams)) { throw new UserFriendlyException("自定义参数不允许为空!"); } var data = JsonConvert.DeserializeObject <JObject>(businessParams); var key = data["key"]?.ToString(); PayAction(key, outTradeNo, tradeNo, totalFee, data); return(Task.FromResult("success")); } } //国际支付宝 case "global.alipay": { using (var obj = iocManager.ResolveAsDisposable <IGlobalAlipayAppService>()) { var api = obj.Object; var dictionary = input.Request.Form.ToDictionary(p => p.Key, p2 => p2.Value.FirstOrDefault()?.ToString()); //签名校验 if (!api.PayNotifyHandler(dictionary)) { throw new UserFriendlyException("支付宝支付签名错误!"); } var outTradeNo = input.Request.Form["out_trade_no"]; var tradeNo = input.Request.Form["trade_no"]; var charset = input.Request.Form["charset"]; var totalFee = (int)(Convert.ToDecimal(input.Request.Form["total_fee"]) * 100); //交易状态 string tradeStatus = input.Request.Form["trade_status"]; using (var transactionLogHelperObj = iocManager.ResolveAsDisposable <TransactionLogHelper>()) { var customData = transactionLogHelperObj.Object.GetCustomDataByOutTradeNo(outTradeNo); if (string.IsNullOrWhiteSpace(customData)) { throw new UserFriendlyException("自定义参数不允许为空!"); } var data = JsonConvert.DeserializeObject <JObject>(customData); var key = data["key"]?.ToString(); PayAction(key, outTradeNo, tradeNo, totalFee, data); } return(Task.FromResult("success")); } } default: break; } return(null); }).Build(); }