刚开发完工行网上支付接口。看过很多人也问过、写过这类的文章,内容和开发文档中
一致,没什么纰漏。但实际开发中会遇到很多的小细节,在这里就遇到的问题和具体的
开发例子说一说。
我的开发环境vs.net2003,语言C#。准备工作,按照文档里注册com组件、拆分证书并
安装。开发文档中有一个pfx后缀的证书,和一个名为public.crt的公钥,这个公钥之
后会用到。
传递表单页面命名为Post.aspx,接收银行通知页面Get.aspx。Post前台代码如下:
<%@ Page language="c#" %>
Get.aspx页面代码如下:
<%@ Page language="c#" %>
<%
//下面是获取银行返回的信息
string amount = Request.Form["amount"].ToString();
string comment=Request.Form["comment"].ToString();
string curType=Request.Form["curType"].ToString();
string JoinFlag=Request.Form["JoinFlag"].ToString();
string merAcct=Request.Form["merAcct"].ToString();
string merID=Request.Form["merID"].ToString();
string notifyDate=Request.Form["notifyDate"].ToString();
string orderDate=Request.Form["orderDate"].ToString();
string orderid = Request.Form["orderid"].ToString();
string remark1=Request.Form["remark1"].ToString();
string remark2=Request.Form["remark2"].ToString();
string resultType=Request.Form["resultType"].ToString();
string TranSerialNo=Request.Form["TranSerialNo"].ToString();
string tranStat=Request.Form["tranStat"].ToString();
string UserNum=Request.Form["UserNum"].ToString();
string verifyJoinFlag=Request.Form["verifyJoinFlag"].ToString();
string interfaceName=Request.Form["interfaceName"].ToString();
string interfaceVersion=Request.Form["interfaceVersion"].ToString();
string signMsg = Request.Form["signMsg"].ToString();
string path1 = "cpublic.crt";
string path2 = "icbm.crt";
string path3 = "icbm.key";
string key = "111111";
//下面是银行返回明文的格式
string str = "interfaceName="+interfaceName+"&interfaceVersion="+interfaceVersion+"&orderid="+orderid+"&TranSerialNo="+TranSerialNo+"&amount="+amount+"&curType="+curType+"&merID="+merID+"&merAcct="+merAcct+"&verifyJoinFlag="+verifyJoinFlag+"&JoinFlag="+JoinFlag+"&UserNum="+UserNum+"&resultType="+resultType+"&orderDate="+orderDate+"¬ifyDate="+notifyDate+"&tranStat="+tranStat+"&comment="+comment+"&remark1="+remark1+"&remark2="+remark2;
if (tranStat == "1") //判断银行处理订单的返回类型,1为支付成功
{
ICBCEBANKUTILLib.B2CUtil obj = new ICBCEBANKUTILLib.B2CUtilClass();
obj.init(path1,path2,path3,key); //初始化组件
if ( obj.verifySignC(str,str.Length,signMsg,signMsg.Length) == 0) //判断验证银行签名是否成功
{
这里操作数据库
Response.Write(这里输出支付成功后网站自己的返回地址);
}
}
else
{
这里操作数据库
}
%>
这个页面要注意的是,不能有任何的html标记,只留下代码即可。因为银行有超时限制,所以这个页面操作不要太费时,要尽快结束操
作或尽快返回网站地址。由于银行默认80端口,所以网站也要默认是80端口,否则会访问不到这个页面。自己开发时用的是银行提供的
测试地址,这种情况有可能出现不返回银行通知的可能。正是环境下没什么问题。