2025-03-28 09:49:56 +08:00

428 lines
20 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Security.Cryptography;
using WebService.SDK;
using System.Text;
namespace EShangTechService
{
public class Common
{
//接口请求地址,固定不变,无需修改
//protected const string req_url = "https://www.weiwoju.com";
protected static string req_url = ConfigurationManager.AppSettings["req_url"] == null ?
"https://apisvbak2.ke51.cn" : ConfigurationManager.AppSettings["req_url"].ToString();
protected const string key = "w0j23q2m69po13syyd6pj6a11o64f2r13bj";
protected const string openid = "1z7n0lp0nsi8o0dd5o74lgrhs1575k";
//服务区、门店编码
protected static string[] ShopCode = ConfigurationManager.AppSettings["ShopCode"].ToString().Split(',');
//商户编号
protected static string[] Business_Code = ConfigurationManager.AppSettings["Business_Code"].ToString().Split(',');
//商户秘钥
//protected static string[] term_Code = ConfigurationManager.AppSettings["term_Code"].ToString().Split(',');
public static string get_reqmsg(string trade_state)
{
switch (trade_state)
{
case "0":
return "等待付款";
case "1":
return "已付款";
case "2":
return "已撤单";
case "3":
return "申请撤单";
case "4":
return "部分退款";
case "5":
return "已退款";
case "6":
return "交易关闭";
case "7":
return "系统保留状态(查询时使用,同时查询退款和撤单记录)";
case "8":
return "退款中(平台未返回退款结果)";
case "9":
return "退款失败";
case "10":
return "待退款";
case "11":
return "退款成功";
case "12":
return "退款失败";
case "13":
return "退款取消";
case "14":
return "撤单成功";
default:
return "";
}
}
#region -
/// <summary>
/// 交易支付接口
/// 商家扫用户支付二维码
/// </summary>
/// <param name="auth_code">用户付款授权码</param>
/// <param name="out_trade_no">商户订单号</param>
/// <param name="pay_subject">商品描述</param>
/// <param name="total_fee">总金额</param>
/// <param name="MerchantInfo">商户信息(商户号,秘钥)</param>
/// <param name="notify_url">通知回调地址</param>
/// <returns></returns>
public static string merchantscan(string auth_code, string out_trade_no, string pay_subject, string total_fee,
string[] MerchantInfo, string notify_url)
{
string ResString = "";
if (string.IsNullOrEmpty(MerchantInfo[0]))
{
return null;
}
Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
_Dictionary.Add("auth_code", auth_code);//支付宝/微信授权码
_Dictionary.Add("bind_code", MerchantInfo[0]);//商户编号
_Dictionary.Add("body", total_fee);//交易金额
_Dictionary.Add("no", out_trade_no);//门店编号
_Dictionary.Add("nonce_str", "0"); //支付渠道
_Dictionary.Add("openid", openid);//客无忧与平台对接的openid jajonaujrocjajheangyunhaohpeng
_Dictionary.Add("order_title", pay_subject);//设备编号
_Dictionary.Add("price", total_fee);//支付描述信息
_Dictionary.Add("time_stamp", Convert.ToInt32((DateTime.Now -
new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString());//币种。默认CNY
_Dictionary.Add("sign", getSign(_Dictionary, key));
LogHelper.WriteReceiveLog("支付反扫-传第三方参数:" + paramsToString(_Dictionary));
//以上参数进行签名
ResString = CommonHelper.HttpUrlPost(paramsToString(_Dictionary), req_url + "/Payapi/Index/microPay",
"application/x-www-form-urlencoded", 5);
LogHelper.WriteReceiveLog("支付反扫-返回参数:" + ResString);
return ResString;
}
#endregion
#region 线-
public static string QRCodePay(string out_trade_no, string pay_subject, string total_fee, string[] MerchantInfo,
string notify_url, string channel_type)
{
string ResString = "";
if (string.IsNullOrEmpty(MerchantInfo[0]))
{
return null;
}
Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
_Dictionary.Add("openid", openid);//客无忧与平台对接的openid jajonaujrocjajheangyunhaohpeng
_Dictionary.Add("bind_code", MerchantInfo[0]);//商户编号
_Dictionary.Add("auth_code", out_trade_no);//支付宝/微信授权码
_Dictionary.Add("channel_type", channel_type); //支付渠道
_Dictionary.Add("fee_type", "CNY");//币种。默认CNY
_Dictionary.Add("no", out_trade_no);//交易上行流水号
_Dictionary.Add("order_title", pay_subject);//支付描述信息
_Dictionary.Add("time_expire", "5");//超时时间
_Dictionary.Add("body", total_fee);//交易金额
_Dictionary.Add("price", total_fee);//交易金额
_Dictionary.Add("trade_type", "QRCODE");//交易类型
_Dictionary.Add("time_stamp", Convert.ToInt32((DateTime.Now -
new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString());//币种。默认CNY
_Dictionary.Add("sign", getSign(_Dictionary, key));
_Dictionary.Add("notify_url", "");
_Dictionary.Add("callback_url", "");
LogHelper.WriteReceiveLog("支付正扫_传第三方参数" + paramsToString(_Dictionary));
//以上参数进行签名
ResString = CommonHelper.HttpUrlPost(paramsToString(_Dictionary), req_url + "/Payapi/Index/Webpay", "application/x-www-form-urlencoded", 5);
LogHelper.WriteSendLog(" 支付正扫_返回的支付结果:" + ResString);
return ResString;
}
public static string QRCodePay(string out_trade_no, string pay_subject,
string total_fee, string MerchantInfo, string notify_url, string channel_type)
{
string ResString = "";
if (string.IsNullOrEmpty(MerchantInfo))
{
return null;
}
Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
_Dictionary.Add("openid", "1z7n0lp0nsi8o0dd5o74lgrhs1575k");//客无忧与平台对接的openid jajonaujrocjajheangyunhaohpeng
_Dictionary.Add("bind_code", MerchantInfo);//商户编号
_Dictionary.Add("auth_code", out_trade_no);//支付宝/微信授权码
_Dictionary.Add("channel_type", channel_type); //支付渠道
_Dictionary.Add("fee_type", "CNY");//币种。默认CNY
_Dictionary.Add("no", out_trade_no);//交易上行流水号
_Dictionary.Add("order_title", pay_subject);//支付描述信息
_Dictionary.Add("time_expire", "5");//超时时间
_Dictionary.Add("body", total_fee);//交易金额
_Dictionary.Add("price", total_fee);//交易金额
_Dictionary.Add("trade_type", "QRCODE");//交易类型
_Dictionary.Add("time_stamp", Convert.ToInt32((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString());//币种。默认CNY
_Dictionary.Add("notify_url", "https://www.weiwoju.com");
_Dictionary.Add("callback_url", "https://www.weiwoju.com");
_Dictionary.Add("sign", getSign(_Dictionary, key));
LogHelper.WriteReceiveLog("支付正扫_传第三方参数" + paramsToString(_Dictionary));
//以上参数进行签名
ResString = CommonHelper.HttpUrlPost(paramsToString(_Dictionary),
req_url + "/Payapi/Index/Webpay", "application/x-www-form-urlencoded", 5);
LogHelper.WriteSendLog("支付正扫_返回的支付结果:" + ResString);
return ResString;
}
#endregion
#region
//交易支付接口测试
//商家扫用户支付二维码
//传入参数
//@out_trade_no:商户订单号
//@trade_no:交易下行流水号
//@MerchantInfo:商户信息(商户号,秘钥)
public static string TradeQuery(string out_trade_no, string trade_no, string MerchantInfo)
{
string ResString = "";
if (string.IsNullOrEmpty(MerchantInfo))
{
return null;
}
long timestamp = CommonHelper.ConvertDataTimeLong(DateTime.Now);
Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
//_Dictionary.Add("busi_id", MerchantInfo);//商户编号
_Dictionary.Add("bind_code", MerchantInfo);//商户编号
_Dictionary.Add("openid", openid);// jajonaujrocjajheangyunhaohpeng
_Dictionary.Add("time_stamp", Convert.ToInt32((DateTime.Now -
new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString());//币种。默认CNY
if (!string.IsNullOrEmpty(trade_no))
{
_Dictionary.Add("transaction_id", trade_no);//交易上行流水号
}
if (!string.IsNullOrEmpty(out_trade_no))
{
_Dictionary.Add("out_no", out_trade_no);//交易下行流水号
}
_Dictionary.Add("sign", getSign(_Dictionary, key));
LogHelper.WriteReceiveLog("支付查询记录…传第三方参数:" + paramsToString(_Dictionary));
//以上参数进行签名
ResString = CommonHelper.HttpUrlPost(paramsToString(_Dictionary), req_url + "/Payapi/Index/orderQuery");
LogHelper.WriteSendLog("支付查询记录第三方…返回值:" + ResString);
return ResString;
}
#endregion
#region 退-
//交易支付接口测试
//商家扫用户支付二维码
//传入参数
//@operator_id:操作员编号
//@terminal_id:平台订单号
//@refund_fee:退款金额
//@refund_subject:退款描述
//@out_trade_no:交易上行流水号
//@trade_no:交易下行流水号
//@out_refund_no:退款流水号
//@MerchantInfo:商户信息(商户号,秘钥)
public static string TradeRefund(string operator_id, string terminal_id, string refund_fee, string refund_subject,
string out_trade_no, string trade_no, string out_refund_no, string MerchantInfo)
{
string ResString = "";
if (string.IsNullOrEmpty(MerchantInfo))
{
return null;
}
long timestamp = CommonHelper.ConvertDataTimeLong(DateTime.Now);
Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
_Dictionary.Add("bind_code", MerchantInfo);//商户编号
_Dictionary.Add("openid", openid);//客无忧与平台对接的openid jajonaujrocjajheangyunhaohpeng
_Dictionary.Add("channel_type", "0"); //支付渠道
_Dictionary.Add("fee_type", "CNY");//币种。默认CNY
_Dictionary.Add("operator_id", operator_id);//操作员编号
_Dictionary.Add("transaction_id", trade_no);//退款流水号
_Dictionary.Add("nonce_str", "0"); //支付渠道
_Dictionary.Add("time_stamp", Convert.ToInt32((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString());//币种。默认CNY
if (!string.IsNullOrEmpty(out_trade_no))
{
_Dictionary.Add("out_trade_no", out_trade_no);//交易上行流水号
}
_Dictionary.Add("price", refund_fee);//退款金额
_Dictionary.Add("refund_price", refund_fee);//退款金额
_Dictionary.Add("refund_subject", refund_subject);//退款描述
_Dictionary.Add("terminal_id", terminal_id);//设备编号
if (!string.IsNullOrEmpty(out_refund_no))
{
_Dictionary.Add("refund_no", out_refund_no);//交易下行流水号
}
_Dictionary.Add("sign", getSign(_Dictionary, key));
LogHelper.WriteReceiveLog("退款-请求参数:" + paramsToString(_Dictionary));
//以上参数进行签名
ResString = CommonHelper.HttpUrlPost(paramsToString(_Dictionary), req_url + "/Payapi/Index/refundPrice");
LogHelper.WriteSendLog("退款-返回参数:" + ResString);
return ResString;
}
#endregion
#region 退
//交易支付接口测试
//商家扫用户支付二维码
//传入参数
//@operator_id:操作员编号
//@terminal_id:设备编号
//@out_refund_no:商户退款单号
//@MerchantInfo:商户信息(商户号,秘钥)
public static string RefundQuery(string operator_id, string terminal_id, string out_refund_no, string MerchantInfo)
{
string ResString = "";
if (string.IsNullOrEmpty(MerchantInfo))
{
return null;
}
Dictionary<string, string> _ApiDictionary = new Dictionary<string, string>
{
{ "bind_code", MerchantInfo },//商户编号
{ "openid", openid },//客无忧平台OPENID
{ "nonce_str", "0" }, //随机字符串
{ "time_stamp", Convert.ToInt32((DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalSeconds).ToString() }//时间戳
};
if (!string.IsNullOrEmpty(out_refund_no))
{
_ApiDictionary.Add("out_refund_no", out_refund_no);//商户订单号
}
_ApiDictionary.Add("sign", getSign(_ApiDictionary, key));
//拼接交易请求参数
string str_PostData = paramsToString(_ApiDictionary);
LogHelper.WriteReceiveLog("退款查询-请求参数:" + str_PostData);
//调用服务商接口进行退款查询
ResString = CommonHelper.HttpUrlPost(str_PostData, req_url + "/Payapi/Index/refundOrderQuery");
LogHelper.WriteSendLog("退款查询-返回参数:" + ResString);
return ResString;
}
#endregion
#region
/// <summary>
/// 获取商户编号
/// </summary>
/// <param name="TICKETCODE">交易订单号</param>
/// <returns></returns>
public static string[] GetMerchantInfo(string TICKETCODE)
{
string[] MerchantInfo = new string[3];
string _SERVERPARTCODE = TICKETCODE.Substring(0, 6);
string _SHOPCODE = TICKETCODE.Length == 28 ? TICKETCODE.Substring(6, 4) : TICKETCODE.Substring(6, 6);
//通过门店信息获取唯一商户号
string _Merchant = ConfigurationManager.AppSettings[_SERVERPARTCODE + _SHOPCODE];
//门店唯一信息获取不到商户号信息时,通过旧模式获取
if (string.IsNullOrWhiteSpace(_Merchant))
{
for (int i = 0; i < ShopCode.Length; i++)
{
if (_SERVERPARTCODE == ShopCode[i] || _SHOPCODE.Substring(2, _SHOPCODE.Length - 2) == ShopCode[i] ||
_SHOPCODE == ShopCode[i])
{
MerchantInfo[0] = Business_Code[i];
//MerchantInfo[1] = term_Code[i];
break;
}
}
}
else
{
MerchantInfo[0] = _Merchant.Split('|')[0];
if (_Merchant.Split('|').Count() > 1)
{
MerchantInfo[1] = _Merchant.Split('|')[1];
}
if (_Merchant.Split('|').Count() > 2)
{
MerchantInfo[2] = _Merchant.Split('|')[2];
}
}
return MerchantInfo;
}
#endregion
#region
/// <summary>
/// 根据门店获取商户编号
/// </summary>
/// <param name="serverPartCode">服务区编码</param>
/// <param name="shopCode">门店编码</param>
/// <returns></returns>
public static string[] GetMerchantInfo(string serverPartCode, string shopCode)
{
string[] MerchantInfo = new string[3];
//通过门店信息获取唯一商户号
string _Merchant = ConfigurationManager.AppSettings[serverPartCode + shopCode];
//门店唯一信息获取不到商户号信息时,通过旧模式获取
if (string.IsNullOrWhiteSpace(_Merchant))
{
for (int i = 0; i < ShopCode.Length; i++)
{
if (serverPartCode == ShopCode[i] || shopCode == ShopCode[i]
|| shopCode.Substring(2, shopCode.Length - 2) == ShopCode[i])
{
MerchantInfo[0] = Business_Code[i];
break;
}
}
}
else
{
MerchantInfo[0] = _Merchant.Split('|')[0];
if (_Merchant.Split('|').Count() > 1)
{
MerchantInfo[1] = _Merchant.Split('|')[1];
}
if (_Merchant.Split('|').Count() > 2)
{
MerchantInfo[2] = _Merchant.Split('|')[2];
}
}
return MerchantInfo;
}
#endregion
#region
/// <summary>
/// 获取签名
/// </summary>
/// <param name="dic"></param>
/// <param name="key"></param>
/// <returns></returns>
private static string getSign(Dictionary<string, string> dic, string key)
{
var list = dic.OrderBy(s => s.Key);
string str = "";
foreach (var ss in list)
{
str += ss.Key + "=" + ss.Value + "&";
}
str += "key=" + key;
str = get_md5(str).ToUpper();
return str;
}
private static string get_md5(string str)
{
var md5 = MD5.Create();
var result_byte = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
return BitConverter.ToString(result_byte).Replace("-", "").ToLower();
}
private static string paramsToString(Dictionary<string, string> dic)
{
string str = String.Empty;
foreach (var e in dic)
{
str += e.Key + "=" + e.Value + "&";
}
str = str.TrimEnd('&');
return str;
}
#endregion
}
}