7.2 通用API

7.2.1 唤起迅雷链助手协议

唤起协议

合约执行必须通过迅雷链助手,由第三方应用唤醒迅雷链助手App或者通过迅雷链助手App扫码。迅雷链助手唤起协议为vchouyi://payment?

请求参数说明

参数类型必须说明
schemestring迅雷链助手scheme vchouyi
hoststring迅雷链助手host值为:payment
tx-databyte[]Base64编码 主要包含支付的订单信息,key=value形式,以&连接
resourcebyte[]Base64编码 来源app(来源商户名称),限制10字符以内
cb-databyte[]Base64编码(可选)支付调起者需要迅雷链助手回传的额外信息
x-sourcestring源app scheme eg. wky-app(可选 iOS调用回调,安卓不处理),保留字段
callbackstringurl编码,支付完成后,回调迅雷链助手的地址或者schema http://www.xx.com 或 scheme://host/?hash=交易回执&msg=错误描述(base64)&code=错误码&cb-data=透传信息&result=(success|fail|cancel)
  • 若第三方业务是在非迅雷链助手接入(比如浏览器,第三方app),callback可支持网页或协议app返回,会在业务完成后回调(表现为回到浏览器或第三方app)
  • 若业务在迅雷链助手中接入(比如扫二维码在迅雷链助手中打开业务页面),callback只支持网页协议返回,会在业务完成后回调(表现为在迅雷链助手打开网页)
  • 若不传callback,建议第三方自己轮询业务结果或者等待服务器的callback回传
  • 第三方可以通过查询web的UserAgent知晓业务是否在迅雷链助手中 关键字段'OneWallet' 下面是完整User-Agent
  1. iOS-User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E302 OneWallet/2.0.3 (iPhone; iOS 11.3.1; Scale/3.00; origin/2; nc/IN)

tx-data参数说明

参数类型必须说明
descstring合约执行描述,必须带上“合约执行-”前缀
callbackstring做url编码,第三方应用后台用来接收区块链交易完成后的回调地址
tostring执行的合约地址
valuestringtoken数量(单位 wei),1 token = 10 ** 18 wei ,传整数,不带单位。如转1token的时候填写 1 000 000 000 000 000 000
prepay_idstring预支付订单号,通过接口getPrepayId获取
service_idstring业务id,通过迅雷链开放平台申请获取service_id和签名秘钥
datastring如果是合约执行,传入以0x开头的执行合约函数和参数的编码。
gas_limitstring最大的支付gas:合约交易时为估算的执行手续费;若交易费超出实际执行扣取,会退还回付款方;
tx_typestring合约交易时,固定取值contract;
signstring交易签名 sign=md5(sha512(callback=xxx&prepay_id=xxx&service_id=xxx&to=xxx&value=xxx&key=私钥)) 此处的callback url不用编码

APP回调返回

  1. (http://www.xx.com|scheme://host)?hash=交易回执&msg=错误描述(base64)&code=错误码&cb-data=透传信息&result=(success|fail|cancel)

7.2.2 合约constant方法查询

该方法用来做合约方法查询。该方法是用来执行指定的message call,不会创建交易,因此该方法的调用是试用不会改变区块链状态数据库的,合约中的constant方法应该调用这个方法。

请求

方法:POSTURL: /callBODY: JSON

参数说明:

字段类型约束备注
jsonrpcString必须固定值 "2.0"
methodString必须固定值 "eth_call"
paramsArray必须详细信息见下面表格
idInt必须固定值 1

params 详细

index类型约束备注
0Object必须结构如下object详细
1String必须固定值 "latest"

object 详细

  • object - 交易调用对象
字段类型约束大小备注
fromcommon.Address必须20 bytes交易的发起者
tocommon.Address必填20 bytes交易指向的地址,比如合约调用方法中就是合约地址
datahexutil.Bytes可选执行合约constant方法和参数的编码 详见 Ethereum Contract ABI

示例

  1. {
  2. "jsonrpc": "2.0",
  3. "method": "eth_call",
  4. "params": [
  5. {
  6. "from": "",
  7. "to": "",
  8. "data": ""
  9. },
  10. "latest"
  11. ],
  12. "id": 1
  13. }

响应

字段类型约束大小备注
DATA交易调用对象合约执行结果

7.2.3 查询预估gas消耗(estimateGas)

功能

获取合约调用预估消耗的gas数量。用户在调用合约时需要传入gas_limit值,由于gas的消耗与区块链当前运行环境的难度值等相关,需实时计算。如果调用合约执行时out-of-gas(即gas消耗完但合约还未执行完毕),则合约执行失败,并且已消耗的gas不会返还。如果调用合约执行时的gas小于或等于提供的gas,则合约执行完毕,将退还未消耗的gas。建议开发者在调用合约时,在此计算出的预计gas消耗值基础上加上一些,以保证合约执行成功。

请求

方法:POSTURL: /estimateGasBODY: JSON

参数说明:

字段类型约束备注
jsonrpcString必须固定值 "2.0"
methodString必须固定值 "eth_estimateGas"
paramsArray必须详细信息见下面表格
idInt必须固定值 1

params 详细

index类型约束备注
0Object必须结构如下object详细

object 详细

  • object - 交易调用对象
字段类型约束大小备注
fromcommon.Address可选20 bytes交易的发起者
tocommon.Address必填20 bytes交易指向的地址,比如合约调用方法中就是合约地址
valuehexutil.Big可选该交易要发送的值
datahexutil.Bytes可选Hash of the method signature and encoded parameters. 详见 Ethereum Contract ABI

示例

  1. {
  2. "jsonrpc": "2.0",
  3. "method": "eth_estimateGas",
  4. "params":[
  5. {
  6. "from": "",
  7. "to": "",
  8. "data": "",
  9. "value": ""
  10. }
  11. ],
  12. "id": 1
  13. }

响应

参数名参数类型必须说明
contentstream迅雷链助手APP支付协议格式的交易信息

7.2.4 获取合约执行所需的prepayId

请求方式: post

参数类型说明
service_idint业务号,通过迅雷链申请
signstring签名,签名算法:md5(sha512("service_id=业务号&key=私钥"))
timeoutint生成的prepay_id的有效期,单位为秒

请求格式与示例:

  1. //为了保持和以太坊格式一致,请求post body数据要按照以下格式:
  2. {
  3. "jsonrpc": "2.0",
  4. "method": "getPrepayId",
  5. "params": {
  6. "service_id": 0,
  7. "sign": "f93d2813227b68f77bf0db84c62011ca",
  8. "timeout": 1800
  9. }
  10. }
  • Timeout字段以秒为单位
  • Timeout字段如果不输入或者输入负值,则生成的prepay_id默认超时时间为2小时[可配置]
  • Timeout字段如果输入了超过默认最大的时间[可配置],则生成的prepay_id有效期为配置的最大时间,目前默认为一天

响应参数:

参数类型说明
iRetint0 成功
sMsgstring返回描述
datajson object成功返回prepay_id: 'xxxx',失败返回错误信息

返回示例:

  1. {
  2. "iRet":0,
  3. "sMsg": "ok",
  4. "data": {"prepay_id":"201711291656030000000101431771972107"}
  5. }

7.2.5 根据prepayId查询订单状态

请求url测试环境:https://sandbox-blockchain.xunlei.com/getOrderStatusByPrepayId正式环境:https://rpc-blockchain.xunlei.com/getOrderStatusByPrepayId

参数类型说明
service_idint业务号,通过迅雷链申请
prepay_idstring订单提交时获取的

请求格式与示例:

  1. {"jsonrpc":"2.0","method":"getOrderStatusByPrepayId","params":{"service_id":1,"prepay_id":"20171019xxxxxxxxxxxx"}}

响应参数:

参数类型说明
iRetint0 成功
sMsgint返回描述
dataarray返回数据,json编码的字符串

data格式:

参数类型说明
fromstring付款地址
tostring收款地址
valuestringtoken数量,string,单位:wei, 例如:"1000000000000000000"
statusstring订单状态,0初始,1成功,2失败
ctimestring交易时间,例:2017-10-19 15:37:00
hashstring交易hash
payloadstring交易payload

返回示例:

  1. {
  2. "iRet":0,
  3. "sMsg":"success",
  4. "data":{
  5. "from":"0x7b6837189a3464d3c696069b2b42a9ae8e17dda1",
  6. "to":"0x00a2810b56e763406cad8be8ee90b0b89b370829",
  7. "value":"1000",
  8. "ctime":"2018-12-28 11:56:00",
  9. "status":0,
  10. "hash":"0xe254b5a67458e8d2b20472028738baba7bf5f10c5fd19f471b31c6725e58b10e",
  11. "pay_load":""
  12. }
  13. }
  • 如果Prepay_id未失效,同时查询不到订单信息,那么获取订单信息返回”订单未支付”
  • 如果Prepay_id已失效,同时查询不到订单信息,那么获取订单信息返回”Prepay_id无效”
  • 如果查询到订单信息则正常返回

7.2.6 合约执行结果回调

交易成功后,区块链通知模块会把prepay_id回调接入方,接入方需要接收处理,并返回应答。对后台通知交互时,如果区块链通知模块收到接入方的应答不是成功或超时,区块链通知模块认为通知失败,区块链通知模块会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但区块链通知模块不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

注意:同样的通知可能会多次发送给接入方系统。接入方系统必须能够正确处理重复的通知。

推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。特别提醒:接入方系统对于交易结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”。

区块链通知模块回调协议(post):

参数类型说明
prepay_idstring预支付ID
fromstring付款地址
tostring收款地址
valuestringtoken数量,string,单位:wei, 例如:"1000000000000000000"
statusstring订单状态,0初始,1成功,2失败
timestampstringunix时间戳
signstringmd5(sha512(from=xxxxxx&prepay_id=xxxxxxxxxxxxx&status=1&timestamp=1512893272&to=xxxxx&value=xxxx&key=私钥))

示例:

  1. from=xxxxxx&prepay_id=xxxxxxxxxxxxx&status=1&timestamp=1512893272&to=xxxxx&value=100000000000000&sign=4124bc0a9335c2xxxxxxxxxxxxxx

其中的sign=md5(sha512(from=xxxxxx&prepay_id=xxxxxxxxxxxxx&status=1&timestamp=1512893272&to=xxxxx&value=xxxx&key=私钥))

接入方收到回调后,需要给区块链通知模块回应(response):return_code=0&return_msg=ok