接入
<h3>接入描述</h3>
<p>支付请求采用HTTP/HTTPS协议,用户需以POST方式传输给支付中心系统(以下简称支付中心);
支付中心使用的编码方式为:UTF-8;
请严格依照参数规范设置参数,切勿遗漏“必填”参数,注意大小写区分;
建议商户保留以下信息:签名信息、传输参数。</p>
<h3>安全策略</h3>
<p>商户发起交易需指定服务器IP,我方支付平台进行白名单安全组授权;
交易进行MD5签名处理;
交易报文已密文形式交互。</p>
<h3>vbao请求接口Sign计算方式(签名)</h3>
<p>请求参数按照参数名字符升序排列,如果有重复参数名,那么重复的参数再按照参数值的字符升序排列。
所有参数(除了sign和signtype以及参数为空的参数)按照上面的排序用&连接起来,格式是:p1=v1&p2=v2。
(1) 待签名串:
Origin=
(2) 签名方式:
MD5方式:Sign =md5(Origin+md5key)32位大写
9.接口中所有涉及金额的地方都以 分 为单位。</p>
<h3>众诚请求接口Sign计算方式(签名)</h3>
<h4>拼接规则</h4>
<p>无论是请求还是应答,签名原始串按以下方式组装成字符串: 1、除 sign 字段外,所有参数按照字段名的 ascii 码从小到大排序后使用 Querystring 的格式(即 key1=value1&key2=value2…)拼接而成,空值不参与签名组串。 2、签名原始串中,字段名和字段值都采用原始值,不进行 URL Encode。 3、平台返回的应答或通知消息可能会由于升级增加参数,请验证应答签名时注意允许这种情况。</p>
<h4>拼接示例</h4>
<p>使用请求参数中 data 的内容+&key={key}作为签名串,如: channels_info={"trade_no":"123456789"}&nonce_str=123456789&out_trade_no=123456789&partner_id=utic_test& pay_type=01&result_code=SUCCESS&return_code=1&service=pay.alipay.jspay&key=test1234</p>
<h4>生成签名</h4>
<p>使用 md5 算法加密 32 位进行签名,签名串字母为全部小写, 提供 JAVA 加密代码如下,其他语言开发可按要求正确加密即可。 Md5PasswordEncoder md5 = new Md5PasswordEncoder(); md5.setEncodeHashAsBase64(false); string md5token = md5.encodePassword(md5string, null);</p>
<h3>易宝标准接口验签</h3>
<h4>3.1、报文基本格式为 </h4>
<p><?xml version="1.0" encoding="UTF-8"?></p>
<COD-MS>
<SessionHead>
···
<HMAC>1234</HMAC>
</SessionHead>
<SessionBody>
···
</SessionBody>
</COD-MS>
3.2、将报文 <SessionHead>到 </SessionBody>的报文、去除空格、去掉节点 <HMAC>1234</HMAC> ,在末尾加上 秘钥 secretKey,计算MD5
3.3、参考代码:
使用 commons-codec (https://mvnrepository.com/artifact/commons-codec/commons-codec/1.10) 的工具方法,计算 MD5(basicXml+secretKey)
```java
/**
* 和商户交互的hmac的统一计算方法
* @param basicXml 基本xml字符串 不包含 <HMAC>1234</HMAC> 节点内容
* @param secretKey 参与加密的key
* @return
*/
private static String gethmac(String basicXml,String secretKey) {
//根据规则去除 <COD-MS></COD-MS>
basicXml=basicXml.substring(basicXml.indexOf("<SessionHead>"), basicXml.indexOf("</COD-MS>"));
//去除所有空格
basicXml=basicXml.replaceAll(" ", "");
//使用 commons-codec (https://mvnrepository.com/artifact/commons-codec/commons-codec/1.10) 的工具方法,计算 MD5(basicXml+secretKey)
//System.out.println("str=="+basicXml+secretKey);
return DigestUtils.md5Hex(basicXml+secretKey);
}
```
### 加解密说明
加密过程:
一、对原始报文字符串xml进行编码为UTF-8的Base64加密,得到UTF-8编码的字符串str1;
二、对原始报文字符串xml进行编码为UTF-8的哈希SHA1算法加密,得到UTF-8编码的字符串str2;
三、将步骤(二)得到的字符串str2和步骤(一)得到的字符串str1拼接(即str3 = str2+ str1,注意顺序),对拼接后的字符串str3再次进行编码为UTF-8的Base64加密,得到UTF-8编码的最终加密字符串值。
解密过程:
一、对接收到的返回报文字符串returnXml先进行编码为UTF-8的Base64解密,得到字符串returnXml1。
二、对解密后的字符串returnXml1从第40位开始截取到末尾长度得到字符串returnXml2。
三、对截取后的字符串returnXml2进行编码为UTF-8的Base64解密,得到明文返回字符串。