⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 md5pay.cs

📁 易想商城系统
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Text;
using System.Security.Cryptography;
using  System.Collections.Specialized;
using System.Configuration;

namespace tenpaymd5
{
	/// <summary>
	/// 完成功能如下
	/// 1:支付请求
	/// 2:支付结果处理。
	/// 3:查询订单请求.
	/// 4:查询订单结果处理.
	/// </summary>
	public class Md5Pay
	{
		/// <summary>
		/// 商户号(替换为自已的商户号)
		/// </summary>


        private string bargainor_id="";
		//private const string bargainor_id = "1201949101";
        /// <summary>
        /// 
        /// </summary>
        public string Bargainor_id
        {
            get { return bargainor_id; }
            set { bargainor_id = value; }
        }








        private string key;
		/// <summary>
		/// 商户KEY(替换为自已的KEY)
		/// </summary>
		//private const string key = "b56de9c2036fa8737e646532339c4836";
        public string Key
        {
            get { return key; }
            set { key = value; }
        }

		/// <summary>
		/// 财付通支付网关URL
		/// </summary>
		private string paygateurl = ConfigurationSettings.AppSettings["paygateurl"];
	
		/// <summary>
		/// 财付通查询请求URL
		/// </summary>
		private string querygateurl = ConfigurationSettings.AppSettings["querygateurl"];

		/// <summary>
		/// 支付结果回跳页面
		/// 推荐使用ip地址的方式(最长255个字符)
		/// 可以使用相对地址或配置,在使用前拼装全地址就行.这样方便部署.
		/// </summary>
		private string return_url = ConfigurationSettings.AppSettings["return_url"];

		/// <summary>
		/// 查询结果回跳页面
		/// 推荐使用ip地址的方式(最长255个字符)
		/// 可以使用相对地址或配置,在使用前拼装全地址就行.这样方便部署.
		/// </summary>
		private string queryreturn_url = ConfigurationSettings.AppSettings["queryreturn_url"];

		/// <summary>
		/// 支付命令.1
		/// </summary>
		private const int cmdno = 1;
		
		/// <summary>
		/// 查询命令.2
		/// </summary>
		private const int querycmdno = 2;

		/// <summary>
		/// 费用类型,现在暂只支持 1:人民币
		/// </summary>
		private int fee_type = 1;

		private string date;

		#region 日期字段设置,格式为yyyyMMdd		

		/// <summary>
		/// 支付日期,yyyyMMdd
		/// </summary>
		public string Date
		{
			get
			{
				if(date == null)
				{
					date = DateTime.Now.ToString("yyyyMMdd");					
				}

				return date;
			}
			set
			{
				if(value == null || value.Trim().Length != 8)
				{
					date = DateTime.Now.ToString("yyyyMMdd");
				}
				else
				{
					try
					{
						string strTmp = value.Trim();
						date = DateTime.Parse(strTmp.Substring(0,4) + "-" + strTmp.Substring(4,2) + "-" 
							+ strTmp.Substring(6,2)).ToString("yyyyMMdd");
					}
					catch
					{
						date = DateTime.Now.ToString("yyyyMMdd");
					}

				}
			}
		}

		#endregion

		private long sp_billno = 0;

		/// <summary>
		/// 商户订单号,10位正整数
		/// </summary>
		public long Sp_billno
		{
			get{return sp_billno;}
			set{sp_billno = value;}
		}

		private long total_fee = 0;

		/// <summary>
		/// 订单金额,以分为单位
		/// </summary>
		public long Total_fee
		{
			get{return total_fee;}
			set{total_fee = value;}
		}

		/// <summary>
		/// 取时间戳生成随即数,替换交易单号中的后10位流水号
		/// 财付通的交易单号中不允许出现非数字的字符
		/// </summary>
		/// <returns></returns>
		private UInt32 UnixStamp()
		{
			TimeSpan ts = DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
			return Convert.ToUInt32(ts.TotalSeconds);
		}

		private string transaction_id = "";

		/// <summary>
		/// 交易单号,商户号(10)+支付日期(8)+商户订单号(10,不足的话左补0)=28位.
		/// </summary>
		public string Transaction_id
		{
			get
			{
				if(transaction_id == "")
				{
					transaction_id = bargainor_id + date + UnixStamp();
				}

				return transaction_id;
			}
			set
			{
				transaction_id = value;
			}
		}

		private string desc = "";

		/// <summary>
		/// 商品名称
		/// </summary>
		public string Desc
		{
			get{return UrlDecode(desc);}
			set{desc = UrlEncode(value);}
		}

		private string attach = "";

		/// <summary>
		/// 指令标识,每次指令都会有这个字段,财付通在处理完成后会原样返回.
		/// </summary>
		public string Attach
		{
			get{return UrlDecode(attach);}
			set{attach = UrlEncode(value);}
		}


		private int payresult;
		
		public const int PAYOK = 0;
		public const int PAYSPERROR = 1;
		public const int PAYMD5ERROR = 2;
		public const int PAYERROR = 3;

		/// <summary>
		/// 支付结果 
		/// 0:支付成功.
		/// 1:商户号错.
		/// 2:签名错误.
		/// 3:支付失败.
		/// </summary>
		public int PayResult
		{
			get{return payresult;}
		}

		/// <summary>
		/// 支付结果说明字段
		/// </summary>
		public string PayResultStr
		{
			get
			{
				switch(payresult)
				{
					case PAYOK :
						return "支付成功";
					case PAYSPERROR :
						return "商户号错";
					case PAYMD5ERROR :
						return "签名错误";
					case PAYERROR :
						return "支付失败";
					default :
                        return "未知类型(" + payresult +")";
				}
			}
		}

		private string payerrmsg = "";

		/// <summary>
		/// 如果为支付失败时,财付通返回的错误信息
		/// </summary>
		public string PayErrMsg
		{
			get{return payerrmsg;}
		}

		/// <summary>
		/// 对字符串进行URL编码
		/// </summary>
		/// <param name="instr">待编码的字符串</param>
		/// <returns>编码结果</returns>
		private static string UrlEncode(string instr)
		{
			if(instr == null || instr.Trim() == "")
				return "";
			else
			{
				return instr.Replace("%","%25").Replace("=","%3d").Replace("&","%26").
					Replace("\"","%22").Replace("?","%3f").Replace("'","%27").Replace(" ","%20");
			}
		}

		/// <summary>
		/// 对字符串进行URL解码
		/// </summary>
		/// <param name="instr">待解码的字符串</param>
		/// <returns>解码结果</returns>
		private static string UrlDecode(string instr)
		{
			if(instr == null || instr.Trim() == "")
				return "";
			else
			{
				return instr.Replace("%3d","=").Replace("%26","&").Replace("%22","\"").Replace("%3f","?")
					.Replace("%27","'").Replace("%20"," ").Replace("%25","%");
			}
		}

		/// <summary>
		/// 获取大写的MD5签名结果
		/// </summary>
		/// <param name="encypStr"></param>
		/// <returns></returns>
		private static string GetMD5(string encypStr)
		{
			string retStr;
			MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();

			//创建md5对象
			byte[] inputBye;
			byte[] outputBye;

			//使用GB2312编码方式把字符串转化为字节数组.
			inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr);
			
			outputBye = m5.ComputeHash(inputBye);

			retStr = System.BitConverter.ToString(outputBye);
			retStr = retStr.Replace("-", "").ToUpper();
			return retStr;
		}

		/// <summary>
		/// 构造函数
		/// </summary>
		public Md5Pay()
		{

		}

		/// <summary>
		/// 支付请求设置参数函数
		/// </summary>
		/// <param name="adesc">商品名称</param>
		/// <param name="adate">支付日期</param>
		/// <param name="abillno">商户订单号</param>
		/// <param name="atotalfee">订单金额(以分为单位)</param>
		/// <param name="aattach">指令标识数据</param>
		public void InitPayParam(string adesc, string adate, int abillno, long atotalfee, string aattach)
		{
			Desc = adesc;
			Date = adate;			
			Sp_billno = abillno;
			Total_fee = atotalfee;
			Attach = aattach;
		}


		/// <summary>
		/// 获取支付签名
		/// </summary>
		/// <returns>根据参数得到签名</returns>
		private string GetPaySign()
		{
			string sign_text = "cmdno=" + cmdno + "&date=" + Date + "&bargainor_id=" + bargainor_id 
				+ "&transaction_id=" + Transaction_id + "&sp_billno=" + sp_billno +  "&total_fee=" 
				+ total_fee + "&fee_type=" + fee_type + "&return_url=" + return_url +  "&attach=" + Attach + "&key=" + key;

			return GetMD5(sign_text);
		}

		/// <summary>
		/// 获取支付结果签名
		/// </summary>
		/// <returns>根据参数得到签名</returns>
		private string GetPayResultSign()
		{
			string sign_text = "cmdno=" + cmdno + "&pay_result=" + payresult + "&date=" + date + "&transaction_id=" + transaction_id 
				+ "&sp_billno=" + sp_billno + "&total_fee=" + total_fee + "&fee_type=" + fee_type + "&attach=" + attach + "&key=" + key;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -