第三方支付接口技能技术总结对接实现及样例Word文档下载推荐.docx
《第三方支付接口技能技术总结对接实现及样例Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第三方支付接口技能技术总结对接实现及样例Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
subject:
商品名称,也可称为订单名称,该接口并不是单一的只能买一样东西,可把一次支付当作一次下订单
body:
商品描述,即备注
total_fee:
商品价格,也可称为订单的总金额
源码分析(C#):
首先必须建立一个通知页面(Notify.aspx)和一个返回页面(Return.aspx)以接受并验证从支付宝返回的信息并对数据库中相应的订单信息做修改处理操作。
代码
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
using
usingSystem.Text;
usingSystem.IO;
usingGateway;
///<
summary>
///创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
///该页面称作“通知页”,是异步被支付宝服务器所调用。
///当支付宝的订单状态改变时,支付宝服务器则会自动调用此页面,因此请做好自身网站订单信息与支付宝上的订单的同步工作
/summary>
publicpartialclassAlipay_Notify:
{
protectedvoidPage_Load(objectsender,EventArgse)
stringalipayNotifyURL=;
//stringalipayNotifyURL="
"
;
//此路径是在上面链接地址无法起作用时替换使用。
stringpartner="
//partner合作伙伴id(必须填写)
stringkey="
//partner的对应交易安全校验码(必须填写)
string_input_charset="
utf-8"
//编码类型,完全根据客户自身的项目的编码格式而定,千万不要填错。
否则极其容易造成MD5加密错误。
alipayNotifyURL=alipayNotifyURL+"
&
partner="
+partner+"
notify_id="
+Request.Form["
notify_id"
];
//获取支付宝ATN返回结果,true是正确的订单信息,false是无效的
stringresponseTxt=AliPay.Get_Http(alipayNotifyURL,120000);
//*******加密签名程序开始*******
inti;
NameValueCollectioncoll;
//LoadFormvariablesintoNameValueCollectionvariable.
coll=Request.Form;
//Getnamesofallformsintoastringarray.
String[]requestarr=coll.AllKeys;
//进行排序;
string[]Sortedstr=AliPay.BubbleSort(requestarr);
//构造待md5摘要字符串;
StringBuilderprestr=newStringBuilder();
for(i=0;
i<
Sortedstr.Length;
i++)
if(Request.Form[Sortedstr[i]]!
="
Sortedstr[i]!
sign"
sign_type"
)
if(i==Sortedstr.Length-1)
prestr.Append(Sortedstr[i]+"
+Request.Form[Sortedstr[i]]);
}
else
+Request.Form[Sortedstr[i]]+"
);
prestr.Append(key);
stringmysign=AliPay.GetMD5(prestr.ToString(),_input_charset);
//*******加密签名程序结束*******
stringsign=Request.Form["
if(mysign==sign&
responseTxt=="
true"
)//验证支付发过来的消息,签名是否正确,只要成功进如这个判断里,则表示该页面已被支付宝服务器成功调用
//但判断内出现自身编写的程序相关错误导致通知给支付宝并不是发送success的消息或没有更新客户自身的数据库的情况,请自身程序编写好应对措施,否则查明原因时困难之极
if(Request.Form["
trade_status"
]=="
WAIT_BUYER_PAY"
)//判断支付状态_等待买家付款(文档中有枚举表可以参考)
//更新自己数据库的订单语句,请自己填写一下
stringstrOrderNO=Request.Form["
out_trade_no"
//订单号
stringstrPrice=Request.Form["
total_fee"
//金额如果你申请了商家购物卷功能,在返回信息里面请不要做金额的判断,否则会校验通过不了。
elseif(Request.Form["
TRADE_FINISHED"
||Request.Form["
TRADE_SUCCESS"
)//判断支付状态_交易成功结束(文档中有枚举表可以参考)
//金额
Response.Write(
success"
//返回给支付宝消息,成功,请不要改写这个success
//success与fail及其他字符的区别在于,支付宝的服务器若遇到success时,则不再发送请求通知(即不再调用该页面,让该页面再次运行起来),
//若不是success,则支付宝默认没有收到成功的信息,则会反复不停地调用该页面直到失效,有效调用时间是24小时以内。
//最好写TXT文件,以记录下是否异步返回记录。
////写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库)
//stringTOEXCELLR="
MD5结果:
mysign="
+mysign+"
sign="
+sign+"
responseTxt="
+responseTxt;
//StreamWriterfs=newStreamWriter(Server.MapPath("
Notify_DATA/"
+"
))+"
.txt"
false,
//fs.Write(TOEXCELLR);
//fs.Close();
Response.Write("
fail"
//写文本,纪录支付宝返回消息,比对md5计算结果(如网站不支持写txt文件,可改成写数据库)
stringTOEXCELLR="
StreamWriterfs=newStreamWriter(Server.MapPath("
:
"
fs.Write(TOEXCELLR);
fs.Close();
///创建该页面文件时,请留心该页面文件是可以对其进行美工处理的,原因在于支付完成以后,当前窗口会从支付宝的页面跳转回这个页面。
///该页面称作“返回页”,是同步被支付宝服务器所调用,可当作是支付完成后的提示信息页,如“您的某某某订单,多少金额已支付成功”。
publicpartialclassAlipay_Return:
+Request.QueryString["
//*******加密签名程序开始//*******
coll=Request.QueryString;
+Request.QueryString[Sortedstr[i]]);
+Request.QueryString[Sortedstr[i]]+"
//生成Md5摘要;
stringsign=Request.QueryString["
//Response.Write(prestr.ToString());
//调试用,支付宝服务器返回时的完整路径。
)//验证支付发过来的消息,签名是否正确
stringstrOrderNO=Request.QueryString["
stringstrPrice=Request.QueryString["
stringstrTradeStatus=Request.QueryString["
TRADE_STATUS"
//订单状态
订单号:
+strOrderNO+"
<
br>
金额:
+strPrice);
//成功,可美化该页面,提示信息
------------------------------------------"
Result:
responseTxt="
+responseTxt);
+mysign);
sign="
+sign);
支付失败"
//支付失败,提示信息
除此之外在Notify.aspx页面和Return.aspx页面公用的一些方法,可以提取出来放在一个公共的类里面(Alipay.cs)
Alipay.cs
usingSystem.Net;
///NewInterfaceforAliPay
namespaceGateway
publicclassAliPay
///与ASP兼容的MD5加密算法
publicstaticstringGetMD5(strings,string_input_charset)
MD5md5=newMD5CryptoServiceProvider();
byte[]t=md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s));
StringBuildersb=newStringBuilder(32);
for(inti=0;
t.Length;
sb.Append(t[i].ToString("
x"
).PadLeft(2,'
0'
));
returnsb.ToString();
///冒泡排序法
///按照字母序列从a到z的顺序排列
publicstaticstring[]BubbleSort(string[]r)
inti,j;
//交换标志
stringtemp;
boolexchange;
r.Length;
i++)//最多做R.Length-1趟排序
exchange=false;
//本趟排序开始前,交换标志应为假
for(j=r.Length-2;
j>
=i;
j--)
{//交换条件
if+1],r[j])<
0)
temp=r[j+1];
r[j+1]=r[j];
r[j]=temp;
exchange
=true;
//发生了交换,故将交换标志置为真
if(!
exchange)//本趟排序未发生交换,提前终止算法
break;
returnr;
///生成URL链接或加密结果
paramname="
para"
>
参数加密数组<
/param>
_input_charset"
编码格式<
加密类型<
key"
安全校验码<
returns>
字符串URL或加密结果<
/returns>
publicstaticstringCreatUrl(
//stringgateway,//GET方式传递参数时请去掉注释
string[]para,
string_input_charset,
stringsign_type,
stringkey
string[]Sortedstr=BubbleSort(para);
prestr.Append(Sortedstr[i]);
stringsign=GetMD5(prestr.ToString(),_input_charset);
//以下是POST方式传递参数
returnsign;
//以下是GET方式传递参数
//构造支付Url;
//char[]delimiterChars={'
='
};
//StringBuilderparameter=newStringBuilder();
//parameter.Append(gateway);
//for(i=0;
//{//UTF-8格式的编码转换
//parameter.Append(Sortedstr[i].Split(delimiterChars)[0]+"
+HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1])+"
//}
//
//parameter.Append("
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)
错误:
+exp.Message;
returnstrResult;
publicpartialclass_Default:
protectedvoidBtnAlipay_Click(objectsender,EventArgse)
//业务参数赋值;
stringgateway=;
//支付接口
stringservice="
create_direct_pay_by_user"
//服务名称,这个是识别是何接口实现何功能的标识,请勿修改
stringseller_email="
//商家签约时的支付宝帐号,即收款的支付宝帐号
stringsign_type="
MD5"
//加密类型,签名方式“不用改”
//商户ID,合作身份者ID,合作伙伴ID
stringshow_