using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using WebService.SDK.PayCommon; using WebService.SDK.UnionPay.Utils; namespace WebService.SDK.UnionPay { public class UnionPayAPI { /// /// 扫码支付接口 /// /// 接口配置 /// 平台商户信息 /// 用户付款授权码 /// 设备IP /// 商户交易订单号 /// 商品描述 /// 交易金额(元) /// 订单生成时间 /// 订单超时时间 /// 附加信息 /// 通知地址 /// public static Model.ScanResultModel MerchantScanPay(UnionPayConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string authCode, string mch_create_ip, string merchantOrderCode, string body, string payAmount, string timeStart, string timeOut, string attach = "", string notify_url = "") { if (payConfig == null) { return default(Model.ScanResultModel); } if (merchantInfo == null || string.IsNullOrWhiteSpace(merchantInfo.MerchantCode)) { return default(Model.ScanResultModel); } if (!decimal.TryParse(payAmount, out decimal _PayAmount) || _PayAmount <= 0) { return default(Model.ScanResultModel); } ClientResponseHandler _ClientResponseHandler = new ClientResponseHandler(); PayHttpClient _PayHttpClient = new PayHttpClient(); _PayHttpClient.SetTimeOut(payConfig.PlatformTimeout); RequestHandler _RequestHandler = new RequestHandler(null); //加载配置数据 //Dictionary cfg = new Dictionary(1); Hashtable _Hashtable = new Hashtable(); //cfg = Utils.loadCfg(); //初始化数据 _RequestHandler.setGateUrl(payConfig.UnionPayAPIURL); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _RequestHandler.setKey(merchantInfo.MerchantKey); } else { _RequestHandler.setKey(payConfig.PlatformKey); _RequestHandler.setParameter("sign_agentno", payConfig.Organization);//平台机构号,统一签名密钥 } _RequestHandler.setParameter("auth_code", authCode);//付款授权码 _RequestHandler.setParameter("out_trade_no", merchantOrderCode);//商户订单号 _RequestHandler.setParameter("body", body);//商品描述 _RequestHandler.setParameter("attach", attach);//附加信息 _RequestHandler.setParameter("total_fee", (_PayAmount * 100).ToString("F0"));//总金额 _RequestHandler.setParameter("mch_create_ip", mch_create_ip);//终端IP _RequestHandler.setParameter("time_start", timeStart); //订单生成时间 _RequestHandler.setParameter("time_expire", timeOut);//订单超时时间 _RequestHandler.setParameter("service", "unified.trade.micropay");//接口类型: _RequestHandler.setParameter("mch_id", merchantInfo.MerchantCode);//必填项,商户号,由平台分配 _RequestHandler.setParameter("version", payConfig.Version);//接口版本号 //通知地址,必填项,接收平台通知的URL,需给绝对路径,255字符内;此URL要保证外网能访问 _RequestHandler.setParameter("notify_url", notify_url); _RequestHandler.setParameter("nonce_str", Utils.Utils.Random());//随机字符串,必填项,不长于 32 位 _RequestHandler.createSign();//创建签名 //以上参数进行签名 string data = Utils.Utils.ToXml(_RequestHandler.getAllParameters());//生成XML报文 Dictionary reqContent = new Dictionary(); reqContent.Add("url", _RequestHandler.getGateUrl()); reqContent.Add("data", data); _PayHttpClient.SetReqContent(reqContent); if (_PayHttpClient.Call()) { _ClientResponseHandler.setContent(_PayHttpClient.GetResContent()); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _ClientResponseHandler.setKey(merchantInfo.MerchantKey); } else { _ClientResponseHandler.setKey(payConfig.PlatformKey); } _Hashtable = _ClientResponseHandler.GetAllParameters(); if (!_ClientResponseHandler.isTenpaySign()) { _Hashtable = null; } } else { _Hashtable = null; } return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(_Hashtable)); } /// /// 支付查询接口 /// /// 接口配置 /// 平台商户信息 /// 商户订单号 /// 注:与平台订单号必填一项 /// 平台订单号 /// 注:与商户订单号必填一项 /// 交易金额(元) /// public static Model.QueryResultModel QueryPay(UnionPayConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string merchantOrderCode, string platformOrderCode, string payAmount) { if (payConfig == null) { return default(Model.QueryResultModel); } if (merchantInfo == null || string.IsNullOrWhiteSpace(merchantInfo.MerchantCode)) { return default(Model.QueryResultModel); } ClientResponseHandler _ClientResponseHandler = new ClientResponseHandler(); PayHttpClient _PayHttpClient = new PayHttpClient(); _PayHttpClient.SetTimeOut(payConfig.PlatformTimeout); RequestHandler _RequestHandler = new RequestHandler(null); //加载配置数据 //Dictionary cfg = new Dictionary(1); Hashtable _Hashtable = new Hashtable(); //cfg = Utils.loadCfg(); //初始化数据 //初始化数据 _RequestHandler.setGateUrl(payConfig.UnionPayAPIURL); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _RequestHandler.setKey(merchantInfo.MerchantKey); } else { _RequestHandler.setKey(payConfig.PlatformKey); _RequestHandler.setParameter("sign_agentno", payConfig.Organization);//平台机构号,统一签名密钥 } _RequestHandler.setParameter("out_trade_no", merchantOrderCode);//商户订单号 if (!string.IsNullOrWhiteSpace(platformOrderCode) && platformOrderCode != merchantOrderCode) { _RequestHandler.setParameter("transaction_id", platformOrderCode);//平台订单号 } _RequestHandler.setParameter("service", "unified.trade.query");//接口 unified.trade.query _RequestHandler.setParameter("mch_id", merchantInfo.MerchantCode);//必填项,商户号,由平台分配 _RequestHandler.setParameter("version", payConfig.Version);//接口版本号 _RequestHandler.setParameter("nonce_str", Utils.Utils.Random());//随机字符串,必填项,不长于 32 位 _RequestHandler.createSign();//创建签名 //以上参数进行签名 string data = Utils.Utils.ToXml(_RequestHandler.getAllParameters());//生成XML报文 Dictionary reqContent = new Dictionary(); reqContent.Add("url", _RequestHandler.getGateUrl()); reqContent.Add("data", data); _PayHttpClient.SetReqContent(reqContent); if (_PayHttpClient.Call()) { _ClientResponseHandler.setContent(_PayHttpClient.GetResContent()); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _ClientResponseHandler.setKey(merchantInfo.MerchantKey); } else { _ClientResponseHandler.setKey(payConfig.PlatformKey); } _Hashtable = _ClientResponseHandler.GetAllParameters(); if (!_ClientResponseHandler.isTenpaySign()) { _Hashtable = null; } } else { _Hashtable = null; } return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(_Hashtable)); } /// /// 交易退款接口 /// /// 接口配置 /// 平台商户信息 /// 商户订单号 /// 注:与平台订单号必填一项 /// 平台订单号 /// 注:与商户订单号必填一项 /// 商户退款单号 /// 退款金额(元) /// 退款渠道 /// public static Model.RefundResultModel RefundPay(UnionPayConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string platformOrderCode, string merchantOrderCode, string refundOrderCode, string payAmount, string refundChannel = "ORIGINAL") { if (payConfig == null) { return default(Model.RefundResultModel); } if (merchantInfo == null || string.IsNullOrWhiteSpace(merchantInfo.MerchantCode)) { return default(Model.RefundResultModel); } if (!decimal.TryParse(payAmount, out decimal _PayAmount) || _PayAmount <= 0) { return default(Model.RefundResultModel); } ClientResponseHandler _ClientResponseHandler = new ClientResponseHandler(); PayHttpClient _PayHttpClient = new PayHttpClient(); _PayHttpClient.SetTimeOut(payConfig.PlatformTimeout); RequestHandler _RequestHandler = new RequestHandler(null); //加载配置数据 //Dictionary cfg = new Dictionary(1); Hashtable _Hashtable = new Hashtable(); //cfg = Utils.loadCfg(); //初始化数据 //初始化数据 _RequestHandler.setGateUrl(payConfig.UnionPayAPIURL); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _RequestHandler.setKey(merchantInfo.MerchantKey); } else { _RequestHandler.setKey(payConfig.PlatformKey); _RequestHandler.setParameter("sign_agentno", payConfig.Organization);//平台机构号,统一签名密钥 } _RequestHandler.setParameter("out_trade_no", merchantOrderCode);//商户订单号 _RequestHandler.setParameter("transaction_id", platformOrderCode);//平台订单号 _RequestHandler.setParameter("out_refund_no", refundOrderCode);//商户退款单号 _RequestHandler.setParameter("total_fee", (_PayAmount * 100).ToString("F0"));//总金额 _RequestHandler.setParameter("refund_fee", (_PayAmount * 100).ToString("F0"));//退款金额 _RequestHandler.setParameter("refund_channel", refundChannel);//退款渠道 _RequestHandler.setParameter("service", "unified.trade.refund");//接口 unified.trade.refund _RequestHandler.setParameter("mch_id", merchantInfo.MerchantCode);//必填项,商户号,由平台分配 _RequestHandler.setParameter("version", payConfig.Version);//接口版本号 _RequestHandler.setParameter("op_user_id", merchantInfo.MerchantCode);//必填项,操作员帐号,默认为商户号 _RequestHandler.setParameter("nonce_str", Utils.Utils.Random());//随机字符串,必填项,不长于 32 位 _RequestHandler.createSign();//创建签名 //以上参数进行签名 string data = Utils.Utils.ToXml(_RequestHandler.getAllParameters());//生成XML报文 Dictionary reqContent = new Dictionary(); reqContent.Add("url", _RequestHandler.getGateUrl()); reqContent.Add("data", data); _PayHttpClient.SetReqContent(reqContent); if (_PayHttpClient.Call()) { _ClientResponseHandler.setContent(_PayHttpClient.GetResContent()); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _ClientResponseHandler.setKey(merchantInfo.MerchantKey); } else { _ClientResponseHandler.setKey(payConfig.PlatformKey); } _Hashtable = _ClientResponseHandler.GetAllParameters(); if (!_ClientResponseHandler.isTenpaySign()) { _Hashtable = null; } } else { _Hashtable = null; } return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(_Hashtable)); } /// /// 交易退款查询接口 /// /// 接口配置 /// 平台商户信息 /// 平台订单号 /// 商户订单号 /// 平台退款单号 /// 商户退款单号 /// public static Model.RefundQueryResultModel RefundQuery(UnionPayConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string platformOrderCode, string merchantOrderCode, string platformRefundCode, string refundOrderCode) { if (payConfig == null) { return default(Model.RefundQueryResultModel); } if (merchantInfo == null || string.IsNullOrWhiteSpace(merchantInfo.MerchantCode)) { return default(Model.RefundQueryResultModel); } ClientResponseHandler _ClientResponseHandler = new ClientResponseHandler(); PayHttpClient _PayHttpClient = new PayHttpClient(); _PayHttpClient.SetTimeOut(payConfig.PlatformTimeout); RequestHandler _RequestHandler = new RequestHandler(null); //加载配置数据 //Dictionary cfg = new Dictionary(1); Hashtable _Hashtable = new Hashtable(); //cfg = Utils.loadCfg(); //初始化数据 //初始化数据 _RequestHandler.setGateUrl(payConfig.UnionPayAPIURL); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _RequestHandler.setKey(merchantInfo.MerchantKey); } else { _RequestHandler.setKey(payConfig.PlatformKey); _RequestHandler.setParameter("sign_agentno", payConfig.Organization);//平台机构号,统一签名密钥 } _RequestHandler.setParameter("out_trade_no", merchantOrderCode);//商户订单号 _RequestHandler.setParameter("transaction_id", platformOrderCode);//平台订单号 _RequestHandler.setParameter("out_refund_no", refundOrderCode);//商户退款单号 _RequestHandler.setParameter("refund_id", platformRefundCode);//平台退款单号 _RequestHandler.setParameter("service", "unified.trade.refundquery");//接口 unified.trade.refundquery _RequestHandler.setParameter("mch_id", merchantInfo.MerchantCode);//必填项,商户号,由平台分配 _RequestHandler.setParameter("version", payConfig.Version);//接口版本号 _RequestHandler.setParameter("nonce_str", Utils.Utils.Random());//随机字符串,必填项,不长于 32 位 _RequestHandler.createSign();//创建签名 //以上参数进行签名 string data = Utils.Utils.ToXml(_RequestHandler.getAllParameters());//生成XML报文 Dictionary reqContent = new Dictionary(); reqContent.Add("url", _RequestHandler.getGateUrl()); reqContent.Add("data", data); _PayHttpClient.SetReqContent(reqContent); if (_PayHttpClient.Call()) { _ClientResponseHandler.setContent(_PayHttpClient.GetResContent()); if (!string.IsNullOrWhiteSpace(merchantInfo.MerchantKey)) { _ClientResponseHandler.setKey(merchantInfo.MerchantKey); } else { _ClientResponseHandler.setKey(payConfig.PlatformKey); } _Hashtable = _ClientResponseHandler.GetAllParameters(); if (!_ClientResponseHandler.isTenpaySign()) { _Hashtable = null; } } else { _Hashtable = null; } return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(_Hashtable)); } } }