银联支付开发需要注意的几点unionpay
python、node、ruby、c++开发包:http://pan.baidu.com/s/1gfNoEUf(未提供全量产品的demo,请先阅读readme) ,C语言有部分代码片段。
其他语言不提供。
签名算法与注意点:
1. 按ascii排序。【注意不是字母顺序】
2. 对1的结果sha1(全渠道5.0.0/二维码平台)或者sha256(全渠道5.1.0)得到byte数组。
3. 对2的结果用16进制小写字符串表示。【注意必须是小写】
4. 对3的结果取byte数组。【注意不是16进制字符串转byte数组,而是当普通字符串转】
5. 对4的结果用私钥算签名,算法为rsawithsha1(全渠道5.0.0/二维码平台)或者rsawithsha256(全渠道5.1.0),得到一个byte数组。
6. 对5的结果做base64,得到一个字符串就是签名。
* C语言开发请特别注意测试公私钥可能和生产的长度不同,实现时请注意不要固定长度做。
验签算法:
全渠道5.0.0/二维码平台:
1-4同签名。
5. 对签名解base64,得到一个byte数组。
6. 调验签函数,算法为rsawithsha1(全渠道5.0.0/二维码平台)或者rsawithsha256(全渠道5.1.0)。
全渠道5.1.0:
1-4同签名。
5. 取出应答报文中的验签证书,使用本地的中级证书和根证书组成证书链验证验签证书;验证证书有效期;验证验签证书中的CN为“中国银联股份有限公司”(生产环境)或者“00040000:SIGN”(测试环境)。
6. 对签名解base64,得到一个byte数组。
7. 调验签函数,用步骤5的证书验证1和6的数据,算法为rsawithsha1(全渠道5.0.0/二维码平台)或者rsawithsha256(全渠道5.1.0)。
报文组成注意点:
1. 对后台报文,请求时需注意把value做url编码,再和key用&和=连接。如:accessType=0&backUrl=https%3a%2f%2f101.231.204.80%3a5000%2fgateway%2fapi%2fbackTransReq.do
2. 字段顺序可打乱。
应答报文处理注意点:
1. 应答报文不带url编码(这个设定可以吐槽一万年),所以对应答报文请不要直接按&符split,建议参考我们开发包的处理方式处理。
2. 我们报文会带换行,且可能同时出现\n和\r\n换行,如果换行处理有问题会验签失败的,所以读应答报文的时候请一个个字节读,不要一行行读。目前换行符出现的规则是:signPubKeyCert是\r\n换行,其他字段是\n换行。
Http请求注意点:
1. 请注意http头加上Content-Type,可是设application/x-www-form-urlencoded之类的常见值。
2. Content-Length如果是自己设置的请注意不要不小心设了0。
3. 请注意实现https的代码,测试环境测试时请设置信任所有证书,生产环境可以只信任权威机构签发证书。
4. 请求头不要加Expect,目前已知Expect :100-continue某些情况会导致后台返回数据不全。20160120确定后台应答长度1247字节时一定会只返1238字节,但远长于远短于这个长度都是正常的,暂不清楚原因。
certId字段说明:
这个字段是从证书里读出来的,如果实在不会写代码,可以PC直接看下序列号,然后把序列号复制出来再转十进制。PC看序列号的方法为:cer文件直接双击打开,pfx文件双击导入浏览器,然后internet选项-内容-证书。
fileContent字段说明
请求时,读取文件byte流,用DEFLATE压缩算法压缩,再Base64加密。
接收应答时,先解base64,再DEFLATE解压,将byte流输出到文件,文件名根据fileName字段命名。批量应答接口文件是纯文本(.txt后缀),代码可以直接读;对账文件下载接口文件是压缩包(.zip后缀),代码要读的话先zip解压再读内容。