示例#1
0
        public string GetSignInfo(string subject, string body, string notifyUrl, PayLog payLog, Payment payment, Dictionary <string, string> param = null)
        {
            if (body.Length > 512)
            {
                body = body.Substring(0, 500) + "...";
            }

            var alipayConfig = _configService.Get <AlipayConfig>();

            var config = new AlipayConfig2
            {
                Partner  = alipayConfig.Partner,
                SellerId = alipayConfig.SellerId,
                Md5Key   = alipayConfig.MD5Key,
                SignType = SignType.MD5
            };

            var paras = new SortedDictionary <string, string>();

            paras.Add("partner", config.Partner);
            paras.Add("seller_id", config.SellerId);
            paras.Add("out_trade_no", payLog.TransactionNo);
            paras.Add("subject", subject);
            paras.Add("body", body);
            paras.Add("total_fee", payLog.OrderAmount.ToString());
            paras.Add("notify_url", notifyUrl);
            paras.Add("service", "mobile.securitypay.pay");
            paras.Add("payment_type", "1");
            paras.Add("_input_charset", "utf-8");
            paras.Add("it_b_pay", "30m");

            var sPara = new Submit(config).BuildRequestPara(paras);

            return(Core.CreateLinkStringUrlencode(sPara, Encoding.UTF8));
        }
示例#2
0
        public string Transfer(List <CrashApply> applys, Payment payment, string notifyUrl)
        {
            //服务器异步通知页面路径
            var alipayConfig = _configService.Get <AlipayConfig>();
            var config       = new AlipayConfig2
            {
                Partner  = alipayConfig.Partner,
                SellerId = alipayConfig.SellerId,
                Md5Key   = alipayConfig.MD5Key,
                SignType = SignType.MD5
            };

            string  detailData = string.Empty;
            decimal amount     = 0;

            foreach (var apply in applys)
            {
                if (apply.ApplyState != ApplyState.ApplyPassed)
                {
                    Logger.Operation($"提现转账失败,扣除冻结金额处理失败,TransactionNo:{apply.TransactionNo},原因:提现转账申请状态不合法", PaymentProcessModule.Instance, Security.SecurityLevel.Danger);
                    continue;
                }
                detailData      += $"{apply.TransactionNo}^{apply.Account}^{apply.RealName}^{ apply.Money}^提现|";
                amount          += apply.Money;
                apply.ApplyState = ApplyState.Transfering;
                _currencyService.Update(apply);
            }
            detailData = detailData.Trim('|');

            var paras = new Dictionary <string, object>();

            paras.Add("detail_data", detailData);
            paras.Add("batch_fee", amount);
            paras.Add("batch_num", applys.Count);

            //把请求参数打包成数组
            SortedDictionary <string, string> sParaTemp = new SortedDictionary <string, string>();

            sParaTemp.Add("partner", config.Partner);
            sParaTemp.Add("_input_charset", "utf-8");
            sParaTemp.Add("service", "batch_trans_notify");
            sParaTemp.Add("notify_url", notifyUrl);
            sParaTemp.Add("email", config.SellerId);
            sParaTemp.Add("account_name", alipayConfig.AccountName);
            sParaTemp.Add("pay_date", DateTime.Now.ToString("yyyyMMdd"));
            sParaTemp.Add("batch_no", KeyGenerator.GetOrderNumber());
            sParaTemp.Add("batch_fee", paras["batch_fee"].ToString());
            sParaTemp.Add("batch_num", paras["batch_num"].ToString());
            sParaTemp.Add("detail_data", paras["detail_data"].ToString());

            //建立请求
            string sHtmlText = new Submit(config).BuildRequest(sParaTemp, "get", "确认");

            return(sHtmlText);
        }
示例#3
0
        public string H5Pay(string subject, string body, string notifyUrl, string returnUrl, PayLog payLog, Payment payment, Dictionary <string, string> param = null)
        {
            var alipayConfig = _configService.Get <AlipayConfig>();

            var config = new AlipayConfig2
            {
                Partner  = alipayConfig.Partner,
                SellerId = alipayConfig.SellerId,
                Md5Key   = alipayConfig.MD5Key,
                SignType = SignType.MD5
            };

            ////////////////////////////////////////////////////////////////////////////////////////////////

            if (body.Length > 512)
            {
                body = body.Substring(0, 500) + "...";
            }
            //把请求参数打包成数组
            SortedDictionary <string, string> sParaTemp = new SortedDictionary <string, string>();

            sParaTemp.Add("partner", config.Partner);
            sParaTemp.Add("seller_id", config.SellerId);
            sParaTemp.Add("_input_charset", "utf-8");
            sParaTemp.Add("service", "alipay.wap.create.direct.pay.by.user");
            sParaTemp.Add("payment_type", "1");
            sParaTemp.Add("notify_url", notifyUrl);
            sParaTemp.Add("return_url", returnUrl);
            sParaTemp.Add("out_trade_no", payLog.TransactionNo);
            sParaTemp.Add("subject", subject);
            sParaTemp.Add("total_fee", payLog.OrderAmount.ToString());
            sParaTemp.Add("show_url", "");
            sParaTemp.Add("app_pay", "Y");//启用此参数可唤起钱包APP支付。
            sParaTemp.Add("body", body);
            //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.2Z6TSk&treeId=60&articleId=103693&docType=1
            //如sParaTemp.Add("参数名","参数值");

            //建立请求
            return(new Submit(config).BuildRequest(sParaTemp, "get", "确认"));
        }
示例#4
0
        public string SyncReturn(HttpRequestBase request)
        {
            Logger.Warning("进入支付宝支付成功同步通知");

            var payment      = _paymentService.LoadPayment(PaymentType.Alipay.ToString());
            var alipayConfig = _configService.Get <AlipayConfig>();

            var config = new AlipayConfig2
            {
                Partner  = alipayConfig.Partner,
                SellerId = alipayConfig.SellerId,
                Md5Key   = alipayConfig.MD5Key,
                SignType = SignType.MD5
            };

            SortedDictionary <string, string> sPara = GetRequestPostByKey(request);

            Logger.Warning("支付同步返回签名参数:" + Core.CreateLinkString(sPara));
            if (sPara.Count > 0)//判断是否有带返回参数
            {
                Notify aliNotify    = new Notify(config);
                string sign         = Core.GetSign(sPara);
                bool   verifyResult = aliNotify.GetSignVeryfy(sPara, Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sign)));

                if (verifyResult)//验证成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //请在这里加上商户的业务逻辑程序代码


                    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
                    //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

                    //商户订单号
                    string out_trade_no = request.QueryString["out_trade_no"];

                    //支付宝交易号
                    string trade_no = request.QueryString["trade_no"];

                    //交易状态
                    string trade_status = request.QueryString["trade_status"];

                    Logger.Warning("正在同步操作商户订单号:" + out_trade_no);
                    string returnString = "";
                    if (request.QueryString["trade_status"] == "TRADE_FINISHED" || request.QueryString["trade_status"] == "TRADE_SUCCESS")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                        //如果有做过处理,不执行商户的业务程序

                        PayLog payLog =
                            _currencyService.GetSingleByConditon <PayLog>(o => o.TransactionNo == out_trade_no);
                        payLog.PayTime   = DateTime.Now;
                        payLog.LogStatus = LogStatus.Paid;
                        if (payLog != null && payLog.LogStatus != LogStatus.Paid)
                        {
                            _currencyService.Update <PayLog>(payLog);
                            Order order = _currencyService.GetSingleByConditon <Order>(o => o.Id == payLog.OrderId);
                            order.PayStatus   = PayStatus.Paid;
                            order.PayTime     = DateTime.Now;
                            order.PaymentId   = payment.Id;
                            order.PaymentName = payment.Name;
                            order.OrderStatus = OrderStatus.WaitingForDelivery;
                            _orderService.ChangeOrderStatus(order.Id, order.OrderStatus, order.PayStatus);
                            _currencyService.Update <Order>(order);

                            OrderGoods orderGoods =
                                _currencyService.GetSingleByConditon <OrderGoods>(o => o.OrderId == order.Id);
                            if (orderGoods != null)
                            {
                                var dicParams = new Dictionary <string, string>();
                                dicParams.Add("messagetype", "3");
                            }
                        }
                    }
                    else
                    {
                        returnString = "trade_status=" + request.QueryString["trade_status"];
                    }

                    //打印页面
                    returnString += "验证成功<br />";
                    return(returnString);

                    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    Logger.Warning("验证失败");
                    return("验证失败");
                }
            }
            else
            {
                Logger.Warning("无返回参数");
                return("无返回参数");
            }
        }
示例#5
0
        public string AsyncReturn(HttpRequestBase request)
        {
            var payment      = _paymentService.LoadPayment(PaymentType.Alipay.ToString());
            var alipayConfig = _configService.Get <AlipayConfig>();

            var config = new AlipayConfig2
            {
                Partner  = alipayConfig.Partner,
                SellerId = alipayConfig.SellerId,
                Md5Key   = alipayConfig.MD5Key,
                SignType = SignType.MD5
            };

            SortedDictionary <string, string> sPara = GetRequestPost(request);

            if (sPara.Count > 0)//判断是否有带返回参数
            {
                var  aliNotify    = new Notify(config);
                bool verifyResult = aliNotify.Verify(sPara, request.Form["notify_id"], request.Form["sign"]);

                if (verifyResult)//验证成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //请在这里加上商户的业务逻辑程序代码


                    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
                    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

                    //商户订单号
                    string out_trade_no = request.Form["out_trade_no"];
                    //支付宝交易号
                    string trade_no = request.Form["trade_no"];

                    //交易状态
                    string trade_status = request.Form["trade_status"];

                    Logger.Warning("正在异步操作商户订单号:" + out_trade_no);
                    if (trade_status == "TRADE_FINISHED" || trade_status == "TRADE_SUCCESS")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                        //如果有做过处理,不执行商户的业务程序
                        PayLog payLog =
                            _currencyService.GetSingleByConditon <PayLog>(o => o.TransactionNo == out_trade_no);
                        if (payLog != null && payLog.LogStatus == LogStatus.Unpaid)
                        {
                            payLog.PayTime   = DateTime.Now;
                            payLog.LogStatus = LogStatus.Paid;
                            _currencyService.Update <PayLog>(payLog);
                            Order order = _currencyService.GetSingleByConditon <Order>(o => o.Id == payLog.OrderId);
                            order.PayStatus   = PayStatus.Paid;
                            order.PayTime     = DateTime.Now;
                            order.PaymentId   = payment.Id;
                            order.PaymentName = payment.Name;
                            order.OrderStatus = OrderStatus.WaitingForDelivery;
                            _orderService.ChangeOrderStatus(order.Id, order.OrderStatus, order.PayStatus);
                            _currencyService.Update <Order>(order);
                        }
                        //注意:
                        //付款完成后,支付宝系统发送该交易状态通知
                    }
                    else
                    {
                        Logger.Warning("支付宝异步回调操作异常,回调数据:" + trade_status);
                        return("fail");
                    }

                    return("success");  //请不要修改或删除

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    Logger.Warning("fail");
                    return("fail");
                }
            }
            else
            {
                Logger.Warning("无通知参数");
                return("无通知参数");
            }
        }
示例#6
0
        /// <summary>
        /// 异步返回结果
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public string AsyncReturn(HttpRequestBase request)
        {
            Logger.Debug("支付宝批量转账回调");

            var alipayConfig = _configService.Get <AlipayConfig>();
            var config       = new AlipayConfig2
            {
                Partner  = alipayConfig.Partner,
                SellerId = alipayConfig.SellerId,
                Md5Key   = alipayConfig.MD5Key,
                SignType = SignType.MD5
            };

            SortedDictionary <string, string> sPara = GetRequestPost(request);

            Logger.Debug(sPara.ToJson());

            if (sPara.Count > 0)//判断是否有带返回参数
            {
                Notify aliNotify    = new Notify(config);
                bool   verifyResult = aliNotify.Verify(sPara, request.Form["notify_id"], request.Form["sign"]);

                if (verifyResult)//验证成功
                {
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //请在这里加上商户的业务逻辑程序代码


                    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
                    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

                    //批量付款数据中转账成功的详细信息

                    string successDetails = request.Form["success_details"];
                    Logger.Debug($"支付宝批量转账回调成功数据{successDetails}");
                    if (!string.IsNullOrEmpty(successDetails))
                    {
                        var detaildata = successDetails.Split('|');
                        if (detaildata.Length > 0)
                        {
                            foreach (var detail in detaildata)
                            {
                                using (TransactionScope scope = new TransactionScope())
                                {
                                    //其他操作
                                    var        crash      = detail.Split('^').FirstOrDefault();
                                    CrashApply crashApply =
                                        _currencyService.GetSingleByConditon <CrashApply>(c => c.TransactionNo == crash);
                                    if (crashApply != null)
                                    {
                                        crashApply.ApplyState   = ApplyState.Transferred;
                                        crashApply.TransferTime = DateTime.Now;
                                        crashApply.Description  = "支付宝提现成功";
                                        _currencyService.Update(crashApply);
                                        string error;
                                        if (!_walletService.Draw(crashApply.MemberId, WalletType.Cash, crashApply.Money, "提现支出", out error, null, null, true))
                                        {
                                            Logger.Operation($"提现转账成功,扣除冻结金额处理失败,TransactionNo:{crashApply.TransactionNo},原因:{error}", PaymentProcessModule.Instance, Security.SecurityLevel.Danger);
                                        }

                                        _systemMessageService.CreatePushSystemMessage("提现打款", "您申请的提现已打款,请注意查收", "您申请的提现已打款,请注意查收", crashApply.MemberId, null, null, "CrashApply", WalletModule.Key, MessageCategory.Personal);
                                        //提交
                                        scope.Complete();
                                    }
                                }
                            }
                        }
                    }
                    //批量付款数据中转账失败的详细信息
                    string failDetails = request.Form["fail_details"];
                    Logger.Debug($"支付宝批量转账回调失败数据{failDetails}");
                    if (!string.IsNullOrEmpty(failDetails))
                    {
                        var faildata = failDetails.Split('|');
                        if (faildata.Length > 0)
                        {
                            foreach (var detail in faildata)
                            {
                                using (TransactionScope scope = new TransactionScope())
                                {
                                    var        crash       = detail.Split('^').FirstOrDefault();
                                    var        description = detail.Split('^');
                                    CrashApply crashApply  =
                                        _currencyService.GetSingleByConditon <CrashApply>(c => c.TransactionNo == crash);
                                    if (crashApply != null)
                                    {
                                        crashApply.ApplyState  = ApplyState.Failure;
                                        crashApply.Description = description[5];
                                        _currencyService.Update(crashApply);

                                        string error;
                                        if (!_walletService.Thaw(crashApply.MemberId, WalletType.Cash, crashApply.Money, "提现失败,解除冻结", out error))
                                        {
                                            Logger.Operation($"提现转账失败,退还金额处理失败,TransactionNo:{crashApply.TransactionNo},原因:{error}", PaymentProcessModule.Instance, Security.SecurityLevel.Danger);
                                        }
                                        //提交
                                        scope.Complete();
                                    }
                                }
                            }
                        }
                    }

                    //判断是否在商户网站中已经做过了这次通知返回的处理
                    //如果没有做过处理,那么执行商户的业务程序
                    //如果有做过处理,那么不执行商户的业务程序

                    return("success");  //请不要修改或删除

                    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    Logger.Information("提现支付宝回调处理失败,数据验证失败");
                    return("fail");
                }
            }
            else
            {
                Logger.Information("无通知参数");
                return("无通知参数");
            }
        }