Ejemplo n.º 1
0
        /// <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();
        }