http://blog.csdn.net/sufei1013/article/details/5299547
这两天写支付宝接口, 这个话题不新了, 因为很多人都 做过了, 在这里我说说我的看法吧, 先说一下实现
其实支付宝公司已经给我们做的很好了, 只要少量的改动就OK了,只是有的程序员不太明天他们的动作流程而以,我就以及时到帐为例子来说了,呵呵
在这之前就大家先下载一下c#版的及时到帐代码 这里是下载地址http://dev.alipay.com/devclub/mvnforum/viewthread_thread,4;jsessionid=595DB7442AAA5CD2FC849E7C2FBE51D7
先看一下程序的结构吧
支付宝有一个类文件叫 AliPay 是一些加密算法之类的东西,包括构造URL
要吧看一下这个类的全部内容
usingSystem.Web;
usingSystem.Text;
usingSystem.Security.Cryptography;
usingSystem.IO;
usingSystem.Net;
usingSystem;
///<summary>
///NewInterfaceforAliPay
///</summary>
namespaceGateway
{
publicclassAliPay
{
///<summary>
///与ASP兼容的MD5加密算法
///</summary>
publicstaticstringGetMD5(strings,string_input_charset)
{
MD5md5=newMD5CryptoServiceProvider();
byte[]t=md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s));
StringBuildersb=newStringBuilder(32);
for(inti=0;i<t.Length;i++)
{
sb.Append(t[i].ToString("x").PadLeft(2,'0'));
}
returnsb.ToString();
}
///<summary>
///冒泡排序法
///按照字母序列从a到z的顺序排列
///</summary>
publicstaticstring[]BubbleSort(string[]r)
{
inti,j;//交换标志
stringtemp;
boolexchange;
for(i=0;i<r.Length;i++)//最多做R.Length-1趟排序
{
exchange=false;//本趟排序开始前,交换标志应为假
for(j=r.Length-2;j>=i;j--)
{//交换条件
if(System.String.CompareOrdinal(r[j+1],r[j])<0)
{
temp=r[j+1];
r[j+1]=r[j];
r[j]=temp;
exchange=true;//发生了交换,故将交换标志置为真
}
}
if(!exchange)//本趟排序未发生交换,提前终止算法
{
break;
}
}
returnr;
}
///<summary>
///生成URL链接或加密结果
///</summary>
///<paramname="para">参数加密数组</param>
///<paramname="_input_charset">编码格式</param>
///<paramname="sign_type">加密类型</param>
///<paramname="key">安全校验码</param>
///<returns>字符串URL或加密结果</returns>
publicstaticstringCreatUrl(
//stringgateway,//GET方式传递参数时请去掉注释
string[]para,
string_input_charset,
stringsign_type,
stringkey
)
{
inti;
//进行排序;
string[]Sortedstr=BubbleSort(para);
//构造待md5摘要字符串;
StringBuilderprestr=newStringBuilder();
for(i=0;i<Sortedstr.Length;i++)
{
if(i==Sortedstr.Length-1)
{
prestr.Append(Sortedstr[i]);
}
else
{
prestr.Append(Sortedstr[i]+"&");
}
}
prestr.Append(key);
//生成Md5摘要;
stringsign=GetMD5(prestr.ToString(),_input_charset);
//以下是POST方式传递参数
returnsign;
//以下是GET方式传递参数
//构造支付Url;
//char[]delimiterChars={'='};
//StringBuilderparameter=newStringBuilder();
//parameter.Append(gateway);
//for(i=0;i<Sortedstr.Length;i++)
//{//UTF-8格式的编码转换
//parameter.Append(Sortedstr[i].Split(delimiterChars)[0]+"="+HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1])+"&");
//}
//
//parameter.Append("sign="+sign+"&sign_type="+sign_type);
//
////返回支付Url;
//returnparameter.ToString();
}
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
publicstaticstringGet_Http(stringa_strUrl,inttimeout)
{
stringstrResult;
try
{
HttpWebRequestmyReq=(HttpWebRequest)HttpWebRequest.Create(a_strUrl);
myReq.Timeout=timeout;
HttpWebResponseHttpWResp=(HttpWebResponse)myReq.GetResponse();
StreammyStream=HttpWResp.GetResponseStream();
StreamReadersr=newStreamReader(myStream,Encoding.Default);
StringBuilderstrBuilder=newStringBuilder();
while(-1!=sr.Peek())
{
strBuilder.Append(sr.ReadLine());
}
strResult=strBuilder.ToString();
}
catch(Exceptionexp)
{
strResult="错误:"+exp.Message;
}
returnstrResult;
}
}
}

代码
usingSystem.Text;
usingSystem.Security.Cryptography;
usingSystem.IO;
usingSystem.Net;
usingSystem;
///<summary>
///NewInterfaceforAliPay
///</summary>
namespaceGateway
{
publicclassAliPay
{
///<summary>
///与ASP兼容的MD5加密算法
///</summary>
publicstaticstringGetMD5(strings,string_input_charset)
{
MD5md5=newMD5CryptoServiceProvider();
byte[]t=md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s));
StringBuildersb=newStringBuilder(32);
for(inti=0;i<t.Length;i++)
{
sb.Append(t[i].ToString("x").PadLeft(2,'0'));
}
returnsb.ToString();
}
///<summary>
///冒泡排序法
///按照字母序列从a到z的顺序排列
///</summary>
publicstaticstring[]BubbleSort(string[]r)
{
inti,j;//交换标志
stringtemp;
boolexchange;
for(i=0;i<r.Length;i++)//最多做R.Length-1趟排序
{
exchange=false;//本趟排序开始前,交换标志应为假
for(j=r.Length-2;j>=i;j--)
{//交换条件
if(System.String.CompareOrdinal(r[j+1],r[j])<0)
{
temp=r[j+1];
r[j+1]=r[j];
r[j]=temp;
exchange=true;//发生了交换,故将交换标志置为真
}
}
if(!exchange)//本趟排序未发生交换,提前终止算法
{
break;
}
}
returnr;
}
///<summary>
///生成URL链接或加密结果
///</summary>
///<paramname="para">参数加密数组</param>
///<paramname="_input_charset">编码格式</param>
///<paramname="sign_type">加密类型</param>
///<paramname="key">安全校验码</param>
///<returns>字符串URL或加密结果</returns>
publicstaticstringCreatUrl(
//stringgateway,//GET方式传递参数时请去掉注释
string[]para,
string_input_charset,
stringsign_type,
stringkey
)
{
inti;
//进行排序;
string[]Sortedstr=BubbleSort(para);
//构造待md5摘要字符串;
StringBuilderprestr=newStringBuilder();
for(i=0;i<Sortedstr.Length;i++)
{
if(i==Sortedstr.Length-1)
{
prestr.Append(Sortedstr[i]);
}
else
{
prestr.Append(Sortedstr[i]+"&");
}
}
prestr.Append(key);
//生成Md5摘要;
stringsign=GetMD5(prestr.ToString(),_input_charset);
//以下是POST方式传递参数
returnsign;
//以下是GET方式传递参数
//构造支付Url;
//char[]delimiterChars={'='};
//StringBuilderparameter=newStringBuilder();
//parameter.Append(gateway);
//for(i=0;i<Sortedstr.Length;i++)
//{//UTF-8格式的编码转换
//parameter.Append(Sortedstr[i].Split(delimiterChars)[0]+"="+HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1])+"&");
//}
//
//parameter.Append("sign="+sign+"&sign_type="+sign_type);
//
////返回支付Url;
//returnparameter.ToString();
}
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
publicstaticstringGet_Http(stringa_strUrl,inttimeout)
{
stringstrResult;
try
{
HttpWebRequestmyReq=(HttpWebRequest)HttpWebRequest.Create(a_strUrl);
myReq.Timeout=timeout;
HttpWebResponseHttpWResp=(HttpWebResponse)myReq.GetResponse();
StreammyStream=HttpWResp.GetResponseStream();
StreamReadersr=newStreamReader(myStream,Encoding.Default);
StringBuilderstrBuilder=newStringBuilder();
while(-1!=sr.Peek())
{
strBuilder.Append(sr.ReadLine());
}
strResult=strBuilder.ToString();
}
catch(Exceptionexp)
{
strResult="错误:"+exp.Message;
}
returnstrResult;
}
}
}
而我们一般不用管这个类,只要保证能调用 的到就行了,不用管他
我们要做的很少,他是怎么工作的呢,
这是开发文档里的工作图
其实我们要处理的只有三个Aspx的文件,
先看第一个吧 Default.aspx
这是一个请求的界面