using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using WebService.SDK.PayCommon; namespace WebService.SDK.Uphicoo { public class UphicooAPI { #region 嗨客付款码支付接口 /// /// 嗨客付款码支付接口 /// /// 接口配置 /// 平台商户信息 /// 用户付款授权码 /// 商户交易订单号 /// 交易金额(元) /// public static Model.UphicoobarcodeModel UphicooBarcode(UphicooConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string authCode, string merchantOrderCode, string payAmount) { //验证交易接口配置 if (payConfig == null) { return default(Model.UphicoobarcodeModel); } //验证交易金额 if (!decimal.TryParse(payAmount, out decimal _PayAmount) || _PayAmount <= 0) { return default(Model.UphicoobarcodeModel); } //生成交易报文体参数 Dictionary _ApiDictionary = new Dictionary { { "appid", payConfig.PlatformAPPID },//应用的APPID { "timestamp" ,CommonHelper.ConvertDataTimeLong(DateTime.Now).ToString()},//时间戳 { "merchant_num", merchantInfo.MerchantCode}, //商户编号 { "store_num",merchantInfo.MerchantShopCode}, //门店编号 { "staff_num", merchantInfo.MerchantUserCode}, //员工编号 { "merchant_order_no" ,merchantOrderCode}, //商户订单号 { "auth_code" ,authCode}, //付款码 { "amount" ,payAmount} //交易金额 }; //发送给第三方的交易参数日志 _ApiDictionary.Add("sign", ApiParamSign(_ApiDictionary, payConfig.PlatformKey)); LogHelper.WriteReceiveLog("支付反扫-传第三方参数:" + _ApiDictionary.Select(pair => pair.Key + "=" + pair.Value). DefaultIfEmpty("").Aggregate((a, b) => a + "&" + b)); //调用接口请求交易并返回结果(json方式) return JsonConvert.DeserializeObject(CommonHelper.HttpUrlPost( JsonConvert.SerializeObject(_ApiDictionary), payConfig.BarcodeUphicooURL, "application/json", payConfig.PlatformTimeout)); } #endregion #region 嗨客平台订单查询 /// /// 嗨客平台订单查询 /// /// 接口配置 /// 平台商户信息 /// 商户交易订单号 /// 交易金额(元) /// public static Model.UphicooqueryModel UphicooQuery(UphicooConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string merchantOrderCode, string platformOrderCode, string payAmount) { //验证交易接口配置 if (payConfig == null) { return default(Model.UphicooqueryModel); } //验证交易参数 if (merchantInfo == null || string.IsNullOrWhiteSpace(merchantInfo.MerchantCode)) { return default(Model.UphicooqueryModel); } //生成交易报文体参数 Dictionary _ApiDictionary = new Dictionary { { "appid", payConfig.PlatformAPPID },//应用的APPID { "timestamp" ,CommonHelper.ConvertDataTimeLong(DateTime.Now).ToString()},//时间戳 { "merchant_num", merchantInfo.MerchantCode}, //商户编号 { "merchant_order_no" ,merchantOrderCode} //商户订单号 }; //验证商户订单号 if (!string.IsNullOrEmpty(platformOrderCode) && platformOrderCode != merchantOrderCode) { _ApiDictionary.Add("order_number", platformOrderCode);//平台订单号 } //发送给第三方的交易参数日志 _ApiDictionary.Add("sign", ApiParamSign(_ApiDictionary, payConfig.PlatformKey)); LogHelper.WriteReceiveLog("支付反扫-传第三方参数:" + _ApiDictionary.Select(pair => pair.Key + "=" + pair.Value). DefaultIfEmpty("").Aggregate((a, b) => a + "&" + b)); //调用接口请求交易并返回结果(json方式) return JsonConvert.DeserializeObject(CommonHelper.HttpUrlPost( JsonConvert.SerializeObject(_ApiDictionary), payConfig.QueryUphicooURL, "application/json", payConfig.PlatformTimeout)); } #endregion #region 嗨客交易退款接口 /// /// 嗨客交易退款接口 /// /// 接口配置 /// 平台商户信息 /// 平台订单号(原流水号) /// 注:与商户订单号必填一项 /// 商户订单号(原流水号) /// 注:与平台订单号必填一项 /// 退款订单号 /// 退款金额(元) /// public static Model.UphicoorefundModel UphicooRefund(UphicooConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string platformOrderCode, string refundOrderCode, string payAmount) { //验证交易接口配置 if (payConfig == null) { return default(Model.UphicoorefundModel); } //验证交易金额 if (merchantInfo == null || string.IsNullOrWhiteSpace(merchantInfo.MerchantCode)) { return default(Model.UphicoorefundModel); } //生成交易报文体参数 Dictionary _ApiDictionary = new Dictionary { { "appid", payConfig.PlatformAPPID },//应用的APPID { "timestamp" ,CommonHelper.ConvertDataTimeLong(DateTime.Now).ToString()},//时间戳 { "merchant_num", merchantInfo.MerchantCode}, //商户编号 { "staff_num", merchantInfo.MerchantUserCode },//收银员编号 { "store_num", merchantInfo.MerchantShopCode },//门店编号 { "merchant_refund_no", refundOrderCode }, //商家退款单号 { "order_number", platformOrderCode },//扫码交易流水号 { "amount", payAmount},//退款金额 { "remark", ""} //退款备注 }; //发送给第三方的交易参数日志 _ApiDictionary.Add("sign", ApiParamSign(_ApiDictionary, payConfig.PlatformKey)); LogHelper.WriteReceiveLog("支付退款-传第三方参数:" + _ApiDictionary.Select(pair => pair.Key + "=" + pair.Value.ToString()). DefaultIfEmpty("").Aggregate((a, b) => a + "&" + b)); //调用接口请求交易并返回结果(json方式) return JsonConvert.DeserializeObject(CommonHelper.HttpUrlPost( JsonConvert.SerializeObject(_ApiDictionary), payConfig.RefundUphicooURL, "application/json", payConfig.PlatformTimeout)); } #endregion #region 嗨客交易退款查询接口 /// /// 嗨客交易退款查询接口 /// /// 接口配置 /// 平台商户信息 /// 商户交易订单号 /// 平台交易订单号 /// 交易金额 public static Model.UphicooreFundqueryModel UphicooRefundquery(UphicooConfig payConfig, MobilePayConfig.PayMerchant merchantInfo, string merchantOrderCode, string platformOrderCode, string payAmount) { //验证交易接口配置 if (payConfig == null) { return default(Model.UphicooreFundqueryModel); } //验证交易参数信息 if (merchantInfo == null || string.IsNullOrWhiteSpace(merchantInfo.MerchantCode)) { return default(Model.UphicooreFundqueryModel); } //生成交易报文体参数 Dictionary _ApiDictionary = new Dictionary { { "appid", payConfig.PlatformAPPID },//应用的APPID { "timestamp" ,CommonHelper.ConvertDataTimeLong(DateTime.Now).ToString()},//时间戳 { "merchant_num", merchantInfo.MerchantCode}, //商户编号 { "refund_no", platformOrderCode }, //平台退款单号 { "merchant_refund_no", merchantOrderCode} //商户退款单号 }; //发送给第三方的交易参数日志 _ApiDictionary.Add("sign", ApiParamSign(_ApiDictionary, payConfig.PlatformKey)); LogHelper.WriteReceiveLog("支付退款-传第三方参数:" + _ApiDictionary.Select(pair => pair.Key + "=" + pair.Value.ToString()). DefaultIfEmpty("").Aggregate((a, b) => a + "&" + b)); //调用接口请求交易并返回结果(json方式) return JsonConvert.DeserializeObject(CommonHelper.HttpUrlPost( JsonConvert.SerializeObject(_ApiDictionary), payConfig.RefundqueryPriceURL, "application/json", payConfig.PlatformTimeout)); } #endregion #region 嗨客支付平台参数签名 /// /// 嗨客支付平台参数签名 /// /// 待签名参数集 /// 签名密钥 /// public static string ApiParamSign(Dictionary signParm, string MD5Key) { string _strSign = ""; foreach (var keyValuePair in signParm.OrderBy(p => p.Key)) { _strSign += (string.IsNullOrWhiteSpace(_strSign) ? "" : "&") + keyValuePair.Key + "=" + keyValuePair.Value; } return BitConverter.ToString(MD5.Create().ComputeHash( Encoding.UTF8.GetBytes(_strSign + "&key=" + MD5Key))).Replace("-", "").ToLower(); } #endregion } }