有谁作过工行HS接口的网上支付。请帮忙解决一下!1.签名信息”和“商城证书”的base64编码?2.编写CGI程序接收工行如下的http请求?
工行通知商户的交易结果信息的内容由订单信息和订单支付结果信息组成如下格式:
UserID=商户代码&orderNum=订单号&amount=订单金额 &tranDate=交易日期&tranSerialNum=订单流水号码 &authNum=单授权号码 &succMark= 成功失败标志&comment=失败原因&curType=币种代码&hsmsgType= 通知信息类型&signMsg=数字签名信息(BASE64编码)
工行通知商户的交易结果信息的内容由订单信息和订单支付结果信息组成如下格式:
UserID=商户代码&orderNum=订单号&amount=订单金额 &tranDate=交易日期&tranSerialNum=订单流水号码 &authNum=单授权号码 &succMark= 成功失败标志&comment=失败原因&curType=币种代码&hsmsgType= 通知信息类型&signMsg=数字签名信息(BASE64编码)
这个我知道,需要的如何编码以及如何对工行传过来的进行验证等等
我想用.NET实现,可不知如何是好?
dll文件不能引用,不能注册
int sign(char *src,
int srcLen,
unsigned char *privateKey,
int keyLen,
char *keyPass,
unsigned char **signBuf,
int *signBufLen)。
参数说明:
src 为要签名的数据,其长度为:srcLen;
privateKey 为其私钥,长度为:keyLen
keyPass为私钥密码
signBuf 为保存签名的缓冲区的指针,空间由API内部分配。签名后将签名数据保存在此。指针空间的释放由应用程序负责。
signBufLen存放签名数据的长度指针。
返回:0正确,其它错误2、然后调用BASE64编码API对产生的签名数据编码,接口如下:C接口
int base64enc(unsigned char *src, int srcLen, char **dst, int *dstLen)
参数说明:
src源数据,其长度为:srcLen;
dst为编码后的数据,长度存放在:dstLen
dst的存储空间由接口申请,应用释放
返回:0正确,-1错误
上面是说明文档,请问我要如何使用?
int sign(char *src,
int srcLen,
unsigned char *privateKey,
int keyLen,
char *keyPass,
unsigned char **signBuf,
int *signBufLen)。
参数说明:
src 为要签名的数据,其长度为:srcLen;
privateKey 为其私钥,长度为:keyLen
keyPass为私钥密码
signBuf 为保存签名的缓冲区的指针,空间由API内部分配。签名后将签名数据保存在此。指针空间的释放由应用程序负责。
signBufLen存放签名数据的长度指针。
返回:0正确,其它错误2、然后调用BASE64编码API对产生的签名数据编码,接口如下:C接口
int base64enc(unsigned char *src, int srcLen, char **dst, int *dstLen)
参数说明:
src源数据,其长度为:srcLen;
dst为编码后的数据,长度存放在:dstLen
dst的存储空间由接口申请,应用释放
返回:0正确,-1错误
上面是说明文档,请问我要如何使用?
我查下帮助--DllImportAttribute 类大家好有什么好的意见和建议提出来
declare如何用呢?
如果infosecapi.dll文件在系统目录(2000的System32目录)下,LibFile可以直接用Infosecapi.dll代替。......部分是对应的参数
Base64编码就是利用6个二进制位来代表一个ASCII字符,所以一共可以编码64个可打印的ASCII字符,如二进制数"000000"十进制值为"0"来代表字符"A";"000001"值为"1"代表"B";...."011001"值为"25"代表"Z";"26"代表"a"..."51"代表"z";"52"代表"0"..."61"代表"9";"62"是"+","63"是"/";这样每一个6位的二进制组合都对应一个可打印的ASCII字符.
下面的问题,就是如何将签名产生的字节数组转化为以每6个二进制位为一个单元的组合,如果可以转换成这样一个组合,那么就可以轻易的以每个单元的十进制值为索引,利用上面提到的64个Base64码进行替换就行了.
三个字节共是24个bit,刚好可以转换成4个Base64单元.所以先把签名的byte数组每三个为一个小的处理单元,进行分组,之后循环处理.如果有零头,如剩余一个或两个byte,那再单独处理了.
1)搭建java环境及java环境测试:
参见文档:“ICBC API配置使用方法.doc”(这个工行应该提供给你了的)
Win32平台下API配置使用方法
安装、使用方法
1.将dll目录下的.dll文件拷贝到系统的WinNT/System32或Windows/System32下;
2.各个接口的具体使用方法:c版请参见demo.c, java版请参见Test.java;java测试
1.Windows2000,JDK1.3 (jdk包可以网上下载,请注意必须是1.3及其以上版本)
2.在C:盘建立目录test,放入新老证书new.crt, old.cert和对应的私钥文件new.key,old.key;测试用的所有证书我是都放这里的
3.将编译ReutrnValue.java得到的cn.com.infosec.icbc.ReturnValue.class拷到系统的classpath里;
4.将编译Test.java得到的Test.class拷到系统的classpath里,使用命令行运行"java Test",程序依次允许API中的所有的方法,并将结果输出值终端;
证书就用工行所提供的就可以了。第3点提到的系统的classpath是指在环境变量中所列出的任一个目录都可以,当然这对懂一点java的阅者而言是无需多说了。java Test 能顺得输出的话(java可是区分大小写的吆),Java环境就搭建完成了 2)接下来的事就只要看asp开发包就是了当然运行这段asp代码前可别忘了注册 ICBCEBANKUTIL.B2CUtil (运行:regsvr32 ICBCEBANKUTIL.dll),还要就是
(rc=bb.init ("d:\user.crt","d:\user.crt","d:\user.key","12345678"))这里所指出的路径必须要和实际证书存放的路径一致,千万注意别把密码弄错了,对了,应该好像应该先把密钥导入的。运行一下这段asp代码,如果没有错误的话就可以写订单提交页面和信息接收的页面了3)订单提交页面:(参见“中国工商银行网上银行系统B2C子系统商户接口规范20030106V3.4.doc”)
<%
Set bb =CreateObject("ICBCEBANKUTIL.B2CUtil")
rc=bb.init ("d:\icbc\user.crt","d:icbc\user.crt","d:\icbc\user.key","123456")
orderid=rs("orderid")
payment=payment*100
merchantid="120300010002"
interfaceType="HS"
curType="001"
hsmsgType="0"
merURL="http://www.rbcs.cn/icbc/getinfo.asp"'接收信息Url
src=merchantid&merURL&interfaceType&orderid&payment&curType&hsmsgtype
ssrc = bb.signC(src, Len(src))
cert=bb.getCert(1)
%>
<table width=300 align="center">
<tr><td>
<form name=" sendOrder " method="post" action="https://mybank.icbc.com.cn/servlet/com.icbc.inbs.b2c.pay.B2cMerPayReqServlet">
<div align="center">
<input type="hidden" name="merchantid" value="<%=merchantid%>" >
<!--商城代码-->
<input type="hidden" name="interfaceType" value="<%=interfaceType%>" >
<!--接口类型-->
<input type="hidden" name="merURL" value="<%=merURL%>" >
<!--接收工行支付结果信息的程序名称和地址-->
<input type="hidden" name="orderid" value="<%=orderid%>" >
<!--订单号-->
<input type="hidden" name="amount" value="<%=payment%>" >
<!--订单总金额(以分为单位)-->
<input type="hidden" name="curType" value="<%=curType%>" >
<!--币种-->
<input type="hidden" name="hsmsgType" value="<%=hsmsgType%>" >
<!--信息发送类型-->
<input type="hidden" name="signMsg" value="<%=ssrc%>" >
<!--BASE64编码后的交易数据签名信息-->
<input type="hidden" name="cert" value="<%=cert%>" >
<!--BASE64编码后的商户证书-->
<input type="hidden" name="comment1" value="" >
<!--备注字段2-->
<input type="hidden" name="comment2" value="" >
<!--备注字段3-->
<input type="submit" value="工行网上支付">
</div>
</form>
</tb></tr></table>4)接收页:http://www.rbcs.cn/icbc/getinfo.asp中的代码:http://www.rbcs.cn/icbc/dealinfo.asp
这个页面中只提供一个处理信息的页面的地址,其他没有任何东西以下是dealinfo.asp中的部分代码UserID=request.form("UserID")
OrderNum=request.form("orderNum")
Orderid=ordernum
amount=request.form("amount")
payment=amount/100
TranDate=request.form("tranDate")
Transerialnum=request.form("transerialnum")
AuthNum=request.form("authNum")
SuccMark=request.form("succMark") '0 ----成功;1 ----失败;2-----可疑交易
Comment=request.form("comment")
CurType=request.form("curType")
HsmsgType=request.form("hsmsgType")
SignMsg=request.form("signMsg")
Str=""SourceStr="UserID="&UserID&"&orderNum="&OrderNum&"&amount="&amount&"&tranDate="&tranDate&"&tranSerialNum="&tranSerialNum& "&authNum="&authNum&"&succMark="&succMark&"&comment="&comment&"&curType="&curType&"&hsmsgType="&hsmsgType&"&signMsg="&signMsg
Set bb =CreateObject("ICBCEBANKUTIL.B2CUtil")rc=bb.init("d:\icbc\admin.crt","d:\icbc\user.crt","d:\icbc\user.key","123456")src="UserID="&UserID&"&orderNum="&ordernum&"&amount="&amount&"&tranDate="&tranDate&"&tranSerialNum="&transerialnum& "&authNum="&authNum&"&succMark="&succMark&"&comment="&comment&"&curType="&curType&"&hsmsgType="&hsmsgType
'以下是一段代码转换,asp中必须将代码做以下转换
signmsg=Replace(signmsg,"%2B","+")
signmsg=Replace (signmsg,"%2F","/")
signmsg=Replace (signmsg,"%3D","=")
rc=bb.verifySignC(src, Len(src), signmsg, Len(signmsg)) '0:成功 -1:验证失败 -2:解码失败 -100:明文字符串传递有误 -101:签名字符串传递有误
If rc<>0 Then
response.write "数字签名错误"
response.end
Else
根据实际要求对信息进行处理
End If
TO: 54netkey() 。
对的,他提供的资料中是有这些文档,不过ICBCEBANKUTIL.B2CUtil 无法注册,提示错误:
找不到指定的模块
谢谢!好的