接入说明 #

板式文件说明 #

相关术语 #

术语 说明
电子发票 指经营活动中开具或收取的数据电文形式的收付款凭证,即传统发票的电子版。
数电票 全面数字化的电子发票,是一种全新的发票形式,具有与纸质发票同等的法律效力。
电子行程单 亦称为航空运输电子客票行程单,它既是旅客购买电子客票的支付凭证,也是报销凭证,可以将其视作一种特殊样式的数电票,同样可作为报销依据。
行程单号 行程单的唯一编号,用于查询和核对。

加密算法 #


  private static final Charset CHARSET = StandardCharsets.UTF_8;

  private static final String KEY_ALGORITHM = "AES";
  /**
   * 签名算法
   */
  public static final String SIGN_ALGORITHMS = "SHA1PRNG";

  private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//默认的加密算法

  private static final int KEY_LENGTH = 128;

  /**
   * AES 加密操作
   *
   * @param content 待加密内容
   * @param key     加密密钥
   * @return 返回Base64转码后的加密数据
   */
  public static String encrypt(String content, String key) throws Exception {
    // 创建密码器
    Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);

    byte[] byteContent = content.getBytes(CHARSET);

    // 初始化为加密模式的密码器
    cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));

    // 加密
    byte[] result = cipher.doFinal(byteContent);

    //通过Base64转码返回
    return Base64Util.encryptBASE64(result);
  }

  /**
   * AES 解密操作
   *
   * @param content
   * @param key
   * @return
   */
  public static String decrypt(String content, String key) throws Exception {
    //实例化
    Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
    //使用密钥初始化,设置为解密模式
    cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));

    //执行操作
    byte[] result = cipher.doFinal(Base64Util.decryptBASE64(content));


    return new String(result, CHARSET);
  }

  /**
   * 生成加密秘钥
   *
   * @return
   */
  private static SecretKeySpec getSecretKey(final String key) throws NoSuchAlgorithmException {
    //返回生成指定算法密钥生成器的 KeyGenerator 对象
    KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);

    SecureRandom random = SecureRandom.getInstance(SIGN_ALGORITHMS);
    random.setSeed(key.getBytes(CHARSET));

    //AES 要求密钥长度为 128
    kg.init(KEY_LENGTH, random);

    //生成一个密钥
    SecretKey secretKey = kg.generateKey();
    //// 转换为AES专用密钥
    return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
  }

示例

==> 明文入参

{
  "issueItinerary": {
    "itineraryHeader": {
      "name": "测试测试测试",
      "taxNo": "91000000000000004D",
      "email": "320000002@qq.com",
      "phone": "15000000072",
      "itineraryHeaderType": "BUSINESS"
    },
    "ticketNo": "7312300232918"
  }
}


==> 请求入参加密


curl --location --request POST 'itinerary/issueItinerary' \
--header 'Content-Type: application/json' \
--header 'agency: 12306' \
--header 'APIKEY: ' \
--data-raw '"E+MvgOi+kkT8nTa+WGntCXkraKJtxpNfoB9Zn0AEDpQxR0zb7kLOeuYxfTLGRDCD7oqu1YRq5cEQXninP/syyvemwPR+Tmkgq8/LklJRZvHD5988pdikSPuKcoHefMZZ8+aF1X8X7JeFEPTPG5O0oj+6CD+BIbNpar87WeBrAefXIsAt91pBbZdzLj13sDdM8gZ+YK+TD3RZ8Oh5TIP0H0ji3Yv4zT/2+wt4TSYZxZIEpejhkyDKi4N2DkLgU9gr/JrB7VyOHcDZ0fxFR9jUWQ=="'
        
==> 密文出参

{
    "code": 200,
    "message": "success",
    "data": "bVtXyzT6lKwZucjR0UQ8RjugMeJD6ah44+rvcIQQzD7YsMIlpYRb9/E4SY5EZzj0G959l3B5fROPwmgvDxZVLQy1lVG+jEgpfsp8JS1063Wfci2ohFkf7JQXXYr413W3UXn2yKXXVjFKYKujWeAt6A==",
    "traceId": "2e8001212304af71"
}

==> 密文解密


{
    "code": 200,
    "message": "success",
    "data": {
        "itineraryResult": {
            "ticketNo": "7312300232918",
            "itineraryNum": "25948731112001835359",
            "success": true
        }
    },
    "traceId": "a2b8458f0fcbe9a9"
}

注意事项 #

  1. 入参需要进行AES加密,以字符串形式传入,出参的data需要进行AES解密,文档示例均为明文。

  2. 行程单开具之后,中航信会自动给旅客邮箱发送电子行程单,请确保开具时传入的邮箱地址正确。

  3. 目前客票仅已使用才允许开具电子行程单。

  4. 目前只支持厦门航空180天内航班客票开具电子行程单。

  5. 客票的报销凭证只能选择发票和行程单的一种,不可重复开具。

  6. 目前仅支持OFD行程单文件获取。