有谁作过工行HS接口的网上支付。请帮忙解决一下!1.签名信息”和“商城证书”的base64编码?2.编写CGI程序接收工行如下的http请求?
工行通知商户的交易结果信息的内容由订单信息和订单支付结果信息组成如下格式:
UserID=商户代码&orderNum=订单号&amount=订单金额 &tranDate=交易日期&tranSerialNum=订单流水号码 &authNum=单授权号码 &succMark= 成功失败标志&comment=失败原因&curType=币种代码&hsmsgType= 通知信息类型&signMsg=数字签名信息(BASE64编码)

解决方案 »

  1.   

    response.redirect(page?UserID=商户代码&orderNum=订单号&amount=订单金额 &tranDate=交易日期&tranSerialNum=订单流水号码 &authNum=单授权号码 &succMark= 成功失败标志&comment=失败原因&curType=币种代码&hsmsgType= 通知信息类型&signMsg=数字签名信息(BASE64编码))
      

  2.   

    TO: gjinlin(阿林)
    这个我知道,需要的如何编码以及如何对工行传过来的进行验证等等
      

  3.   

    我们这的工行都是用java+Linux服务器的..这是他们的要求。
      

  4.   

    他们不是提供了很多平台下的接口吗?
    我想用.NET实现,可不知如何是好?
    dll文件不能引用,不能注册
      

  5.   

    他的HS接口下的API函数中有个dll目录下有个infosecapi.dll1、调用签名接口对数据签名,接口如下:C接口
    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错误
    上面是说明文档,请问我要如何使用?
      

  6.   

    他的HS接口下的API函数中有个dll目录下有个infosecapi.dll1、调用签名接口对数据签名,接口如下:C接口
    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错误
    上面是说明文档,请问我要如何使用?
      
      

  7.   

    集合CSDN的力量,大家一起来解决这个问题,并讨论出最好的网上支付方案
      

  8.   

    infosecapi.dll是一个API,不是COM。COM才能被注册、才能被引用,API是不能被注册和引用的调用它提供的接口函数,你需要用Declare语句、DllImportAttribute 类,你自己去查帮助吧
      

  9.   

    谢谢:CityBird(鹰扬九洲——只有想不到的,没有做不到的)
    我查下帮助--DllImportAttribute 类大家好有什么好的意见和建议提出来
      

  10.   

    具体的调用该如何写呢?
    declare如何用呢?
      

  11.   

    public Declare Function sign Lib "LibFile" (......) As longLibFile部分是infosecapi.dll文件的绝对路径。
    如果infosecapi.dll文件在系统目录(2000的System32目录)下,LibFile可以直接用Infosecapi.dll代替。......部分是对应的参数
      

  12.   

    实在不行的话,base64编码是挺容易的,我告诉你算法,你可以自己写个函数实现,就行,;但是数字签名不知道他用的是什么算法,是基于RSA的HAS-1或者是基于DSA的MD5,但这两个算法都很复杂,但这都是标准的算法,应该有相应的C函数供调用,.我是搞Java和Jsp的,对于CGI不是很了解,我把BASE64的编码算法贴在下边,供大家参考.
      

  13.   

    首先更正:上贴中HAS-1应该是SHA-1.
    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码进行替换就行了.
      

  14.   

    这要利用到位运算,C语言的位运算的能力挺强的了.轻松应付.哈哈.
    三个字节共是24个bit,刚好可以转换成4个Base64单元.所以先把签名的byte数组每三个为一个小的处理单元,进行分组,之后循环处理.如果有零头,如剩余一个或两个byte,那再单独处理了.
      

  15.   

    真巧,我前几天也正在做这个工行的B2C系统刚刚调试完成,不过我用的是asp做的,由于我不会asp.net,这里只把我的过程说出来,希望对楼主有所帮助HS接口-JAVA环境-ASP语言,工行网上支付接口步骤
    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
      

  16.   


    TO: 54netkey() 。
    对的,他提供的资料中是有这些文档,不过ICBCEBANKUTIL.B2CUtil 无法注册,提示错误:
    找不到指定的模块
      

  17.   

    我用ASP的来测试时提示如下错误:Microsoft VBScript 运行时错误 错误 '800a01ad' ActiveX 部件不能创建对象: 'ICBCEBANKUTIL.B2CUtil' /gh/b2c.asp,行 6 大家看看这是什么错误?
      

  18.   

    angelboycn?是安全天使?呵呵~~在程序里留后门是没有作用滴~~商户和工行之间有签名证书和相关的加密的
      

  19.   

    TO:54netkey() 
    谢谢!好的