回调通知服务
<h3>说明</h3>
<p>> 回调通知服务用来提高上链的<code>响应速度</code>,在上链后,交易回执会第一时间通过<code>回调通知服务</code>进行通知,客户方接收到回执后执行后续操作。</p>
<p>> 如果客户方不使用回调,使用查询接口去查询结果,一是浪费资源,始终保持轮询的操作,二是交易确认时间不够及时,拉长了单笔交易的响应时间,应配合<code>查询上链结果</code>接口一起使用</p>
<hr />
<h3>使用</h3>
<p>> 在 API 文档上链接口中铸造、转移以及销毁的入参 <code>callbackUrl</code> 中填入接受通知服务的接口地址,接收回调服务通知的服务器需要加亿链侧的白名单,面向公网则无需配置,测试环境出口ip:<code>120.46.99.71</code></p>
<hr />
<h3>Java 回调示例</h3>
<p>>回调方法必须为<code>POST</code>,接收回调通知后需要返回<code>{&quot;code&quot;:&quot;200&quot;,&quot;msg&quot;:&quot;success&quot;}</code></p>
<p>注意 code、msg都为<code>字符串</code>,如果响应值不为<code>{&quot;code&quot;:&quot;200&quot;,&quot;msg&quot;:&quot;success&quot;}</code>,则会进行<code>重新推送</code>,每次推送间隔为10 s,一共重新推送 3 次,3次过后不再进行通知,客户侧调用<code>查询上链结果</code>接口查询结果。</p>
<pre><code class="language-java">@RestController
public class CallbackController {
@RequestMapping(value = &quot;/callback&quot;, method = RequestMethod.POST )
public CallBackResult callback(@RequestBody String requestBody) {
log.info(&quot;交易回执:{}&quot;, requestBody);
CallBackResult callBackResult = new CallBackResult();
callBackResult.setCode(&quot;200&quot;);
callBackResult.setMsg(&quot;success&quot;);
return callBackResult;
}
}</code></pre>
<hr />
<h3>通知结果示例</h3>
<p>>业务方获得回执结果以后,重点关注包体中data 中的 :transactionHash,reqNo,status 其中:</p>
<p><code>transactionHash</code>是交易哈希,与铸造、转移以及销毁接口返回的txHash字段相同</p>
<p><code>reqNo</code>是业务方发起的请求号,主要用于问题排查。</p>
<p><code>status</code>是交易状态</p>
<h4>示例:</h4>
<p>>响应有以下几种情况:因为 API 服务在上链前已经做了很多校验,只有极特殊的情况下才会出现status不为0的情况,如果出现联系亿链技术人员排查</p>
<p>status 为<code>0</code>则代表上链成功,判断包体其中 status 为 0,或 statusOK 为 true</p>
<pre><code class="language-json">{
&quot;code&quot;:&quot;EC000000&quot;,
&quot;data&quot;:{
&quot;jsonRpcResp&quot;:{
&quot;id&quot;:737095,
&quot;jsonrpc&quot;:&quot;2.0&quot;,
&quot;result&quot;:{
&quot;blockNumber&quot;:1039598,
&quot;checksumContractAddress&quot;:&quot;&quot;,
&quot;contractAddress&quot;:&quot;&quot;,
&quot;extraData&quot;:&quot;&quot;,
&quot;from&quot;:&quot;0x75ac45d3f9c5532dff97350954449fc47c03250b&quot;,
&quot;gasUsed&quot;:&quot;23432&quot;,
&quot;hash&quot;:&quot;0x03d8b171f9798bad9037565c90b5990ae5d20a10b1d2556de4f551cc643b33e2&quot;,
&quot;input&quot;:&quot;0x40c10f1900000000000000000000000094d5fff3ccb536033ce2f68f68b60ff514367036000000000000000000000000000000000000000000000000000000000012c980&quot;,
&quot;logEntries&quot;:[
{
&quot;address&quot;:&quot;93644794acfe95135a9df2db6ca6bf301886e817&quot;,
&quot;data&quot;:&quot;0x&quot;,
&quot;topics&quot;:[
&quot;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&quot;,
&quot;0x0000000000000000000000000000000000000000000000000000000000000000&quot;,
&quot;0x00000000000000000000000094d5fff3ccb536033ce2f68f68b60ff514367036&quot;,
&quot;0x000000000000000000000000000000000000000000000000000000000012c980&quot;
]
}
],
&quot;message&quot;:&quot;&quot;,
&quot;output&quot;:&quot;0x&quot;,
&quot;status&quot;:0,
&quot;statusOK&quot;:true,
&quot;to&quot;:&quot;0x93644794acfe95135a9df2db6ca6bf301886e817&quot;,
&quot;transactionHash&quot;:&quot;0xbfcf9bace917c5d79e47f774187806904c6d7a52578ff015248695e52decb6c8&quot;,
&quot;version&quot;:0
}
},
&quot;reqNo&quot;:&quot;1&quot;
},
&quot;message&quot;:&quot;成功&quot;
}</code></pre>
<p>>status 为 <code>16</code> 是在出块过程中执行合约逻辑失败交易回滚,会将具体错误响应</p>
<pre><code class="language-json">{
&quot;code&quot;:&quot;EC000000&quot;,
&quot;data&quot;:{
&quot;jsonRpcResp&quot;:{
&quot;error&quot;:{
&quot;code&quot;:16,
&quot;message&quot;:&quot;Ownable: caller is not the owner&quot;
},
&quot;id&quot;:4,
&quot;jsonrpc&quot;:&quot;2.0&quot;,
&quot;result&quot;:{
&quot;blockNumber&quot;:29874,
&quot;checksumContractAddress&quot;:&quot;&quot;,
&quot;contractAddress&quot;:&quot;&quot;,
&quot;extraData&quot;:&quot;&quot;,
&quot;from&quot;:&quot;0x95a1a99be965777d8b0e42fe5ec1c161f6c3a5da&quot;,
&quot;gasUsed&quot;:&quot;2633&quot;,
&quot;hash&quot;:&quot;0x&quot;,
&quot;input&quot;:&quot;0x40c10f1900000000000000000000000095a1a99be965777d8b0e42fe5ec1c161f6c3a5da00000000000000000000000000000000000000000000000000000187eb127a14&quot;,
&quot;logEntries&quot;:[
],
&quot;message&quot;:&quot;&quot;,
&quot;output&quot;:&quot;0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000204f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572&quot;,
&quot;status&quot;:16,
&quot;statusOK&quot;:false,
&quot;to&quot;:&quot;0x18f8597118953b3374c2515ecf799ce4750361bb&quot;,
&quot;transactionHash&quot;:&quot;0x3b1987a1ede1b2de8e3964c68c4c347ed3efbc0195354d723a3fc2922742bf5b&quot;,
&quot;version&quot;:0
}
},
&quot;reqNo&quot;:&quot;1&quot;
},
&quot;message&quot;:&quot;成功&quot;
}</code></pre>
<p>>status 为 <code>19</code> 是因为请求合约地址不存在,更改已部署的合约地址</p>
<pre><code class="language-json">{
&quot;code&quot;:&quot;EC000000&quot;,
&quot;data&quot;:{
&quot;jsonRpcResp&quot;:{
&quot;error&quot;:{
&quot;code&quot;:19,
&quot;message&quot;:&quot;CallAddressError&quot;
},
&quot;id&quot;:7,
&quot;jsonrpc&quot;:&quot;2.0&quot;,
&quot;result&quot;:{
&quot;blockNumber&quot;:29875,
&quot;checksumContractAddress&quot;:&quot;&quot;,
&quot;contractAddress&quot;:&quot;&quot;,
&quot;extraData&quot;:&quot;&quot;,
&quot;from&quot;:&quot;0x95a1a99be965777d8b0e42fe5ec1c161f6c3a5da&quot;,
&quot;gasUsed&quot;:&quot;0&quot;,
&quot;hash&quot;:&quot;0x&quot;,
&quot;input&quot;:&quot;0x40c10f1900000000000000000000000095a1a99be965777d8b0e42fe5ec1c161f6c3a5da00000000000000000000000000000000000000000000000000000187eb14d822&quot;,
&quot;logEntries&quot;:[
],
&quot;message&quot;:&quot;&quot;,
&quot;output&quot;:&quot;0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001343616c6c2061646472657373206572726f722e00000000000000000000000000&quot;,
&quot;status&quot;:19,
&quot;statusOK&quot;:false,
&quot;to&quot;:&quot;0x18f8597118953b3374c2515ecf799ce4750361b1&quot;,
&quot;transactionHash&quot;:&quot;0xdf219aa078e5eb958da1701ada37ba86f9dec77f858c074c2a65220d5c178864&quot;,
&quot;version&quot;:0
}
},
&quot;reqNo&quot;:&quot;1&quot;
},
&quot;message&quot;:&quot;成功&quot;
}</code></pre>
<p>>无staus: 交易未上链</p>
<pre><code class="language-json">{
&quot;code&quot;:&quot;EC000000&quot;,
&quot;data&quot;:{
&quot;jsonRpcResp&quot;:{
&quot;error&quot;:{
&quot;code&quot;:10001,
&quot;message&quot;:&quot;BlockLimitCheckFail&quot;
},
&quot;id&quot;:0
},
&quot;reqNo&quot;:&quot;0x661a7133856fee642d553dc7263511f0be2fe34c012e16d841ee761410d05fe3&quot;
},
&quot;message&quot;:&quot;成功&quot;
}</code></pre>