易生云MIS技术文档
  1. 2. 接口规范
易生云MIS技术文档
  • 文本修改记录
  • 1. 综述
    • 1.1 阅读人员
    • 1.2 定义和术语
    • 1.3 场景和模型
    • 1.4 对接流程
    • 1.5 工具使用说明
  • 2. 接口规范
    • 1. 接口须知
    • 2. 接口规范
    • 3. 签名验签
    • 4. 签名及验签v1
    • 5. 统一示例参数
    • 4. 生成商户公私钥
      VIEW
  • 3. MIS推送接口定义
    • 3.1 推送交易
      POST
    • 3.2 交易查询
      POST
  • 4. 终端推送接口定义
    • 4.1 查询交易详情
      POST
    • 4.2 推送交易
      POST
    • 4.3 获取MQTT连接三元组接口
      LINK
    • 4.4 获取MQTT连接三元组接口
      POST
  • 5. ERP接口定义
    • 5.1 订单创建
      POST
    • 5.2 交易详情
      POST
    • 5.3 交易列表
      POST
    • 5.4 交易成功通知
      POST
  • 6. POS接口定义
    • 6.8 收银员结算
      • 6.8.1 结算信息预览
      • 6.8.2 收银员结算
      • 6.8.3 结算历史分页查询
      • 6.8.4 结算交易分页查询
    • 6.1 待支付订单详情查询
      POST
    • 6.2 待支付订单查询
      POST
    • 6.3 手工录入
      POST
    • 6.4 订单取消
      POST
    • 6.5 需退款订单查询
      POST
    • 6.6 退款订单创建
      POST
    • 6.7 账本查询
      POST
    • 6.9 MIS三方调用报文
      POST
  • 7. 附录
    • 7.1 交易代码定义
    • 7.2 交易状态定义
    • 7.3 请求支付方式
    • 7.4 接口返回码
    • 7.5 公用请求信息
    • 7.6 终端TPDU报文头规范
    • 7.7 支付方式
    • 7.8 卡类型
    • 7.9 计算交易类型
  1. 2. 接口规范

4. 签名及验签v1

数字签名

为了保证数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验。
数字签名有两个步骤,先按一定规则拼接要签名的原始串,再选择具体的算法和私钥计算出签名结果。
整体流程:请求时使用商户私钥加签,根据规则生成sign上送到易生,易生会使用商户公钥对商户报文进行验签,然后返回报文中包含易生私钥加签的sign字段,商户收到后使用易生提供的统一公钥进行验签,以保证传输过程中报文的安全性。

签名原始串

无论是请求还是应答,签名原始串按以下方式组装成字符串:

  1. 参数使用QueryString的格式(即key1=value1&key2=value2…)拼接而成,空值不参与签名
  2. 上述字符都是原始串,不要使用URLEncode
  3. 报文签名说明
    数据签名 数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接收签名数据之后进行签名校验。
    要求对报文(只对data一个字段进行签名)做签名,然后赋值给sign(签名值)字段,根据报文规则上传至易生服务器

签名方式

使用的签名算法为SM2,使用商户私钥加签, 加签串使用默认Asn编码不压缩。

签名报文组装

将请求报文中data字段值按照名称的ASCII码从小到大进行排序以&连接,如果名称的首字母相同,则比较第二个字母,以此类推拼接成key=value&key=value的字符串,然后进行签名,保留原始串不用urlencode,并且赋值给sign。

返回报文验签

返回报文先验签再反序列化为对象,者将请求报文中data字段值按照名称的ASCII码从小到大进行排序以&连接,如果名称的首字母相同,则比较第二个字母,以此类推拼接成key=value&key=value的字符串(同加签),使用易生提供的公钥验签来保证数据的有效性。

orgTrace 说明商户流水号,规则yyyyMMddHHmmss+自定义流水订单信息,如:20220418210000qqqqqqqq

拼接需要签名的数据示例:

/**

  • 排序拼接需要签名的数据
  • @param data /
  • @return /
    */
    public static String getSignStr(JSONObject data){
    Set keySet = data.keySet();
    String[] keyArray = keySet.toArray(new String[0]);
    Arrays.sort(keyArray);
    StringBuilder sb = new StringBuilder();
    for (String k : keyArray) {
    // 参数值为空,则不参与签名
    if (data.get(k) != null && data.get(k).toString().trim().length() > 0) {
    sb.append(k).append("=").append(data.get(k).toString().trim()).append("&");
    }
    }
    return sb.substring(0,sb.toString().lastIndexOf("&"));
    }
加签/验签使用示例:

public static void main(String[] args) {

String privateKey = "BA76B0454AEE342F59AABE820F07359E5DE08D9FD394A8EFAF51D07EECEAE21F";
String publicKey = "02485EC4E3AF05580869F1862AB2F2BCDFAB08819616890D597E0D455F56A0CC61";
try {
System.out.println("公钥:" + publicKey);
System.out.println("私钥:" + privateKey);
JSONObject jsonObject = new JSONObject();
jsonObject.put("refNo" ,"000088886785");
jsonObject.put("termCode" ,"88888887");
jsonObject.put("tradeDate" ,"20120509");
String req = getReqStr(jsonObject);
System.out.println("待加签:" + req);
String sign = SMCryptUtils.sm2Sign(req, privateKey);
System.out.println("签名:" + sign);
boolean signRes = SMCryptUtils.sm2ServiceVerifySign(req, sign,publicKey);
System.out.println("验签结果:" + signRes);
} catch (CryptoException e) {
throw new RuntimeException(e);
}

}

测试密钥信息

商户编号(orgId)

555555555555555

密钥特别说明:
公钥使用编码过66位,参考SM2密钥生成规则【公钥使用压缩格式02/03开头】,可参考:
获取签名秘钥对 生成公私钥

java引入包:JAVA国密工具库

加签私钥 商户私钥(后续由商户生成对,公钥提供给易生merPriKey):

BA76B0454AEE342F59AABE820F07359E5DE08D9FD394A8EFAF51D07EECEAE21F

验签公钥 商户公钥(后续由商户生成对,公钥提供给易生merPubKey):

02485EC4E3AF05580869F1862AB2F2BCDFAB08819616890D597E0D455F56A0CC61

附测试加签后报文,加签模式【C1C3C2】

公钥:02485EC4E3AF05580869F1862AB2F2BCDFAB08819616890D597E0D455F56A0CC61
私钥:BA76B0454AEE342F59AABE820F07359E5DE08D9FD394A8EFAF51D07EECEAE21F
源数据:111111
sign r size: 33, hex: 00ee459b659028fa5e8f41c892da5e5df22ce8a31821cd4f2875d021b8d15c7f35
sign r size: 33, hex: 00b271913cc417b9f714b6a9131b4f0df2995a64699fd3b0dba021accb4ec2feb2
签名信息:3046022100EE459B659028FA5E8F41C892DA5E5DF22CE8A31821CD4F2875D021B8D15C7F35022100B271913CC417B9F714B6A9131B4F0DF2995A64699FD3B0DBA021ACCB4EC2FEB2

加密/解签 易生机构公钥(用于易生返回的报文验签):

02AEDBC219CCAC53AF0FDD2AD4583BD58F26AB04D9B88EFDAE041B9D11B4F47380 【测试环境公钥】
02C105E963641BFDB240DDDA7A729F29E79E56F5CF3E00F3F0AE51F6E33017995C 【生产环境公钥】

加密/解签 易生机构私钥(用于商户调试时验证):

FCB39DB317FACF3BB01324ADE5F9D4B439D5642A5FDBD2EA9718F697ADA30EB8

修改于 2024-01-21 03:06:11
上一页
3. 签名验签
下一页
5. 统一示例参数
Built with