数电票OpenAPI
  1. 开发指南
数电票OpenAPI
  • 开发指南
    • 开发指南
  • 业务接口
    • 数电票
      • 发票开具
      • 发票开具结果查询
      • 发票开具重试
      • 取消发票开具
      • 小票开票-二维码开票
      • 红字确认单申请
      • 红字确认单信息查询
      • 短信登录电子税务局—发送验证码
      • 短信登录电子税务局—校验验证码
      • 获取企业税局扫脸状态
      • 获取扫脸认证二维码
      • 获取企业授信额度信息
      • 开票结果回调(蓝票)
      • 开票结果回调(红票)
      • 开票结果查询(蓝票)
      • 开票结果查询(红票)
      • 查询税局登录状态
    • 附录
      • 附录
  1. 开发指南

开发指南

1. 开发规范#

1.1 通讯规范#

所有报文以JSON格式通过HTTP POST方式到标普智元系统,请求时应设置请求头中Content-Type为UTF-8编码方式,接口响应返回为JSON格式的数据。

1.2安全规范#

1.2.1 签名验签机制#

标普智元需要验证商户上送的签名是否正确;商户收到应答,也需要验证签名是否正确。
1.2.1.1 报文结构#
{

    "clientSerialNo":"1661242378542",

    "data":"eyJuYW1lIjogIuWwj+aYjiIsICJhZ2UiOiA4fQ==",

    "encryptType":"BASE64",

    "merchantNo":"123",

    "signData":"326c67656b1c0093f93adb53eb352305",

    "signType":"MD5",

    "timestamp":1661242378542
}
参数名称是否必填类型长度描述
clientSerialNo请求流水号YString32保证请求唯一
encryptType请求报文加密类型YString8固定BASE64
merchantNo商户编号YString64商户编号,由平台分配
signData报文签名YString详见下面签名方案
signType签名方式YString8固定MD5
timestamp时间戳YString格式:yyyyMMddHHmmss
data加密后的业务报文数据YString解密后是一个json报文
1.2.1.2 报文加签和验签机制#
加密以及加签过程
1.
首先按业务接口字段组装业务报文。
2.
将组装好的业务报文进行base64编码
3.
使用标普智元提供的apiKey加上base64编码后的内容进行Md5加密作为“signData”值,需要转成小写
​ 例如:
apiKey:bmhCpgy9L0ucrQmj2tb2AqfPVImW2xFrFtWYXLVBYQRbEPblw9kg06wC0OcaPHmd
data:eyJuYW1lIjogIuWwj+aYjiIsICJhZ2UiOiA4fQ==
加密前内容为 apiKey+data:
bmhCpgy9L0ucrQmj2tb2AqfPVImW2xFrFtWYXLVBYQRbEPblw9kg06wC0OcaPHmdeyJuYW1lIjogIuWwj+aYjiIsICJhZ2UiOiA4fQ==
加密后内容为:
f21910ca07f639b500fa9821ac2e24fd
验签以及解密过程
1.
获取相应的技术报文,如下
{
    "code":"000000",
    "message":"请求成功",
    "clientSerialNo":"1661242378542",
    "data":"eyJuYW1lIjogIuWwj+aYjiIsICJhZ2UiOiA4fQ==",
    "encryptType":"BASE64",
    "merchantNo":"123",
    "signData":"326c67656b1c0093f93adb53eb352305",
    "signType":"MD5",
    "timestamp":1661242378542
}
2.
返回报文中“code”为 “000000”表示请求成功,进行验签和解密处理,其它值表示请求失败,具体参考附录1
3.
使用标普智元提供的apiKey加上“data”值进行MD5加密后和“signData”对比,如果一致表示验签成功
4.
验签成功后对“data”进行Base64解码后得到相应的json字符串
例如:
解密后data:
{
  "code": "200",
  "message": "操作成功",
  "result": null
}
1.2.1.3 报文加签和验签机制#
加密以及加签过程
1.
首先按业务接口字段组装业务报文。
2.
将组装好的业务报文进行base64编码
3.
使用标普智元提供的apiKey加上base64编码后的内容进行Md5加密作为“signData”值,需要转成小写
​ 例如:
apiKey:bmhCpgy9L0ucrQmj2tb2AqfPVImW2xFrFtWYXLVBYQRbEPblw9kg06wC0OcaPHmd
data:eyJuYW1lIjogIuWwj+aYjiIsICJhZ2UiOiA4fQ==
加密前内容为 apiKey+data:
bmhCpgy9L0ucrQmj2tb2AqfPVImW2xFrFtWYXLVBYQRbEPblw9kg06wC0OcaPHmdeyJuYW1lIjogIuWwj+aYjiIsICJhZ2UiOiA4fQ==
加密后内容为:
f21910ca07f639b500fa9821ac2e24fd
验签以及解密过程
1.
获取相应的技术报文,如下
{
    "code":"000000",
    "message":"请求成功",
    "clientSerialNo":"1661242378542",
    "data":"eyJuYW1lIjogIuWwj+aYjiIsICJhZ2UiOiA4fQ==",
    "encryptType":"BASE64",
    "merchantNo":"123",
    "signData":"326c67656b1c0093f93adb53eb352305",
    "signType":"MD5",
    "timestamp":1661242378542
}
2.
返回报文中“code”为 “000000”表示请求成功,进行验签和解密处理,其它值表示请求失败,具体参考附录1
3.
使用标普智元提供的apiKey加上“data”值进行MD5加密后和“signData”对比,如果一致表示验签成功
4.
验签成功后对“data”进行Base64解码后得到相应的json字符串
例如:
解密后data:
{
  "code": "200",
  "message": "操作成功",
  "result": null
}

1.2.2 请求DEMO(java版)#

1.2.2.1 maven依赖#
<!-- 引用工具包 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.22</version>
</dependency>
1.2.2.2 DEMO#
/**
 * 发票开具结果查询
 */
public void getInvoiceInfo(String requestNo) throws Exception{
    if(StringUtils.isEmpty(requestNo)){
        return;
    }
    // 商户编号(标普智元分配)
    String MERCHANT_NO="xxx";
    // 请求秘钥(标普智元分配)
    String API_KEY="xxx";
    Map<String,Object> dataMap = new HashMap<>();
    // 订单请求流水号
    dataMap.put("requestNo",requestNo);
    String encodeReqData = new String(Base64.encodeBase64(JSONUtil.toJsonStr(dataMap).getBytes("UTF-8")));
    String signData = getStringMD5(API_KEY+encodeReqData);
    Map<String,Object> reqMap = new HashMap<>();
    reqMap.put("clientSerialNo","123456");
    reqMap.put("encryptType","BASE64");
    reqMap.put("merchantNo",MERCHANT_NO);
    reqMap.put("signType","MD5");
    reqMap.put("data",encodeReqData);
    reqMap.put("signData",signData);
    reqMap.put("timestamp",String.valueOf(System.currentTimeMillis()));
    log.info("发票开具结果查询,请求报文:{}", JSONUtil.toJsonStr(reqMap));
    HttpResponse response = HttpRequest.post("http://ibms-test.wecube.com/ibms/invoice/v1/etax/getInvoiceInfo").body(JSONUtil.toJsonStr(reqMap))
            .contentType("application/json;charset=utf-8").timeout(30000).execute();
    log.info("发票开具结果查询,响应报文:{}", JSONUtil.toJsonStr(response));
    String result = response.body();
    Map<String, Object> rspMap = JSONUtil.toBean(result, Map.class);
    if (isSuccessResult(API_KEY, rspMap)) {
        String data = rspMap.get("data").toString();
        String rspData = new String(Base64.decodeBase64(data), Charset.forName("UTF-8"));
        log.info("发票开具结果查询,响应业务对象:{}", rspData);
    } else {
        log.info("发票开具结果查询失败");
    }
}

/**
 * 获取字符串的MD5
 * @param input
 * @return
 */
public String getStringMD5(String input){
    try {
        // get MD5 digest
        MessageDigest mDigest = MessageDigest.getInstance("MD5");
        byte[] inputArr = input.getBytes();
        mDigest.update(inputArr);
        byte[] resultArr = mDigest.digest();
        //
        return byteArrToHex(resultArr).toLowerCase();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

/**
 * 将字节数组转换为16进制字符串
 * @return 16进制字符串
 */
private String byteArrToHex(byte[] byteArr) {
    char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    char[] resultCharArr = new char[byteArr.length*2];
    int index = 0;
    for (byte b : byteArr) {
        resultCharArr[index++] = hexDigits[b>>> 4 & 0xf];
        resultCharArr[index++] = hexDigits[b & 0xf];
    }
    return new String(resultCharArr);
}

/**
 * 判断验签结果是否正确
 */
public boolean isSuccessResult(String apiKey, Map<String, Object> rspMap) {
    try {
        StringBuffer sb = new StringBuffer(apiKey).append(rspMap.get("data"));
        String encodeSignData = getStringMD5(sb.toString());
        return encodeSignData.equals(rspMap.get("signData"));
    } catch (Exception e) {
        return false;
    }
}

1.3请求地址#

环境地址
测试http://ibms-test.wecube.com/
生产https://ibms.biaopu.cloud
下一页
发票开具
Built with