融赋通平台商户API接口V1.0.3

岭世科技融赋通平台是岭世科技面向自由职业者结算报税需求的专业平台,其支持具有开发能力的企业商户通过API接口调用方式获取以下服务. PS: 第二章和第三章主要说明对接API前期所需的一些准备工作; 第四章平台服务接口规范对平台开放的API进行了详细说明; 第五章对API的签名加密规则和返回码进行详细说明; 第六章 补充说明中,对于接口开发流程做了详细描述,请注意阅读; 第七章 API账号信息[测试环境]中,提供了测试环境参数可直接拿来调试用;


1.签名生成

<h1>1、签名sign生成约定</h1> <p>算法规则 融赋通平台当前支持两种通信报文的安全签名方式: 第1种:通过与商户约定对应秘钥串对指定数据进行签名 第2种:通过商户私钥对指定数据进行签名 两种方式,需要作为指定数据的字符串生成规则均相同。 分三步完成: 第一步,设所有发送或者接收到的json数据域为集合M(不包括sign),将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&amp;key2=value2…),(注:对循环数组子域需转换成key[index].subkey=subvalue形式,其中key为body下第一级数据标签,index为数组元素从0开始序号,subkey为数组元素名称,subvalue为数组元素subkey对应的值)拼接成字符串stringA。 特别注意以下重要规则: ◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写 第二步,对于采取对称秘钥签名的商户,直接在该字符串后追加其商户对应的秘钥串键值对(&amp;key=${secretKey}),生成待签名字符串,然后通过SHA256生成摘要字节数组,并进行BASE64编码,作为sign的值。 对于采取非对称签名的商户,使用商户私钥对该指定数据生成签名字节数组,并进行BASE64编码,作为sign的值。 第三步,将sign值追加到json上送对象中</p> <h1>2、签名生成过程</h1> <h2>1)、上送报文,加签前(举例)</h2> <pre><code>{ &amp;quot;merchant_id&amp;quot;: &amp;quot;testMerchant001&amp;quot;, &amp;quot;partner_id&amp;quot;: &amp;quot;RFT&amp;quot;, &amp;quot;timestamp&amp;quot;: &amp;quot;20180924235824387&amp;quot;, &amp;quot;sign_type&amp;quot;: &amp;quot;SHA256&amp;quot; }</code></pre> <h2>2)、把所有参数根据参数名k排序(升序)并拼接</h2> <pre><code>merchant_id=testMerchant001&amp;amp;partner_id=RFT&amp;amp;sign_type=SHA256&amp;amp;timestamp=20180924235824387</code></pre> <h2>3)、追加签名密钥signGenerationKey(从融赋通获取,如:key=282b00eb561b455caac86925c6xxxxxx)</h2> <pre><code>merchant_id=testMerchant001&amp;amp;partner_id=RFT&amp;amp;sign_type=SHA256&amp;amp;timestamp=20180924235824387&amp;amp;key=282b00eb561b455caac86925c6xxxxxx</code></pre> <h2>4)、生成签名并base64</h2> <pre><code>0g02YUW2fRRrAaMlYrwUmVAS1rb6loTJQ+4ffFNB7DM=</code></pre> <h2>5)、最终上送报文</h2> <pre><code>{ &amp;quot;merchant_id&amp;quot;: &amp;quot;testMerchant001&amp;quot;, &amp;quot;partner_id&amp;quot;: &amp;quot;RFT&amp;quot;, &amp;quot;timestamp&amp;quot;: &amp;quot;20180924235824387&amp;quot;, &amp;quot;sign_type&amp;quot;: &amp;quot;SHA256&amp;quot;, &amp;quot;sign&amp;quot;: &amp;quot;0g02YUW2fRRrAaMlYrwUmVAS1rb6loTJQ+4ffFNB7DM=&amp;quot; }</code></pre> <h1>3、生成签名代码参考</h1> <pre><code> public static void main(String[] args) { // 从融赋通获取 String signGenerationKey = &amp;quot;282b00eb561b455caac86925c6xxxxxx&amp;quot;; // 举例输入参数 String param = &amp;quot;{\n&amp;quot; + &amp;quot; \&amp;quot;ret_msg\&amp;quot;: \&amp;quot;操作完成\&amp;quot;,\n&amp;quot; + &amp;quot; \&amp;quot;ret_code\&amp;quot;: \&amp;quot;0000\&amp;quot;,\n&amp;quot; + &amp;quot; \&amp;quot;sign_type\&amp;quot;: \&amp;quot;SHA256\&amp;quot;,\n&amp;quot; + &amp;quot; \&amp;quot;ret_data\&amp;quot;: {\n&amp;quot; + &amp;quot; \&amp;quot;deal_no\&amp;quot;: \&amp;quot;20230613100225000493\&amp;quot;,\n&amp;quot; + &amp;quot; \&amp;quot;signed_code\&amp;quot;: \&amp;quot;S\&amp;quot;,\n&amp;quot; + &amp;quot; \&amp;quot;signed_msg\&amp;quot;: \&amp;quot;成功\&amp;quot;,\n&amp;quot; + &amp;quot; \&amp;quot;serial_no\&amp;quot;: \&amp;quot;M201811082322120002\&amp;quot;\n&amp;quot; + &amp;quot; },\n&amp;quot; + &amp;quot; \&amp;quot;timestamp\&amp;quot;: \&amp;quot;20230613112733080\&amp;quot;\n&amp;quot; + &amp;quot;}&amp;quot;; JSONObject jsonObject = JSON.parseObject(param); // 参数排序 String paramSort = getSortKVStr(jsonObject); System.out.println(paramSort); // 追加签名密钥signGenerationKey String paramSortAppendkey = paramSort + &amp;quot;&amp;amp;key=&amp;quot; + signGenerationKey; System.out.println(paramSortAppendkey); try { MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;); // 执行加签转base64 byte[] paramHash = digest.digest(paramSortAppendkey.getBytes(StandardCharsets.UTF_8)); String base64Sign = Base64.getEncoder().encodeToString(paramHash); System.out.println(&amp;quot;Base64 encoded SHA256 hash: &amp;quot; + base64Sign); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * 参数排序 * @param values * @return 排序后输出String */ private static String getSortKVStr(Map&amp;lt;String, Object&amp;gt; values) { List&amp;lt;String&amp;gt; keys = new ArrayList&amp;lt;&amp;gt;(values.keySet()); Collections.sort(keys); StringBuilder sb = new StringBuilder(); for (String key : keys) { //附件不参与签名验签 if (&amp;quot;file&amp;quot;.equals(key)) { continue; } Object value = values.get(key); if (value == null || &amp;quot;&amp;quot;.equals(value)) { continue; } if (sb.length() &amp;gt; 0) sb.append('&amp;amp;'); sb.append(key).append(&amp;quot;=&amp;quot;).append(value); } String sortKVStr = sb.toString(); System.out.println(&amp;quot;sort kv string for sign:&amp;quot; + sortKVStr); return sortKVStr; }</code></pre>

页面列表

ITEM_HTML