📄 md5pay.cs
字号:
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 + -