公开文档

公开文档


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&lt;clmPaymentDto&gt;</td> <td>List&lt;clmPaymentDto&gt;</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>{ &amp;quot;httpRequest&amp;quot;: { &amp;quot;requestHead&amp;quot;: { &amp;quot;serviceClass&amp;quot;: &amp;quot;HWA005&amp;quot;, &amp;quot;serviceName&amp;quot;: &amp;quot;autoCommonRefund&amp;quot;, &amp;quot;userCode&amp;quot;: &amp;quot;TACommon-healthchcoffline-1720163362812&amp;quot;, &amp;quot;userName&amp;quot;: &amp;quot;EFBC1KPBsE9rtDaU/ztIgnN2hgVtdHdVc2WYBEyUtNPuTRK+BM6nrwwIz4jBc3K02wPmH5c6pFq4\r\nLHqr8k/itWqg67GCqTtjmTC6La7tbhWc5FX/DUwGz2yxjwF1CLfTqyC7qVkuVNdf/WpsB/eVFFPm\r\n02f1thKMgy5AKNR69jo=&amp;quot; }, &amp;quot;requestBody&amp;quot;: { &amp;quot;registNo&amp;quot;: &amp;quot;07604311082024220045&amp;quot;, &amp;quot;businessSources&amp;quot;: &amp;quot;healthchcoffline&amp;quot;, &amp;quot;clmPaymentInfoList&amp;quot;: [{ &amp;quot;bankPayType&amp;quot;: &amp;quot;1&amp;quot;, &amp;quot;payeeBankCode&amp;quot;: &amp;quot;10209452&amp;quot;, &amp;quot;accountNo&amp;quot;: &amp;quot;123456&amp;quot;, &amp;quot;accountName&amp;quot;: &amp;quot;柳一&amp;quot;, &amp;quot;idType&amp;quot;: &amp;quot;01&amp;quot;, &amp;quot;idNo&amp;quot;: &amp;quot;362302195809045015&amp;quot;, &amp;quot;payeeMobile&amp;quot;: &amp;quot;13200000000&amp;quot; }] } } }</code></pre> <p><strong>返回示例</strong></p> <pre><code>{ &amp;quot;httpResponse&amp;quot;: { &amp;quot;responseHead&amp;quot;: { &amp;quot;resultCode&amp;quot;: &amp;quot;000&amp;quot;, &amp;quot;errorMessage&amp;quot;: &amp;quot;成功&amp;quot;, &amp;quot;serviceClass&amp;quot;: &amp;quot;HWA005&amp;quot;, &amp;quot;serviceName&amp;quot;: &amp;quot;autoCommonReturnBill&amp;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(&amp;quot;RSA&amp;quot;); generator.initialize(1024); return generator.generateKeyPair(); } /** * 获取私钥 * * @param privateKey 私钥字符串 * @return */ public static PrivateKey getPrivateKey(String privateKey) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance(&amp;quot;RSA&amp;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(&amp;quot;RSA&amp;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(&amp;quot;RSA&amp;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 &amp;gt; 0) { if (inputLen - offset &amp;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(&amp;quot;RSA&amp;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 &amp;gt; 0) { if (inputLen - offset &amp;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, &amp;quot;UTF-8&amp;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(&amp;quot;RSA&amp;quot;); PrivateKey key = keyFactory.generatePrivate(keySpec); Signature signature = Signature.getInstance(&amp;quot;MD5withRSA&amp;quot;); signature.initSign(key); signature.update(data.getBytes(&amp;quot;UTF-8&amp;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(&amp;quot;RSA&amp;quot;); PublicKey key = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(&amp;quot;MD5withRSA&amp;quot;); signature.initVerify(key); signature.update(srcData.getBytes(&amp;quot;UTF-8&amp;quot;)); return signature.verify(Base64.decodeBase64(sign.getBytes())); } /** * GET请求,业务参数签名 * @param paramsMap get请求参数的map集合 * @param privateKeyStr 参与签名的私钥 * @return */ public static String signForHttpGet(Map&amp;lt;String, String&amp;gt; paramsMap, String privateKeyStr) { TreeMap&amp;lt;String, String&amp;gt; treeMap = new TreeMap&amp;lt;String, String&amp;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(&amp;quot;私钥:&amp;quot; + privateKey); System.out.println(&amp;quot;公钥:&amp;quot; + publicKey); // RSA加密 String data = &amp;quot;1234&amp;quot;; String encryptData = encrypt(data, getPublicKey(publicKey)); System.out.println(&amp;quot;加密后内容:&amp;quot; + encryptData); // RSA解密 String decryptData = decrypt(encryptData, getPrivateKey(privateKey)); System.out.println(&amp;quot;解密后内容:&amp;quot; + decryptData); // RSA签名 String sign = sign(data, getPrivateKey(privateKey)); // RSA验签 boolean result = verify(data, getPublicKey(publicKey), sign); System.out.print(&amp;quot;验签结果:&amp;quot; + result); } catch (Exception e) { e.printStackTrace(); System.out.print(&amp;quot;加解密异常&amp;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>

页面列表

ITEM_HTML