.Net Core对接支付宝直付通

支付宝官方文档:互联网平台直付通产品介绍 | 网页&移动应用

支付宝客服(聊天窗口相比下比较大):https://opensupport.alipay.com/support/home.htm

1.先下载官方SDK(概述 | 网页&移动应用

2.提前准备

.NET 开发语言必须使用 pkcs1 格式私钥

 3.写一个静态类,用来配置基础数据

internal class AliClients
    {

        public static class Sandbox
        {
            public static AlipayConfig GetConfig()
            {
                AlipayConfig config = new AlipayConfig();
                config.ServerUrl = AppConfigurtaionHelper.Configuration["AliInfoSettings:Gate_Way_Url"];
                config.AppId = AppConfigurtaionHelper.Configuration["AliInfoSettings:SP_APPID"];
                config.PrivateKey = AppConfigurtaionHelper.Configuration["AliInfoSettings:PrivateKey_PKCS1"];
                //config.AlipayPublicKey = AppConfigurtaionHelper.Configuration["AliInfoSettings:PubilcKey"];
                config.AlipayPublicCertPath = AppConfigurtaionHelper.Configuration["AliInfoSettings:Alipay_Cert_Path"];//支付宝公钥证书路径
                config.AppCertPath = AppConfigurtaionHelper.Configuration["AliInfoSettings:App_Cert_Path"];//商户应用证书路径
                config.RootCertPath = AppConfigurtaionHelper.Configuration["AliInfoSettings:Root_Cert_Path"];//支付宝根证书路径

                //config.EncryptKey = "RrAdgyCsnkoE1a9A8cW72w==";
                return config;
            }
        }


    }

4. App支付

    IAopClient client = new DefaultAopClient(AliClients.Sandbox.GetConfig());
                    AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
                    request.SetNotifyUrl(systemSettings.Url+ aliInfoSettings.PaymentnotifyUrl);//异步返回地址

                  

                    Dictionary<string, object> bizContent = new Dictionary<string, object>();
                    bizContent.Add("out_trade_no", tranInfo.TranscationId.ToString()); //商户网站唯一订单号。
                    bizContent.Add("total_amount", tranInfo.Amount.ToString());
                    bizContent.Add("subject", model.Subject);//订单标题。
                    bizContent.Add("body", model.Description);//订单附加信息
                    bizContent.Add("product_code", "QUICK_MSECURITY_PAY");



                    ///二级商户信息
                    Dictionary<string, object> sub = new Dictionary<string, object>();
                    sub.Add("merchant_id", merInfo.ShId);//支付宝商户编号
                    bizContent.Add("sub_merchant", sub);

                    //结算信信息

                    Dictionary<string, List<settle_detail_infos>> sList = new Dictionary<string, List<settle_detail_infos>>();
                    List<settle_detail_infos> srttle = new List<settle_detail_infos>();
                    settle_detail_infos seModel = new settle_detail_infos();
                    seModel.amount = model.PayMoney;
                    seModel.trans_in_type = "defaultSettle";//表示结算到商户进件时设置的默认结算账号
                    srttle.Add(seModel);
                    sList.Add("settle_detail_infos", srttle);
                    bizContent.Add("settle_info", sList);

                    //补差信息
                    if (model.Subsidy_Money > 0)
                    {
                        Dictionary<string, object> extend = new Dictionary<string, object>();
                        extend.Add("orig_total_amount", model.Subsidy_Money + model.PayMoney);//外部订单金额
                        bizContent.Add("extend_params", extend);
                    }

                    request.BizContent = JsonConvert.SerializeObject(bizContent);

                    NLogHelper.Info($"参数:{JsonConvert.SerializeObject(request)}" );
                    var  res = client.SdkExecute(request);
                    NLogHelper.Info($"结果:{JsonConvert.SerializeObject(request)}");

                    if (!res.IsError)
                    {      
                        rm.Data = res.Body;
                        rm.State = 200;
                    }
                    else
                    {
                        rm.Msg = res.Msg;
                        return rm;
                    }

5.支付成功之后接收返回数据

     // 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组 
        // request回来的信息组成的数组
        public Dictionary<string, string> GetRequestPost()
        {
            int i = 0;
            Dictionary<string, string> sArray = new Dictionary<string, string>();
            StringBuilder str = new StringBuilder();

            var keys = Request.Form.Keys;
            if (keys != null)
            {
                foreach (string key in keys)
                {
                    sArray.Add(key, Request.Form[key]);
                    str.Append($"{key}={Request.Form[key]}&");
                }
                NLogHelper.Info( "支付宝支付异步返回结果:"+ str.ToString());
            }
            return sArray;
        }

  bool flag = AlipaySignature.RSACertCheckV1(dic, aliInfoSettings.Alipay_Cert_Path, aliInfoSettings.Charset, aliInfoSettings.Sign_Type);                
                if (flag)
                {
                    //交易状态
                    NLogHelper.Info($"验签成功  ");
                    if (dic["trade_status"] == "TRADE_SUCCESS") {
                        NLogHelper.Info($"支付成功!");
                        var out_trade_no = dic["out_trade_no"];// 原支付请求的商家订单号
                        var trade_no = dic["trade_no"];//支付宝交易凭证号

                        //找到当前订单
                        //判断该笔订单是否在商户网站中已经做过处理
                        var tranInfo = EPL_OutTranscationBz.GetModel(Convert.ToInt64( out_trade_no));
                        if (tranInfo != null && tranInfo.PayStatus == (int)EPL_OutTranscation_PayState.未支付) {

                            tranInfo.Amount = Convert.ToDecimal( dic["total_amount"]);
                            tranInfo.OutPayOrderId = dic["trade_no"];//支付宝交易凭证号

                            var merInfo = EP_MerchantBz.GetModel(tranInfo.MerId);
                            tranInfo.PayStatus = (int)EPL_OutTranscation_PayState.待结算;
                            EPL_OutTranscationBz.Update(tranInfo);


                            var wayMoney = Math.Round(tranInfo.Amount * Convert.ToDecimal(tranInfo.PayWayRate), 2);//四舍五入
                            var cusMoney = tranInfo.Amount - wayMoney; //实际到商户账户的钱

                            //判断是否需要分账,如果不需要直接走结算,到商户的支付宝账户上
                            //需要分账,需要到支付宝账户上冻结,之后分账补差之后解冻
                            EPL_Alternative alternative = new EPL_Alternative();
                            alternative.TransactionId = tranInfo.TranscationId;
                            alternative.AlternativeMerchantId = tranInfo.MerId;
                            alternative.OriginalMoney = tranInfo.Amount;
                            alternative.WayMoney = wayMoney;
                            alternative.HFMoney = tranInfo.YMoney;
                            alternative.AlternativeMoney = cusMoney;
                            alternative.PostTime = DateTime.Now;
                            alternative.PayState = (int)EPL_Alternative_PayState.代付代收初始值;
                            alternative.Payfunc = tranInfo.Payfunc;
                            alternative.MerUserId = merInfo.UserId;
                            alternative.BizBatchNo = 0;
                            alternative.AlternativeAcceptUserId = 5100031032; //九不欺平台订单支付分账收款账户
                            if (tranInfo.YMoney <= 0)
                            {
                                alternative.AgencyType = (int)EPL_Alternative_AgencyType.代付;
                                alternative.Remark = "代付给商户";
                            }
                            else {
                                alternative.AgencyType = (int)EPL_Alternative_AgencyType.代收;
                                alternative.Remark = "支付订单代收成功";
                            }
                            alternative.AlternativePayId = EPL_AlternativeBz.Add(alternative);


                            if (alternative.AlternativePayId > 0)
                            {

                                IAopClient client = new DefaultAopClient(AliClients.Sandbox.GetConfig());
                                AlipayTradeSettleConfirmRequest request = new AlipayTradeSettleConfirmRequest();

                                SettlementModel sModel = new SettlementModel();
                                sModel.out_request_no = alternative.AlternativePayId.ToString();//确认结算请求流水号
                                sModel.trade_no = tranInfo.OutPayOrderId;

                                List<detail_infos> dList = new List<detail_infos>();
                                detail_infos detail = new detail_infos();
                                detail.amount = Convert.ToDouble(cusMoney);
                                detail.trans_in_type = "defaultSettle";
                                dList.Add(detail);

                                sModel.settle_info = new settle_info()
                                {
                                    settle_detail_infos = dList
                                };

                                sModel.extend_params = new extend_params()
                                {
                                    royalty_freeze = tranInfo.YMoney <= 0? false:true //是否进行资金冻结,用于后续分账,true表示冻结
                                };

                                request.BizContent = JsonConvert.SerializeObject(sModel);
                                NLogHelper.Info($"参数:{JsonConvert.SerializeObject(sModel)}");
                                var res = client.CertificateExecute(request);
                                NLogHelper.Info($"结果:{JsonConvert.SerializeObject(res)}");

                                if (res.IsError)
                                {
                                    NLogHelper.Error($"失败 {res.SubMsg}");
                                    rm.Msg = res.Msg;
                                    return rm;
                                }
                                else
                                {
                                 
                                    
                                }
                            }
                   
                            rm.State = 200;
                            rm.Data = tranInfo;
                        }
                    }
                }
                else
                {
                    rm.Msg = "验证失败";
                    return rm;
                }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: .NET Core 是一个跨平台的开发框架,可以在不同操作系统上运行,包括 Windows、Linux 和 macOS。而 Tibco RV 是一种高性能的消息传递中间件,可以在分布式系统中进行实时数据传输和信。 要对接 .NET Core 和 Tibco RV,我们可以使用 Tibco RV 的 .NET 客户端库来实现。这个客户端库提供了一些 API,可以用来连接 Tibco RV 的消息队列,并进行数据的发送和接收。 首先,在 .NET Core 项目中,我们需要引用 Tibco RV 的 .NET 客户端库。可以过 NuGet 包管理器或手动引用 DLL 文件的方式将其添加到项目中。 然后,我们需要编写代码来连接 Tibco RV 的消息队列。首先,我们需要指定 Tibco RV 的连接参数,如服务器地址、端口号、服务名等。然后,我们可以使用这些参数来创建一个连接对象,并进行连接操作。 一旦连接成功,我们就可以使用连接对象来发送和接收消息了。对于发送消息,我们需要指定消息的目的地、消息内容等信息,并调用发送方法进行消息的发送。对于接收消息,我们可以使用事件驱动的方式,定义一个消息接收的回调函数,当有新消息到达时自动调用该函数进行处理。 在处理消息时,我们可以根据消息的内容进行逻辑处理,如解析消息、提取数据等。在逻辑处理完成后,我们可以选择发送响应消息或进行其他操作。 总的来说,过使用 Tibco RV 的 .NET 客户端库,我们可以很方便地在 .NET Core对接 Tibco RV,实现实时数据的传输和信。这样,我们可以在不同操作系统上开发和部署 .NET Core 应用程序,同时利用 Tibco RV 提供的高性能消息传递功能。 ### 回答2: .NET Core是微软推出的跨平台开发框架,可用于构建在Windows、macOS和Linux等不同操作系统上运行的应用程序。Tibco RV是一种具有高性能消息传递功能的中间件,用于在分布式系统中进行可靠的消息传递。对接Tibco RV与.NET Core可以过以下步骤完成: 1. 安装Tibco RV:首先需要将Tibco RV中间件安装到开发环境中,并确保其运行正常。 2. 引入Tibco RV的.NET Core包:在.NET Core项目中,可以使用NuGet包管理器引入与Tibco RV对接的相关包,例如Tibco.Rv.Net和Tibco.Rv.Net.Interop。 3. 配置Tibco RV连接参数:在.NET Core项目的配置文件中,可以设置Tibco RV连接所需的参数,例如主机名、端口号等。 4. 创建Tibco RV连接:使用.NET Core代码,在应用程序中创建与Tibco RV的连接对象,并设置相关参数,例如连接名称、认证信息等。 5. 发送和接收消息:过Tibco RV连接对象,可以发送和接收消息,使用相应的发送和接收方法实现。可以根据需要订阅特定的消息主题,或将消息发送到指定的主题。 6. 处理消息:在接收到Tibco RV的消息后,可以在.NET Core应用程序中对消息进行处理,例如解析消息内容、进行业务逻辑处理等。 7. 关闭连接:在应用程序结束时,需要关闭与Tibco RV的连接,释放相关资源。 过以上步骤,就可以实现.NET Core与Tibco RV的对接。开发人员可以根据具体的需求和场景,结合Tibco RV和.NET Core的功能和特性,实现高性能的分布式消息传递应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值