HWA005-理赔-第三方退票提交通知接口
<p><strong>简要描述:</strong></p>
<ul>
<li>支付信息修改后,通过退票提交接口通知申能核心</li>
</ul>
<p><strong>应用场景:</strong>
退票修改提交通知接口</p>
<p><strong>请求URL:</strong></p>
<p>135.169地址
外网网135地址(新):<a href="https://sit-claim.95505.cn/httpClaimServices">https://sit-claim.95505.cn/httpClaimServices</a>
生产接口地址:
核心生产外网:<a href="https://claim-net-api.95505.cn/httpClaimServices(需提供ip,加白名单">https://claim-net-api.95505.cn/httpClaimServices(需提供ip,加白名单</a>)</p>
<p><strong>请求方式:</strong></p>
<ul>
<li>POST +JSON</li>
</ul>
<p><strong>调用方法名:</strong></p>
<ul>
<li>autoCommonRefund</li>
</ul>
<p><strong>输入参数:</strong></p>
<p><strong>输出参数:</strong></p>
<p><strong>入参参数说明</strong> </p>
<table>
<thead>
<tr>
<th style="text-align: left;">字段名称</th>
<th style="text-align: left;">英文</th>
<th>类型</th>
<th>是否可空</th>
<th>是否多值</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">httpRequest(请求消息体)</td>
</tr>
<tr>
<td style="text-align: left;">请求交易头信息</td>
<td style="text-align: left;">requestHead</td>
<td>RequestHead</td>
<td>no</td>
<td>no</td>
<td>详见公共参数</td>
</tr>
<tr>
<td style="text-align: left;">客户必须提供的参数对象</td>
<td style="text-align: left;">requestBody</td>
<td>RequestBody</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">RequestHead (请求交易头信息)</td>
</tr>
<tr>
<td style="text-align: left;">服务代码</td>
<td style="text-align: left;">serviceClass</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>HWA005</td>
</tr>
<tr>
<td style="text-align: left;">服务名称</td>
<td style="text-align: left;">serviceName</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>autoCommonRefund</td>
</tr>
<tr>
<td style="text-align: left;">用户代码</td>
<td style="text-align: left;">userCode</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>TACommon-渠道来源-时间戳,希望保--待定 示例:TACommon-healthchcoffline-1592292706</td>
</tr>
<tr>
<td style="text-align: left;">用户名称</td>
<td style="text-align: left;">userName</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>对usercode值进行公钥加密后的密文值</td>
</tr>
<tr>
<td style="text-align: left;">RequestBody (客户必须提供的参数对象)</td>
</tr>
<tr>
<td style="text-align: left;">报案号</td>
<td style="text-align: left;">registNo</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">业务来源</td>
<td style="text-align: left;">businessSources</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>希望保--待定</td>
</tr>
<tr>
<td style="text-align: left;">赔付对象信息</td>
<td style="text-align: left;">clmPaymentInfoList</td>
<td>List<clmPaymentDto></td>
<td>List<clmPaymentDto></td>
<td>CY</td>
<td>no</td>
<td>赔付对象信息</td>
</tr>
<tr>
<td style="text-align: left;">clmPaymentDto</td>
</tr>
<tr>
<td style="text-align: left;">对公对私</td>
<td style="text-align: left;">bankPayType</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>0-对公、1-对私</td>
</tr>
<tr>
<td style="text-align: left;">分支行Code</td>
<td style="text-align: left;">payeeBankCode</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">银行账号</td>
<td style="text-align: left;">accountNo</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">账户名称</td>
<td style="text-align: left;">accountName</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">证件类型</td>
<td style="text-align: left;">idType</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>单独码表</td>
</tr>
<tr>
<td style="text-align: left;">证件号码</td>
<td style="text-align: left;">idNo</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">联系电话</td>
<td style="text-align: left;">payeeMobile</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
</tbody>
</table>
<p><strong>返参参数说明</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">字段名称</th>
<th style="text-align: left;">英文</th>
<th>类型</th>
<th>是否可空</th>
<th>是否多值</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">httpResponse (响应消息体)</td>
</tr>
<tr>
<td style="text-align: left;">响应头信息</td>
<td style="text-align: left;">responseHead</td>
<td>ResponseHead</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">响应体信息</td>
<td style="text-align: left;">responseBody</td>
<td>ResponseBody</td>
<td>yes</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">ResponseHead(响应头信息)</td>
</tr>
<tr>
<td style="text-align: left;">处理结果代码</td>
<td style="text-align: left;">resultCode</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>000-成功;999-失败</td>
</tr>
<tr>
<td style="text-align: left;">错误信息</td>
<td style="text-align: left;">errorMessage</td>
<td>String</td>
<td>yes</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">服务类</td>
<td style="text-align: left;">serviceClass</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>HWA005</td>
</tr>
<tr>
<td style="text-align: left;">服务名称</td>
<td style="text-align: left;">serviceName</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>autoCommonReturnBill</td>
</tr>
</tbody>
</table>
<p><strong>入参示例</strong></p>
<pre><code>{
&quot;httpRequest&quot;: {
&quot;requestHead&quot;: {
&quot;serviceClass&quot;: &quot;HWA005&quot;,
&quot;serviceName&quot;: &quot;autoCommonRefund&quot;,
&quot;userCode&quot;: &quot;TACommon-healthchcoffline-1720163362812&quot;,
&quot;userName&quot;: &quot;EFBC1KPBsE9rtDaU/ztIgnN2hgVtdHdVc2WYBEyUtNPuTRK+BM6nrwwIz4jBc3K02wPmH5c6pFq4\r\nLHqr8k/itWqg67GCqTtjmTC6La7tbhWc5FX/DUwGz2yxjwF1CLfTqyC7qVkuVNdf/WpsB/eVFFPm\r\n02f1thKMgy5AKNR69jo=&quot;
},
&quot;requestBody&quot;: {
&quot;registNo&quot;: &quot;07604311082024220045&quot;,
&quot;businessSources&quot;: &quot;healthchcoffline&quot;,
&quot;clmPaymentInfoList&quot;: [{
&quot;bankPayType&quot;: &quot;1&quot;,
&quot;payeeBankCode&quot;: &quot;10209452&quot;,
&quot;accountNo&quot;: &quot;123456&quot;,
&quot;accountName&quot;: &quot;柳一&quot;,
&quot;idType&quot;: &quot;01&quot;,
&quot;idNo&quot;: &quot;362302195809045015&quot;,
&quot;payeeMobile&quot;: &quot;13200000000&quot;
}]
}
}
}</code></pre>
<p><strong>返回示例</strong></p>
<pre><code>{
&quot;httpResponse&quot;: {
&quot;responseHead&quot;: {
&quot;resultCode&quot;: &quot;000&quot;,
&quot;errorMessage&quot;: &quot;成功&quot;,
&quot;serviceClass&quot;: &quot;HWA005&quot;,
&quot;serviceName&quot;: &quot;autoCommonReturnBill&quot;
}
}
}</code></pre>
<p><strong>加解密</strong></p>
<ul>
<li>针对userCode进行加密,加密后密文存值userName中
<ul>
<li>天安敬之对接密钥 生产密钥和测试环境一致</li>
<li>测试环境私钥:
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIjw3Fpvm3U3mcIe8/wev9dtKGYLJmKaChnbTWfDFEYJs4tJRM9hbPmASwHAPgkuv7StZ854jJzt81w0Px8peBLQNJyQO21TK2k8vyrmMehYkpjev4wMmhy5CAHg2JdWqQhmqKS5raFYXzwRkz8fnucqCbfkXGllsWOFcMI4WxCHAgMBAAECgYBW3y16tYiSMMZ67jXrf/pFiHrzWSltrbiwtH2DUK8Ay1C6EK31PSHrmaZ7ot/35U86KDNNOQ5C03Tpzj8o3p7LqLC/u0e/fSsrY34/iYg7UaQAg2gf8j/XEUhI7QSB9TjdILSg95sEzvbWCnx5SSwxl41XU1vAD28+d6vZ8pgmuQJBANcKgE3f/PAVyaQ9j+1nc9hlCMOdORvbKkhjvgsPzPvYAJYou49OiECFLZhOPNrbQ8dmTQn+4DoPIPo9jEdlrosCQQCjBij33DgoJxbFXcGE+ZeOb9eADvmMi6Jd1AP2BDRrj1uu0cJJCtRWjmemxt3kWkDV2LF4Nq9uq05Ubs/b00F1AkEAxJPe8lGeIcNpD3EPj1CQ//JsbpXdTO+u2XoEkowhMOAmuR4HR1vdBk44fhCXZOIoNbH5HvgV9j06QkfdYq87PQJAGP31w+HH3if37rPr2fXljRmKQQCKs0go0ReSr+F/I8ordQaFMWtumAJm04ODOuG3NNFui45eoKm0bW87gGjHjQI/AlDTZOvTXPmNC2KYhWpL6BYYX8UFnhvZqoSK8Yb+8aGqJq8XAoPtvvcg4GmzkLeLkWT2GraYuWkmlmH/spu+</li>
</ul></li>
<li>测试环境公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCI8Nxab5t1N5nCHvP8Hr/XbShmCyZimgoZ201nwxRGCbOLSUTPYWz5gEsBwD4JLr+0rWfOeIyc7fNcND8fKXgS0DSckDttUytpPL8q5jHoWJKY3r+MDJocuQgB4NiXVqkIZqikua2hWF88EZM/H57nKgm35FxpZbFjhXDCOFsQhwIDAQAB</li>
</ul>
<pre><code> package com.sinosoft.application.common;
import org.apache.commons.codec.binary.Base64;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Map;
import java.util.TreeMap;
public class RSASecurityUtil {
/**
* RSA最大加密明文大小
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/**
* RSA最大解密密文大小
*/
private static final int MAX_DECRYPT_BLOCK = 128;
/**
* 获取密钥对
*
* @return 密钥对
*/
public static KeyPair getKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance(&quot;RSA&quot;);
generator.initialize(1024);
return generator.generateKeyPair();
}
/**
* 获取私钥
*
* @param privateKey 私钥字符串
* @return
*/
public static PrivateKey getPrivateKey(String privateKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(&quot;RSA&quot;);
byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
return keyFactory.generatePrivate(keySpec);
}
/**
* 获取公钥
*
* @param publicKey 公钥字符串
* @return
*/
public static PublicKey getPublicKey(String publicKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance(&quot;RSA&quot;);
byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
return keyFactory.generatePublic(keySpec);
}
/**
* RSA加密
*
* @param data 待加密数据
* @param publicKey 公钥
* @return
*/
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance(&quot;RSA&quot;);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
int inputLen = data.getBytes().length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offset = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offset &gt; 0) {
if (inputLen - offset &gt; MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
}
out.write(cache, 0, cache.length);
i++;
offset = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
// 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串
// 加密后的字符串
return new String(Base64.encodeBase64(encryptedData));
}
/**
* RSA解密
*
* @param data 待解密数据
* @param privateKey 私钥
* @return
*/
public static String decrypt(String data, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance(&quot;RSA&quot;);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] dataBytes = Base64.decodeBase64(data.getBytes());
int inputLen = dataBytes.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offset = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offset &gt; 0) {
if (inputLen - offset &gt; MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
}
out.write(cache, 0, cache.length);
i++;
offset = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
// 解密后的内容
return new String(decryptedData, &quot;UTF-8&quot;);
}
/**
* 签名
*
* @param data 待签名数据
* @param privateKey 私钥
* @return 签名
*/
public static String sign(String data, PrivateKey privateKey) throws Exception {
byte[] keyBytes = privateKey.getEncoded();
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(&quot;RSA&quot;);
PrivateKey key = keyFactory.generatePrivate(keySpec);
Signature signature = Signature.getInstance(&quot;MD5withRSA&quot;);
signature.initSign(key);
signature.update(data.getBytes(&quot;UTF-8&quot;));
return new String(Base64.encodeBase64(signature.sign()));
}
/**
* 验签
*
* @param srcData 原始字符串
* @param publicKey 公钥
* @param sign 签名
* @return 是否验签通过
*/
public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
byte[] keyBytes = publicKey.getEncoded();
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(&quot;RSA&quot;);
PublicKey key = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(&quot;MD5withRSA&quot;);
signature.initVerify(key);
signature.update(srcData.getBytes(&quot;UTF-8&quot;));
return signature.verify(Base64.decodeBase64(sign.getBytes()));
}
/**
* GET请求,业务参数签名
* @param paramsMap get请求参数的map集合
* @param privateKeyStr 参与签名的私钥
* @return
*/
public static String signForHttpGet(Map&lt;String, String&gt; paramsMap, String privateKeyStr) {
TreeMap&lt;String, String&gt; treeMap = new TreeMap&lt;String, String&gt;(paramsMap);
// 将入参进行排序
String data = treeMap.toString();
String sign = null;
try {
sign = RSASecurityUtil.sign(data, RSASecurityUtil.getPrivateKey(privateKeyStr));
} catch (Exception e) {
e.printStackTrace();
}
return sign;
}
/**
* POST请求,body业务参数签名
* @param bodyEntity post请求的body参数对象
* @param privateKeyStr 参与签名的私钥
* @return
*/
public static String signForHttpPost(Object bodyEntity, String privateKeyStr) {
String json = null;
if (bodyEntity instanceof String) {
json = bodyEntity.toString();
} else {
ObjectMapper mapper = new ObjectMapper();
try {
json = mapper.writeValueAsString(bodyEntity);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
String sign = null;
try {
sign = RSASecurityUtil.sign(json, RSASecurityUtil.getPrivateKey(privateKeyStr));
} catch (Exception e) {
e.printStackTrace();
}
return sign;
}
public static void main(String[] args) throws Exception {
try {
// 生成密钥对
KeyPair keyPair = getKeyPair();
String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));
String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));
System.out.println(&quot;私钥:&quot; + privateKey);
System.out.println(&quot;公钥:&quot; + publicKey);
// RSA加密
String data = &quot;1234&quot;;
String encryptData = encrypt(data, getPublicKey(publicKey));
System.out.println(&quot;加密后内容:&quot; + encryptData);
// RSA解密
String decryptData = decrypt(encryptData, getPrivateKey(privateKey));
System.out.println(&quot;解密后内容:&quot; + decryptData);
// RSA签名
String sign = sign(data, getPrivateKey(privateKey));
// RSA验签
boolean result = verify(data, getPublicKey(publicKey), sign);
System.out.print(&quot;验签结果:&quot; + result);
} catch (Exception e) {
e.printStackTrace();
System.out.print(&quot;加解密异常&quot;);
}
}
}</code></pre>
<p><strong>枚举信息</strong></p>
<ul>
<li>证件类型</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">代码</th>
<th style="text-align: left;">名称</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">01</td>
<td style="text-align: left;">居民身份证</td>
</tr>
<tr>
<td style="text-align: left;">02</td>
<td style="text-align: left;">居民户口簿</td>
</tr>
<tr>
<td style="text-align: left;">03</td>
<td style="text-align: left;">驾驶证</td>
</tr>
<tr>
<td style="text-align: left;">04</td>
<td style="text-align: left;">军官证</td>
</tr>
<tr>
<td style="text-align: left;">05</td>
<td style="text-align: left;">士兵证</td>
</tr>
<tr>
<td style="text-align: left;">06</td>
<td style="text-align: left;">军官离退休</td>
</tr>
<tr>
<td style="text-align: left;">07</td>
<td style="text-align: left;">中国护照</td>
</tr>
<tr>
<td style="text-align: left;">08</td>
<td style="text-align: left;">异常身份证</td>
</tr>
<tr>
<td style="text-align: left;">09</td>
<td style="text-align: left;">港澳通行证</td>
</tr>
<tr>
<td style="text-align: left;">10</td>
<td style="text-align: left;">台湾通行证</td>
</tr>
<tr>
<td style="text-align: left;">11</td>
<td style="text-align: left;">回乡证</td>
</tr>
<tr>
<td style="text-align: left;">12</td>
<td style="text-align: left;">统一社会信用代码</td>
</tr>
<tr>
<td style="text-align: left;">14</td>
<td style="text-align: left;">外国人永久居留身份证</td>
</tr>
<tr>
<td style="text-align: left;">31</td>
<td style="text-align: left;">组织机构代码证</td>
</tr>
<tr>
<td style="text-align: left;">32</td>
<td style="text-align: left;">营业执照</td>
</tr>
<tr>
<td style="text-align: left;">33</td>
<td style="text-align: left;">税务登记证</td>
</tr>
<tr>
<td style="text-align: left;">34</td>
<td style="text-align: left;">工商登记证</td>
</tr>
<tr>
<td style="text-align: left;">51</td>
<td style="text-align: left;">外国护照</td>
</tr>
<tr>
<td style="text-align: left;">52</td>
<td style="text-align: left;">旅行证</td>
</tr>
<tr>
<td style="text-align: left;">53</td>
<td style="text-align: left;">居留证</td>
</tr>
<tr>
<td style="text-align: left;">55</td>
<td style="text-align: left;">港澳台居民居住证</td>
</tr>
<tr>
<td style="text-align: left;">98</td>
<td style="text-align: left;">武警身份证</td>
</tr>
<tr>
<td style="text-align: left;">99</td>
<td style="text-align: left;">其他证件</td>
</tr>
</tbody>
</table>
<p><strong>公共部分</strong></p>
<ul>
<li>ResponseHead (公共返回信息)</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">字段名称</th>
<th style="text-align: left;">变量名</th>
<th>类型</th>
<th>字段长度</th>
<th>是否可空</th>
<th>是否多值</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">ResponseHead </td>
<td style="text-align: left;"> (公共返回信息)</td>
</tr>
<tr>
<td style="text-align: left;">结果代码</td>
<td style="text-align: left;">resultCode</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>000-处理成功,999处理失败,555部分成功</td>
</tr>
<tr>
<td style="text-align: left;">服务代码</td>
<td style="text-align: left;">serviceCode</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">服务名称</td>
<td style="text-align: left;">serviceName</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">接口代码</td>
<td style="text-align: left;">interfaceCode</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">接口名称</td>
<td style="text-align: left;">interfaceName</td>
<td>String</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td style="text-align: left;">请求序号</td>
<td style="text-align: left;">seqNo</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>请求参数中时间戳</td>
</tr>
<tr>
<td style="text-align: left;">错误信息</td>
<td style="text-align: left;">errorMessage</td>
<td>String</td>
<td>no</td>
<td>no</td>
<td>错误信息</td>
</tr>
</tbody>
</table>
<ul>
<li>接口编号说明</li>
</ul>
<p>欢迎使用ShowDoc!</p>