接入说明 #
板式文件说明 #
相关术语 #
| 术语 | 说明 |
|---|---|
| 电子发票 | 指经营活动中开具或收取的数据电文形式的收付款凭证,即传统发票的电子版。 |
| 数电票 | 全面数字化的电子发票,是一种全新的发票形式,具有与纸质发票同等的法律效力。 |
| 电子行程单 | 亦称为航空运输电子客票行程单,它既是旅客购买电子客票的支付凭证,也是报销凭证,可以将其视作一种特殊样式的数电票,同样可作为报销依据。 |
| 行程单号 | 行程单的唯一编号,用于查询和核对。 |
加密算法 #
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"
}
注意事项 #
入参需要进行AES加密,以字符串形式传入,出参的data需要进行AES解密,文档示例均为明文。
行程单开具之后,中航信会自动给旅客邮箱发送电子行程单,请确保开具时传入的邮箱地址正确。
目前客票仅已使用才允许开具电子行程单。
目前只支持厦门航空180天内航班客票开具电子行程单。
客票的报销凭证只能选择发票和行程单的一种,不可重复开具。
目前仅支持OFD行程单文件获取。