Example #1
0
 internal virtual void Execute(Merchant merchant)
 {
     if (!string.IsNullOrEmpty(NotifyUrl))
     {
         GatewayData.Add("notify_url", NotifyUrl);
     }
 }
Example #2
0
        /// <summary>
        /// 备份并清除网关的参数
        /// </summary>
        private GatewayData BackupAndClearGatewayData()
        {
            GatewayData gatewayData = GatewayData;

            GatewayData.Clear();
            return(gatewayData);
        }
Example #3
0
        internal static TResponse Execute <TModel, TResponse>(Merchant merchant, Request <TModel, TResponse> request, string gatewayUrl = null) where TResponse : IResponse
        {
            AddMerchant(merchant, request, gatewayUrl);

            string result = null;

            Task.Run(async() =>
            {
                result = await HttpUtil
                         .PostAsync(request.RequestUrl, request.GatewayData.ToUrl());
            })
            .GetAwaiter()
            .GetResult();

            var gatewayData = new GatewayData(StringComparer.Ordinal);

            gatewayData.FromUrl(result, false);

            var baseResponse = (BaseResponse)(object)gatewayData.ToObject <TResponse>(StringCase.Camel);

            baseResponse.Raw = result;

            var sign = gatewayData.GetStringValue("signature");

            if (!string.IsNullOrEmpty(sign) && !CheckSign(gatewayData, sign, baseResponse.SignPubKeyCert))
            {
                throw new GatewayException("签名验证失败");
            }

            baseResponse.Sign = sign;
            baseResponse.Execute(merchant, request);

            return((TResponse)(object)baseResponse);
        }
Example #4
0
 protected override void WriteSuccessFlag()
 {
     GatewayData.Clear();
     GatewayData.Add("return_code", "SUCCESS");
     GatewayData.Add("return_msg", "OK");
     HttpUtil.Write(GatewayData.ToXml());
 }
Example #5
0
        /// <summary>
        /// 初始化辅助接口的参数
        /// </summary>
        /// <param name="gatewayAuxiliaryType">辅助类型</param>
        /// <param name="auxiliary">辅助参数</param>
        private void InitAuxiliaryParameter(GatewayAuxiliaryType gatewayAuxiliaryType, IAuxiliary auxiliary)
        {
            auxiliary.Validate(gatewayAuxiliaryType);
            switch (gatewayAuxiliaryType)
            {
            case GatewayAuxiliaryType.Query:
                Merchant.Method = Constant.QUERY;
                break;

            case GatewayAuxiliaryType.Close:
                Merchant.Method = Constant.CLOSE;
                break;

            case GatewayAuxiliaryType.Cancel:
                Merchant.Method = Constant.CANCEL;
                break;

            case GatewayAuxiliaryType.Refund:
                Merchant.Method = Constant.REFUND;
                break;

            case GatewayAuxiliaryType.RefundQuery:
                Merchant.Method = Constant.REFUNDQUERY;
                break;

            default:
                break;
            }
            Merchant.BizContent = Util.SerializeObject((Auxiliary)auxiliary);
            GatewayData.Add(Merchant);
            BuildSign();
        }
Example #6
0
 /// <summary>
 /// 当接收到支付网关通知并验证无误时按照支付网关要求格式输出表示成功接收到网关通知的字符串
 /// </summary>
 protected override string GetSuccessFlag()
 {
     GatewayData.Clear();
     GatewayData.Add("return_code", "SUCCESS");
     GatewayData.Add("return_msg", "OK");
     return(GatewayData.ToXml());
 }
Example #7
0
 public void InitBillDownload(IAuxiliary auxiliary)
 {
     Merchant.Method     = Constant.BILLDOWNLOAD;
     Merchant.BizContent = Util.SerializeObject((Auxiliary)auxiliary);
     GatewayData.Add(Merchant);
     BuildSign();
 }
Example #8
0
        /// <summary>
        /// 读取网关发回的数据
        /// </summary>
        /// <returns></returns>
        public static GatewayData ReadNotifyData()
        {
            var gatewayData = new GatewayData();

            if (IsGetRequest)
            {
                gatewayData.FromUrl(AcbHttpContext.QueryString);
            }
            else
            {
                if (IsXmlData)
                {
                    var    reader  = new StreamReader(AcbHttpContext.Body);
                    string xmlData = reader.ReadToEnd();
                    reader.Dispose();
                    gatewayData.FromXml(xmlData);
                }
                else
                {
                    try
                    {
                        gatewayData.FromForm(AcbHttpContext.Form);
                    }
                    catch { }
                }
            }

            return(gatewayData);
        }
Example #9
0
        internal override void Execute(Merchant merchant)
        {
            if (string.IsNullOrEmpty(merchant.PublicKey))
            {
                throw new GatewayException("请设置商户公钥");
            }

            if (_rSACryptoServiceProvider == null)
            {
                var rsaPubStructure = RsaPublicKeyStructure.GetInstance(
                    Asn1Object.FromByteArray(Convert.FromBase64String(merchant.PublicKey)));
                var rSAParameters = new RSAParameters()
                {
                    Exponent = rsaPubStructure.PublicExponent.ToByteArrayUnsigned(),
                    Modulus  = rsaPubStructure.Modulus.ToByteArrayUnsigned()
                };
                _rSACryptoServiceProvider = new RSACryptoServiceProvider();
                _rSACryptoServiceProvider.ImportParameters(rSAParameters);
            }

            GatewayData.Add("enc_bank_no", Convert.ToBase64String(
                                _rSACryptoServiceProvider.Encrypt(Encoding.UTF8.GetBytes(Model.BankNo), false)));
            GatewayData.Add("enc_true_name", Convert.ToBase64String(
                                _rSACryptoServiceProvider.Encrypt(Encoding.UTF8.GetBytes(Model.TrueName), false)));
            GatewayData.Remove("notify_url");
            GatewayData.Remove("appid");
            GatewayData.Remove("sign_type");
        }
        // Business transaction
        public async Task RegisterNewGatewayWithControllerAsync(GatewayData gatewayData, ControllerData controllerData)
        {
            this.CheckConditions(gatewayData, controllerData);

            using (IUnitOfWork uow = new UnitOfWork())
            {
                var gatewayRepository        = uow.Factory.GetGatewayRepository();
                var controllerRepository     = uow.Factory.GetControllerRepository();
                var controllerTypeRepository = uow.Factory.GetControllerTypeRespository();

                Gateway gateway = new Gateway()
                {
                    Name    = gatewayData.Name,
                    Serial  = gatewayData.Serial,
                    Address = gatewayData.Address
                };

                var controller = await this.CreateControllerAsync(controllerData, controllerTypeRepository);

                gateway.AddController(controller);

                gateway.Activate();

                gatewayRepository.Add(gateway);

                controllerRepository.Add(controller);

                await uow.SaveAsync();
            }
        }
Example #11
0
        internal static TResponse AuthExecute <TModel, TResponse>(Merchant merchant, Request <TModel, TResponse> request, string gatewayUrl = null) where TResponse : IResponse
        {
            AddMerchant(merchant, request, gatewayUrl);

            string result = null;

            Task.Run(async() =>
            {
                result = await HttpUtil
                         .GetAsync($"{request.RequestUrl}?{request.GatewayData.ToUrl()}");
            })
            .GetAwaiter()
            .GetResult();

            var gatewayData = new GatewayData();

            gatewayData.FromJson(result);

            var baseResponse = (OAuthResponse)(object)gatewayData.ToObject <TResponse>(StringCase.Snake);

            baseResponse.Raw         = result;
            baseResponse.GatewayData = gatewayData;

            return((TResponse)(object)baseResponse);
        }
Example #12
0
 /// <summary>
 /// 初始化查询订单参数
 /// </summary>
 private void InitQueryOrderParameter()
 {
     GatewayData.Add(Constant.MCH_ID, Merchant.MchId);
     GatewayData.Add(Constant.OUT_TRADE_NO, Order.OutTradeNo);
     GatewayData.Add(Constant.NONCE_STR, Merchant.NonceStr);
     GatewayData.Add(Constant.SIGN, BuildSign());
 }
Example #13
0
        internal static TResponse Execute <TModel, TResponse>(Merchant merchant, Request <TModel, TResponse> request, string gatewayUrl = null) where TResponse : IResponse
        {
            AddMerchant(merchant, request, gatewayUrl);

            var sign = BuildSign(request.GatewayData, merchant.Key);

            request.GatewayData.Add("sign", sign);

            var result = HttpUtil.Post(request.RequestUrl, request.GatewayData.ToUrl());

            var gatewayData = new GatewayData();

            gatewayData.FromJson(result);

            var baseResponse = (BaseResponse)(object)gatewayData.ToObject <TResponse>(StringCase.Lower);

            baseResponse.Raw         = result;
            baseResponse.GatewayData = gatewayData;
            if (baseResponse.ReturnCode == "SUCCESS")
            {
                sign = gatewayData.GetStringValue("sign");

                if (!string.IsNullOrEmpty(sign) && !CheckSign(gatewayData, merchant.Key, sign))
                {
                    throw new GatewayException("签名验证失败");
                }

                baseResponse.Execute(merchant, request);
            }

            return((TResponse)(object)baseResponse);
        }
Example #14
0
        internal static string BuildSign(GatewayData gatewayData, string key, bool isHMACSHA256 = false)
        {
            gatewayData.Remove("sign");

            string data = $"{gatewayData.ToUrl(false)}&key={key}";

            return(isHMACSHA256 ? EncryptUtil.HMACSHA256(data, key) : EncryptUtil.MD5(data));
        }
Example #15
0
        internal static string BuildSign(GatewayData gatewayData, string key)
        {
            gatewayData.Remove("sign");

            string data = $"{gatewayData.ToUrl(false)}&key={key}";

            return(EncryptUtil.MD5(data));
        }
Example #16
0
 private string QueryOrder()
 {
     InitQueryOrderParameter();
     return(HttpUtil
            .PostAsync(queryGatewayUrl, GatewayData.ToXml())
            .GetAwaiter()
            .GetResult());
 }
Example #17
0
        /// <summary>
        /// 初始化订单参数
        /// </summary>
        private void InitOrderParameter()
        {
            Merchant.BizContent = Util.SerializeObject(Order);
            GatewayData.Add(Merchant);
            BuildSign();

            ValidateParameter(Merchant);
            ValidateParameter(Order);
        }
Example #18
0
        /// <summary>
        /// 提交请求
        /// </summary>
        /// <param name="type">结果类型</param>
        private void Commit(string type)
        {
            string result = HttpUtil
                            .PostAsync(GatewayUrl, GatewayData.ToUrlEncode())
                            .GetAwaiter()
                            .GetResult();

            ReadReturnResult(result, type);
        }
        public GatewayData ModifyGateway(GatewayData gateway, CustomizationContextData context)
        {
            Tracer.TraceInfo("Resource SDK: Launch customization point: HDX Routing, gateway");
            GatewayData finalValue = gateway;

            //// TODO: Insert your code here.

            return(finalValue);
        }
Example #20
0
 /// <summary>
 /// 初始化辅助参数
 /// </summary>
 /// <param name="gatewayAuxiliaryType">辅助类型</param>
 /// <param name="auxiliary">辅助参数</param>
 private void InitAuxiliaryParameter(GatewayAuxiliaryType gatewayAuxiliaryType, IAuxiliary auxiliary)
 {
     auxiliary.Validate(gatewayAuxiliaryType);
     Merchant.NonceStr = Util.GenerateNonceStr();
     GatewayData.Add(Merchant);
     GatewayData.Add(auxiliary);
     Merchant.Sign = BuildSign();
     GatewayData.Add(Constant.SIGN, Merchant.Sign);
 }
Example #21
0
        internal static TResponse Execute <TModel, TResponse>(Merchant merchant, Request <TModel, TResponse> request, string gatewayUrl = null) where TResponse : IResponse
        {
            AddMerchant(merchant, request, gatewayUrl);

            var sign = BuildSign(request.GatewayData, merchant.Key, request.GatewayData.GetStringValue("sign_type") == "HMAC-SHA256");

            request.GatewayData.Add("sign", sign);

            X509Certificate2 cert = null;

            if (((BaseRequest <TModel, TResponse>)request).IsUseCert)
            {
                cert = new X509Certificate2(merchant.SslCertPath, merchant.SslCertPassword, X509KeyStorageFlags.MachineKeySet);
            }

            string result = null;

            Task.Run(async() =>
            {
                result = await HttpUtil
                         .PostAsync(request.RequestUrl, request.GatewayData.ToXml(), cert);
            })
            .GetAwaiter()
            .GetResult();

            BaseResponse baseResponse;

            if (!(request is BillDownloadRequest || request is FundFlowDownloadRequest))
            {
                var gatewayData = new GatewayData();
                gatewayData.FromXml(result);

                baseResponse             = (BaseResponse)(object)gatewayData.ToObject <TResponse>(StringCase.Snake);
                baseResponse.Raw         = result;
                baseResponse.GatewayData = gatewayData;
                if (baseResponse.ReturnCode == "SUCCESS")
                {
                    sign = gatewayData.GetStringValue("sign");

                    if (!string.IsNullOrEmpty(sign) && !CheckSign(gatewayData, merchant.Key, sign))
                    {
                        throw new GatewayException("签名验证失败");
                    }

                    baseResponse.Sign = sign;
                    baseResponse.Execute(merchant, request);
                }
            }
            else
            {
                baseResponse     = (BaseResponse)Activator.CreateInstance(typeof(TResponse));
                baseResponse.Raw = result;
                baseResponse.Execute(merchant, request);
            }

            return((TResponse)(object)baseResponse);
        }
Example #22
0
        /// <summary>
        /// 统一下单
        /// </summary>
        /// <returns></returns>
        private void UnifiedOrder()
        {
            InitOrderParameter();
            string result = HttpUtil
                            .PostAsync(GatewayUrl, GatewayData.ToXml())
                            .GetAwaiter()
                            .GetResult();

            ReadReturnResult(result);
        }
Example #23
0
        /// <summary>
        /// 验证订单金额、订单号是否与之前的通知的金额、订单号相符
        /// </summary>
        /// <returns></returns>
        private bool ValidateOrder()
        {
            if (Order.Amount == GatewayData.GetDoubleValue("total_fee") * 0.01 &&
                string.Compare(Order.OutTradeNo, GatewayData.GetStringValue("out_trade_no")) == 0)
            {
                return(true);
            }

            return(false);
        }
Example #24
0
        protected override void SupplementaryWapParameter()
        {
            if (!string.IsNullOrEmpty(Merchant.ReturnUrl))
            {
                GatewayData.Add(Constant.RETURN_URL, Merchant.ReturnUrl);
            }

            Merchant.Method   = Constant.WAP;
            Order.ProductCode = Constant.QUICK_WAP_WAY;
        }
Example #25
0
        protected override void SupplementaryWebParameter()
        {
            if (!string.IsNullOrEmpty(Merchant.ReturnUrl))
            {
                GatewayData.Add(Constant.RETURN_URL, Merchant.ReturnUrl);
            }

            Merchant.Method   = Constant.WEB;
            Order.ProductCode = Constant.FAST_INSTANT_TRADE_PAY;
        }
Example #26
0
        protected override void SupplementaryScanParameter()
        {
            if (!string.IsNullOrEmpty(Merchant.AppAuthToken))
            {
                GatewayData.Add(Constant.APP_AUTH_TOKEN, Merchant.AppAuthToken);
            }

            Merchant.Method   = Constant.SCAN;
            Order.ProductCode = Constant.FACE_TO_FACE_PAYMENT;
        }
Example #27
0
        /// <summary>
        /// 读取返回结果
        /// </summary>
        /// <param name="result">结果</param>
        /// <param name="key">结果的对象名</param>
        private void ReadReturnResult(string result, string key)
        {
            GatewayData.FromJson(result);
            string sign = GatewayData.GetStringValue(Constant.SIGN);

            result = GatewayData.GetStringValue(key);
            GatewayData.FromJson(result);
            base.Notify = GatewayData.ToObject <Notify>();
            Notify.Sign = sign;
        }
Example #28
0
        public FileStream BuildBillDownload(IAuxiliary auxiliary)
        {
            InitBillDownload(auxiliary);

            Commit();

            string result = GatewayData.GetDefaultResult();

            return(CreateCsv(result));
        }
Example #29
0
        internal override void Execute(Merchant merchant)
        {
            GatewayData.Add("mch_appid", merchant.AppId);
            GatewayData.Add("mchid", merchant.MchId);

            GatewayData.Remove("appid");
            GatewayData.Remove("mch_id");
            GatewayData.Remove("notify_url");
            GatewayData.Remove("sign_type");
        }
Example #30
0
        /// <summary>
        /// 获得微信支付的URL
        /// </summary>
        /// <param name="resultXml">创建订单返回的数据</param>
        /// <returns></returns>
        private string GetWeixinPaymentUrl(string resultXml)
        {
            GatewayData.FromXml(resultXml);
            if (IsSuccessResult())
            {
                return(GatewayData.GetStringValue(Constant.CODE_URL));
            }

            return(string.Empty);
        }