ZtPayService.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/11/23
  6. */
  7. namespace crmeb\services;
  8. /**
  9. * Class ZtPayService
  10. * @package crmeb\services
  11. *
  12. * 转出通知
  13. *
  14. *
  15. *
  16. *
  17. * 交易转出通知示例
  18. *
  19. *
  20. *
  21. * 收到通知后需要输出 success 或 SUCCESS 表示正确收到这笔交易信息,否则系统会连续通知三次,三次后不再主动通知。
  22. *
  23. * 注意:数据采用 POST 方式发送。
  24. *
  25. * 如需验证通知数据安全性,可以将 通知数据中的 data 值 按安全签名 方式进行签名,然后和通知数据中的 sign值对比。
  26. * 1.{
  27. * 2. "appid": "应用Appid",
  28. * 3. "name": "币种名称",
  29. * 4. "name_alias": "代币名称,可用此参数区分是否为代币,如ERC20",
  30. * 5. "time": "当前时间",
  31. * 6. "sign": "data内容签名,可验证此参数确认数据是否安全",
  32. * 7. "data": {
  33. * 8. "appid": "应用Appid",
  34. * 9. "hash": "交易记录唯一值",
  35. * 10. "from": "发送方",
  36. * 11. "to": "接收方",
  37. * 12. "amount": "交易数量",
  38. * 13. "fee_amount": "交易手续费",
  39. * 14. "memo": "交易备注/标签",//此字段为 EOS 和 XRP 使用
  40. * 15. "add_time": "交易记录时间",
  41. * 16. "type": 2,//1=转入记录 2=转出记录 3=测试记录
  42. * 17. "state": "交易状态" //1=交易成功 2=交易失败
  43. * 18. }
  44. * 19.}
  45. *
  46. * 转入通知
  47. *
  48. *
  49. *
  50. *
  51. * 交易转入通知示例
  52. *
  53. *
  54. *
  55. * 收到通知后需要输出 success 或 SUCCESS 表示正确收到这笔交易信息,否则系统会连续通知三次,三次后不再主动通知。
  56. *
  57. * 注意:数据采用 POST 方式发送。
  58. *
  59. * 如需验证通知数据安全性,可以将 通知数据中的 data 值 按安全签名 方式进行签名,然后和通知数据中的 sign值对比。
  60. * 1.{
  61. * 2. "appid": "应用Appid",
  62. * 3. "name": "币种名称",
  63. * 4. "name_alias": "代币名称,可用此参数区分是否为代币,如ERC20",
  64. * 5. "time": "当前时间",
  65. * 6. "sign": "data内容签名,可验证此参数确认数据是否安全",
  66. * 7. "data": {
  67. * 8. "appid": "应用Appid",
  68. * 9. "hash": "交易记录唯一值",
  69. * 10. "from": "发送方",
  70. * 11. "to": "接收方",
  71. * 12. "amount": "交易数量",
  72. * 13. "fee_amount": "交易手续费",
  73. * 14. "memo": "交易备注/标签",//此字段为 EOS 和 XRP 使用
  74. * 15. "add_time": "交易记录时间",
  75. * 16. "type": 1,//1=转入记录 2=转出记录 3=测试记录
  76. * 17. "state": "交易状态" //1=交易成功 2=交易失败
  77. * 18. }
  78. * 19.}
  79. *
  80. * 交易审核通知
  81. *
  82. *
  83. *
  84. *
  85. * 交易审核通知示例
  86. *
  87. *
  88. *
  89. * 收到通知后需要输出 success 或 SUCCESS 表示正确收到这笔交易信息,否则系统会返回通知失败。
  90. *
  91. * 注意:数据采用 POST 方式发送。
  92. * 1.{
  93. * 2. "audit_trading": 1,//存在此字段表示为交易审核通知
  94. * 3. "audit_time":"2019-01-01 00:00:00",//交易的审核时间
  95. * 4. "appid": "应用Appid",
  96. * 5. "number": "审核记录编号,提交交易时会返回这个参数值",
  97. * 6. "hash": "审核通过后的交易hash值,可通过此值查询交易信息",
  98. * 7. "state": '1',//1=审核通过,2=取消审核(交易不上链)
  99. * 8.}
  100. */
  101. class ZtPayService
  102. {
  103. const API_URL = 'https://sapi.ztpay.org/api/v2';//接口地址
  104. private static $app_id = '';
  105. private static $app_secret = '';
  106. /**
  107. * 实例化
  108. * @return ZtPayService
  109. */
  110. public static function instance()
  111. {
  112. $instance = new self();
  113. $instance::$app_id = sys_config('zt_appid', '');
  114. $instance::$app_secret = sys_config('zt_appsecret', '');
  115. return $instance;
  116. }
  117. /**
  118. * 获取签名
  119. * @param $data
  120. * @return string
  121. */
  122. private static function getSign($data)
  123. {
  124. $signPars = "";
  125. ksort($data);
  126. foreach ($data as $k => $v) {
  127. if ("sign" != $k && "" != $v && $v != "0") {
  128. $signPars .= $k . "=" . $v . "&";
  129. }
  130. }
  131. $signPars .= "key=" . self::$app_secret;
  132. return strtoupper(md5($signPars));
  133. }
  134. /**
  135. * 通用请求
  136. * @param $data
  137. * @return bool|false|string
  138. */
  139. private static function request($data)
  140. {
  141. $data['sign'] = self::getSign($data);
  142. return json_decode(do_request(self::API_URL, $data), true);
  143. }
  144. /**
  145. * 创建地址
  146. * @param string $coin_type 创建地址的币种名称
  147. * 如:BTC,ETH
  148. * 代币填写方式: 币名称_代币标识 ,如 USDT_ERC20
  149. * @return bool|false|string
  150. * 返回示例
  151. * 1.{
  152. * 2. "code": 0,
  153. * 3. "message": "地址信息获取成功",
  154. * 4. "data": {
  155. * 5. "address": "0x634853***158d2abbba4c1", //创建的地址
  156. * 6. "name": "ETH", //请求的币种名称
  157. * 7. "time": "2019-01-0100:00:00"
  158. * 8. }
  159. * 9.}
  160. */
  161. public static function get_address($coin_type)
  162. {
  163. $data = [
  164. 'appid' => self::$app_id,
  165. 'method' => 'get_address',
  166. 'name' => $coin_type,
  167. ];
  168. //var_dump($data);
  169. return self::request($data);
  170. }
  171. /**
  172. * 导入地址
  173. * @param $coin_type
  174. * @param $privatekey
  175. * @return bool|false|string
  176. * 目前该接口支持: ETH 、 USDT_ERC20 、 XRP 、 EOS 币种的地址导入。
  177. */
  178. public static function import_address($coin_type, $privatekey)
  179. {
  180. $data = [
  181. 'appid' => self::$app_id,
  182. 'method' => 'import_address',
  183. 'name' => $coin_type,
  184. "privatekey" => $privatekey,
  185. ];
  186. return self::request($data);
  187. }
  188. /**
  189. * 获取私钥
  190. * @param $coin_type
  191. * @param string $address 获取私钥的地址
  192. * @param string $security_pwd 账号安全密码
  193. * @return bool|false|string
  194. * 返回示例
  195. * 1.{
  196. * 2. "code": 0,
  197. * 3. "message": "私钥信息获取成功",
  198. * 4. "data": {
  199. * 5. "address": "0x634853***158d2abbba4c1",//获取私钥的地址
  200. * 6. "privatekey": "f07b92caf7****e1e83a32f4e65",//获取到的私钥
  201. * 7. "name": "ETH",//获取私钥的币种名称
  202. * 8. "time": "2019-01-0100:00:00"
  203. * 9. }
  204. * 10.}
  205. */
  206. public static function get_privatekey($coin_type, $address, $security_pwd)
  207. {
  208. $data = [
  209. 'appid' => self::$app_id,
  210. 'method' => 'get_privatekey',
  211. 'name' => $coin_type,
  212. 'address' => $address,
  213. 'security_pwd' => $security_pwd,
  214. ];
  215. return self::request($data);
  216. }
  217. /**
  218. * 校验地址
  219. * 此接口有两个功能:
  220. * 1、校验地址格式是否正确。
  221. * 2、检查地址是否属于当前账号,如果是检查地址是否属于当前账号请按指定格式传入地址: address=ztpay:要校验的地址 。可以考虑在将地址展示给用户的时候校验地址是否安全。
  222. * @param $coin_type
  223. * @param $address
  224. * @return bool|false|string
  225. * 返回示例:
  226. * 1.{
  227. * 2. "code": 0,
  228. * 3. "message": "地址校验成功",
  229. * 4. "data": [],
  230. * 5. "time": "2019-01-0100:00:00"
  231. * 6.}
  232. */
  233. public static function check_address($coin_type, $address)
  234. {
  235. $data = [
  236. 'appid' => self::$app_id,
  237. 'method' => 'check_address',
  238. 'name' => $coin_type,
  239. 'address' => $address,
  240. ];
  241. return self::request($data);
  242. }
  243. /**
  244. * 余额查询
  245. * @param $coin_type
  246. * @param $address
  247. * @return bool|false|string
  248. * 返回示例:
  249. * 1.{
  250. * 2. "code": 0,
  251. * 3. "message": "余额信息获取成功",
  252. * 4. "data": {
  253. * 5. "ETH": "0.00000000",
  254. * 6. "USDT": "0.000000"
  255. * 7. },
  256. * 8. "time": "2019-01-0100:00:00"
  257. * 9.}
  258. */
  259. public static function get_balance($coin_type, $address)
  260. {
  261. $data = [
  262. 'appid' => self::$app_id,
  263. 'method' => 'get_balance',
  264. 'name' => $coin_type,
  265. 'address' => $address,
  266. ];
  267. return self::request($data);
  268. }
  269. /**
  270. * @param string $coin_type 转账的币种名称
  271. * @param string $from 转出地址(此地址必须在 ztPay 存在)
  272. * 转出地址 from 必须在 ztPay 平台存在,该地址可以是导入的地址和创建的地址!
  273. * @param string $to 收款地址
  274. * 收款地址 to 请检查该地址是否是想要收款的地址,以免造成资金丢失!!
  275. * @param string $amount 提币数量
  276. * FIL 请求示例
  277. * 1.{
  278. * 2. "appid": "Appid", //应用Appid
  279. * 3. "method": "transfer",
  280. * 4. "sign": "签名串",
  281. * 5. "name": "FIL",
  282. * 6. "from": "转出地址",
  283. * 7. "to": "收款地址",
  284. * 8. "amount": "转账数量",
  285. * 9.}
  286. * @param string $change_address 找零地址 找零地址 change_address 值默认为 转出地址 from 。
  287. * @param float $fee_amount 自定义矿工费 交易可以自定义矿工费 fee_amount 。
  288. * 矿工费过低会导致交易失败或确认过慢!
  289. * BTC / BCH / LTC 请求示例
  290. * 1.{
  291. * 2. "appid": "Appid", //应用Appid
  292. * 3. "method": "transfer",
  293. * 4. "sign": "签名串",
  294. * 5. "name": "币种名称", //BTC / BCH / LTC
  295. * 6. "from": "转出地址",
  296. * 7. "to": "收款地址",
  297. * 8. "amount": "转账数量",
  298. * 9. "change_address": "找零地址", //值选填
  299. * 10. "fee_amount": "自定义矿工费" //值选填
  300. * 11.}
  301. * @param int $nonce 交易序号
  302. * ERC20 的矿工费只能扣除 转出地址 上的 ETH币,如果没有则要转 ETH币 到 ERC20地址上,才能进行提币或转出。
  303. * ETH / ERC20 请求示例
  304. * 1.{
  305. * 2. "appid": "Appid", //应用Appid
  306. * 3. "method": "transfer",
  307. * 4. "sign": "签名串",
  308. * 5. "name": "ETH", //ETH 或 ERC20代币 如:USDT_ERC20
  309. * 6. "from": "转出地址",
  310. * 7. "to": "收款地址",
  311. * 8. "amount": "转账数量",
  312. * 9. "gas": "Gas限制",
  313. * 10. "gasPrice": "Gas价格",
  314. * 11. "nonce": "交易序号", //选填
  315. * 12.}
  316. * @param string $fee_address
  317. * 在币种 USDT-OMNI 下创建一个地址,作为USDT-OMNI交易时的矿工费扣除地址。如果不指定旷工费地址则 转出地址 上必须要有足够的 BTC币。
  318. * USDT-OMNI交易可以自定义矿工费数量 fee_amount ,建议将矿工费设置在 0.0001 以上。
  319. * 每一笔USDT交易都会有 0.00000546 BTC 一并发送到收款地址上,这 0.00000546 BTC 是必须存在的,如果地址上没有这 0.00000546 BTC 则无法进行交易转出,注意这和矿工费不一样。
  320. * USDT-OMNI 请求示例
  321. * 1.{
  322. * 2. "appid": "Appid", //应用Appid
  323. * 3. "method": "transfer",
  324. * 4. "sign": "签名串",
  325. * 5. "name": "USDT_OMNI",
  326. * 6. "from": "转出地址",
  327. * 7. "to": "收款地址",
  328. * 8. "amount": "转账数量",
  329. * 9. "fee_address": "矿工费扣除地址", //值选填,默认为转出地址
  330. * 10. "fee_amount": "自定义矿工费" //值选填
  331. * 11.}
  332. * @param string $memo 交易备注
  333. * 大多数交易平台在转入EOS时都需要填写 memo ,在转账时请仔细确认.
  334. * EOS 请求示例
  335. * 1.{
  336. * 2. "appid": "Appid", //应用Appid
  337. * 3. "method": "transfer",
  338. * 4. "sign": "签名串",
  339. * 5. "name": "EOS",
  340. * 6. "from": "转出地址",
  341. * 7. "to": "收款地址",
  342. * 8. "amount": "转账数量",
  343. * 9. "memo": "交易备注", //值选填
  344. * 10.}
  345. *
  346. * XRP 矿工费过低会导致交易失败或确认过慢,建议将矿工费设置为 0.005-0.01 XRP
  347. * XRP 交易标签 memo 只能为数字 0 - 4294967295
  348. * XRP 请求示例
  349. * 1.{
  350. * 2. "appid": "Appid", //应用Appid
  351. * 3. "method": "transfer",
  352. * 4. "sign": "签名串",
  353. * 5. "name": "XRP",
  354. * 6. "from": "转出地址",
  355. * 7. "to": "收款地址",
  356. * 8. "amount": "转账数量",
  357. * 9. "fee_amount": "自定义旷工费", //值选填
  358. * 10. "memo": "交易备注", //值选填
  359. * 11.}
  360. * TRX / TRC20 转账金额必须 >= 0.0001。
  361. * TRC20 提币请保证转出地址上有 3TRX 才能进行 TRC20 转出!
  362. * TRX 提币如果收款地址未激活,那么转出地址必须保留 1TRX 作为矿工费!
  363. * @return bool|false|string
  364. * 正常提币返回示例
  365. * 1.{
  366. * 2. "code": 0,
  367. * 3. "message": "交易发送成功,请等待广播确认",
  368. * 4. "data": {
  369. * 5. "audit": 0,
  370. * 6. "hash": "****", //交易hash值,可在区块浏览器查询
  371. * 7. "from": "****", //转出地址
  372. * 8. "to": "****", //接收地址
  373. * 9. "amount": "0.00001", //交易数量
  374. * 10. "fee_amount": "0.000003" //交易矿工费
  375. * 11. },
  376. * 12. "time": "2019-01-0100:00:00"
  377. * 13.}
  378. * 交易进入审核流程返回示例
  379. * 1.{
  380. * 2. "code": 0,
  381. * 3. "message": "交易已发送至审核列表",
  382. * 4. "data": {
  383. * 5. "audit": 1,
  384. * 6. "number": "****" //审核记录编号
  385. * 7. },
  386. * 8. "time": "2019-01-0100:00:00"
  387. * 9.}
  388. * 触发交易防护的交易流程
  389. *
  390. * 提交交易
  391. *
  392. * 当交易触发防护后返回数据包含 audit 和 number 两个数据:
  393. * audit=1 表示交易进入交易审核列表。
  394. * number 则是交易进入审核后的唯一单号。
  395. * 提交易交易后请将 audit 和 number 保存。
  396. *
  397. * 开始审核交易
  398. *
  399. * 控制器管理审核记录:https://console.ztpay.org/merchants/trading/audit
  400. *
  401. * 审核记录分为三种:
  402. * 待审核:表示这些交易需要审核。
  403. * 已审核:表示这些交易已发出上链并返回了交易的hash值。
  404. * 已取消:表示取消这笔交易发出或者交易在发出时因其他原因发出失败。
  405. *
  406. * 选择待审核交易:
  407. * 确认交易:表示该审核数据无误可发出,在确认后系统会将该笔交易推送上链(可能会因为矿工费等原因导致交易推送失败,失败后可再次发送)。
  408. * 取消交易:表示取消这笔交易的审核,不会上链。
  409. *
  410. * 交易审核后回调
  411. *
  412. * 交易在审核后会发出审核回调数据
  413. * 1.{
  414. * 2. "audit_trading": 1,//存在此字段表示为交易审核通知
  415. * 3. "audit_time":"2019-01-01 00:00:00",//交易的审核时间
  416. * 4. "appid": "应用Appid",
  417. * 5. "number": "审核记录编号,提交交易时会返回这个参数值",
  418. * 6. "hash": "审核通过后的交易hash值,可通过此值查询交易信息",
  419. * 7. "state": '1',//1=审核通过,2=取消审核(交易不上链)
  420. * 8.}
  421. *
  422. *
  423. * 其中 number 字段等于在提交交易时返回的 number 。
  424. *
  425. * 如果交易上链了审核通知会包含 hash 字段,该字段值为该笔交易的区块链hash。
  426. *
  427. * 交易上链后成功或失败的回调
  428. *
  429. * 交易上链后无论是成功还是失败,系统都会向回调地址发送交易数据。
  430. * https://www.ztpay.org/docs/5912069.html
  431. *
  432. * 该数据中包含了 hash 字段,此字段值与交易审核后的回调数据中 hash 值一样。
  433. */
  434. public static function transfer($coin_type, $from, $to, $amount,
  435. $change_address = '', $fee_amount = 0.00,//BTC/USDT-OMNI/XRP 用
  436. $nonce = 0,//ETH / ERC20 用
  437. $fee_address = '',//USDT-OMNI 用
  438. $memo = ''//EOS/XRP 用
  439. )
  440. {
  441. $data = [
  442. 'appid' => self::$app_id,
  443. 'method' => 'get_balance',
  444. 'name' => $coin_type,
  445. 'from' => $from,
  446. 'to' => $to,
  447. 'amount' => $amount,
  448. ];
  449. if ($coin_type = "BTC" || $coin_type = "BCH" || $coin_type = "LTC") {
  450. if ($change_address) $data['change_address'] = $change_address;
  451. if ($fee_amount > 0) $data['fee_amount'] = $fee_amount;
  452. }
  453. if ($coin_type = "ETH" || explode('_', $coin_type)[1] == "ERC20" || explode('_', $coin_type)[1] == "TRC20") {
  454. if ($coin_type = 'ETH') {
  455. $gas = 30000;
  456. } else {
  457. $gas = 70000;
  458. }
  459. $gasPrice = self::get_eth_gasprice();
  460. if ($gasPrice['code'] != 0) {
  461. return $gasPrice;
  462. } else {
  463. $gasPrice = $gasPrice['data']['fastest'];
  464. }
  465. $data['gas'] = $gas;
  466. $data['gasPrice'] = $gasPrice;
  467. if ($nonce > 0) $data['nonce'] = $nonce;
  468. }
  469. if ($coin_type = "USDT_OMNI") {
  470. if ($fee_address) $data['fee_address'] = $fee_address;
  471. if ($fee_amount > 0) $data['fee_amount'] = $fee_amount;
  472. }
  473. if ($coin_type = "EOS") {
  474. if ($memo) $data['memo'] = $memo;
  475. }
  476. if ($coin_type = "XRP") {
  477. if ($memo) $data['memo'] = $memo;
  478. if ($fee_amount > 0) $data['fee_amount'] = $fee_amount;
  479. }
  480. return self::request($data);
  481. }
  482. /**
  483. * 以太坊网络Gas价格
  484. * @return bool|false|string
  485. * 返回示例
  486. * 1.{
  487. * 2. "code": 0,
  488. * 3. "message": "gasPrice获取成功",
  489. * 4. "data": {
  490. * 5. "safeLow": "30.0", //动态值
  491. * 6. "standard": "30.0", //动态值
  492. * 7. "fast": "35.0", //动态值
  493. * 8. "fastest": "40.0", //动态值
  494. * 9. "from": "https://www.etherchain.org/api/gasPriceOracle"
  495. * 10. },
  496. * 11. "time": "2020-05-1414:32:39"
  497. * 12.}
  498. */
  499. public static function get_eth_gasprice()
  500. {
  501. $data = [
  502. 'appid' => self::$app_id,
  503. 'method' => 'get_eth_gasprice',
  504. ];
  505. return self::request($data);
  506. }
  507. /**
  508. * ERC20委托交易
  509. * 假设:A账号有 10000 个ERC20代币,B账号没有ERC20代币,C账号也没有ERC20代币。
  510. * 那么:A账号 委托 B账号 转给 C账号 100个ERC20代币 就属于委托交易。
  511. * @param $coin_type
  512. * @param $approve_from
  513. * 委托地址必须是在 ztPay 里面存在的地址。
  514. * @param $approve_amount
  515. * @param int $nonce
  516. * @return bool|false|string
  517. */
  518. public static function erc20_approve($coin_type, $approve_from, $approve_amount, $nonce = 0)
  519. {
  520. $gasPrice = self::get_eth_gasprice();
  521. if ($gasPrice['code'] != 0) {
  522. return $gasPrice;
  523. } else {
  524. $gasPrice = $gasPrice['data']['fastest'];
  525. }
  526. $data = [
  527. 'appid' => self::$app_id,
  528. 'method' => 'erc20_approve',
  529. 'name' => $coin_type,
  530. 'approve_from' => $approve_from,
  531. 'approve_amount' => $approve_amount,
  532. 'gasPrice' => $gasPrice,
  533. ];
  534. if ($nonce) $data['nonce'] = $nonce;
  535. return self::request($data);
  536. }
  537. /**
  538. * ERC20查询委托
  539. * @param $coin_type
  540. * @param $approve_from
  541. * @return bool|false|string
  542. * 1.{
  543. * 2. "code": 0,
  544. * 3. "message": "委托查询成功",
  545. * 4. "data": {
  546. * 5. "approve_from": "****", //委托地址
  547. * 6. "approve_to": "****", //被委托地址 此地址为 平台固定地址
  548. * 7. "approve_amount": "0.00001", //委托剩余数量
  549. * 8. "approve_name": "币名称" //委托的ERC20代币名称
  550. * 9. },
  551. * 10. "time": "2019-01-0100:00:00"
  552. * 11.}
  553. */
  554. public static function erc20_allowance($coin_type, $approve_from)
  555. {
  556. $data = [
  557. 'appid' => self::$app_id,
  558. 'method' => 'erc20_allowance',
  559. 'name' => $coin_type,
  560. 'approve_from' => $approve_from,
  561. ];
  562. return self::request($data);
  563. }
  564. /**
  565. * ETH批量转账(付费接口)
  566. * 仅适用于 ETH
  567. * 由于接口限制,批量转账每笔需要 0.01ETH 的合约费用(如果交易失败不会扣这个费用)。
  568. * @param $coin_type
  569. * @param $from
  570. * @param $batch_address
  571. * @param float $token_fee
  572. * 合约费用为每次交易固定 “0.01ETH”,所以转出地址 from 里面除了要有足够的ETH支付矿工费还有有多余的 “0.01ETH” 支付合约费用。
  573. * @param int $nonce
  574. * @return bool|false|mixed|string
  575. */
  576. public static function eth_batch_transfer($coin_type, $from, $batch_address, $token_fee = 0.01, $nonce = 0)
  577. {
  578. $gasPrice = self::get_eth_gasprice();
  579. if ($gasPrice['code'] != 0) {
  580. return $gasPrice;
  581. } else {
  582. $gasPrice = $gasPrice['data']['fastest'];
  583. }
  584. $data = [
  585. 'appid' => self::$app_id,
  586. 'method' => 'eth_batch_transfer',
  587. 'name' => $coin_type,
  588. 'from' => $from,
  589. 'batch_address' => is_array($batch_address) ? json_encode($batch_address) : $batch_address,
  590. 'token_fee' => $token_fee,
  591. 'gasPrice' => $gasPrice,
  592. ];
  593. if ($nonce) $data['nonce'] = $nonce;
  594. return self::request($data);
  595. }
  596. /**
  597. * ERC20批量转账(付费接口)
  598. * 仅适用于 ERC20代币
  599. * ERC20代币批量转账条件 【重要】
  600. * 例如:A账号 需要进行批量转出交易,那么 A账号 需要调用 委托接口 进行委托授权(已委托过且还有委托金额则不必在委托),委托金额必须 ≥ 要批量和转出的金额总和。
  601. * 例如:A账号 对 B账号转出10个ERC20代币 对 C账号转出5个ERC20代币,那么 A账号的委托的金额必须还剩 ≥15个,否则转账失败。
  602. * 委托可以一次性委托较大的金额,然后后面转出时就可以不必在委托。
  603. * 也可以每次批量转出前都进行一次委托。
  604. * @param $coin_type
  605. * @param $from
  606. * @param $batch_address
  607. * @param float $token_fee
  608. * @param int $nonce
  609. * @return bool|false|mixed|string
  610. */
  611. public static function erc20_batch_transfer($coin_type, $from, $batch_address, $token_fee = 0.01, $nonce = 0)
  612. {
  613. $gasPrice = self::get_eth_gasprice();
  614. if ($gasPrice['code'] != 0) {
  615. return $gasPrice;
  616. } else {
  617. $gasPrice = $gasPrice['data']['fastest'];
  618. }
  619. $data = [
  620. 'appid' => self::$app_id,
  621. 'method' => 'erc20_batch_transfer',
  622. 'name' => $coin_type,
  623. 'from' => $from,
  624. 'batch_address' => is_array($batch_address) ? json_encode($batch_address) : $batch_address,
  625. 'token_fee' => $token_fee,
  626. 'gasPrice' => $gasPrice,
  627. ];
  628. if ($nonce) $data['nonce'] = $nonce;
  629. return self::request($data);
  630. }
  631. /**
  632. * 获取交易日志
  633. * @param string $coin_type 指定币种
  634. * @param string $from 指定转出地址
  635. * @param string $to 指定收款地址
  636. * @param int $transaction_page 获取页码,默认为1
  637. * @param int $transaction_pagesize 每页获取数量,最大100条
  638. * @param int $transaction_type 日志类型:0-全部 1-转入 2-转出
  639. * 此参数用于筛选交易类型
  640. * 0-全部记录
  641. * 1-转入记录
  642. * 2-转出记录
  643. * 3-测试记录
  644. * @param string $transaction_time 按时间区间查询
  645. * 此参数用于筛选指定时间区间的交易
  646. * 时间格式:开始时间/结束时间
  647. * 请求示例:2019-01-01 00:00:00/2020-01-01 00:00:00
  648. * 参数注意:结束时间必须大于开始时间,两个时间之间使用 / 分割。
  649. * @return bool|false|string
  650. * 返回示例
  651. * 1.{
  652. * 2. "message": "接口获取成功",
  653. * 3. "data": {
  654. * 4. "code": 0,
  655. * 5. "message": "交易日志获取成功",
  656. * 6. "data": {
  657. * 7. "transaction_page": 1,
  658. * 8. "transaction_pagesize": 1,
  659. * 9. "transaction_count": 1, //总数量
  660. * 10. "transaction_list": [
  661. * 11. {
  662. * 12. "appid": "zttx****yzym", //应用Appid
  663. * 13. "member_id": "000000", //会员ID
  664. * 14. "hash": "0x31b875***232b100", //交易hash
  665. * 15. "from": "0xd18e0f****90174ba70ecd", //转出地址
  666. * 16. "to": "0x6348532****58d2abbba4c1", //收款地址
  667. * 17. "memo": "", //交易备注或标签,仅EOS,XRP存在数据
  668. * 18. "amount": "180.00000000", //交易数量
  669. * 19. "fee_amount": "0.00007992", //交易矿工费
  670. * 20. "add_time": "2019-10-2210:24:03", //记录时间
  671. * 21. "data": "",
  672. * 22. "type": 1, //1=转入,2=转出
  673. * 23. "state": 1, //1=成功,2=失败
  674. * 24. "name": "", //币种名称
  675. * 25. "name_alias": "", //代币表示,如 ERC20
  676. * 26. }
  677. * 27. ]
  678. * 28. }
  679. * 29. },
  680. * 30. "time": "2019-01-0100:00:00"
  681. * 31.}
  682. */
  683. public static function transaction_logs($coin_type = '', $from = '', $to = '', $transaction_page = 0, $transaction_pagesize = 0, $transaction_type = 0, $transaction_time = "")
  684. {
  685. $data = [
  686. 'appid' => self::$app_id,
  687. 'method' => 'transaction_logs',
  688. ];
  689. if ($coin_type) $data['name'] = $coin_type;
  690. if ($from) $data['from'] = $from;
  691. if ($to) $data['to'] = $to;
  692. if ($transaction_page) $data['transaction_page'] = $transaction_page;
  693. if ($transaction_pagesize) $data['transaction_pagesize'] = $transaction_pagesize;
  694. if ($transaction_type) $data['transaction_type'] = $transaction_type;
  695. if ($transaction_time) $data['transaction_time'] = $transaction_time;
  696. return self::request($data);
  697. }
  698. /**
  699. * @param $coin_type
  700. * @param $hash
  701. * @param int $tr_native
  702. * tr_native = 1 表示获取平台已存储的数据,该数据和交易通知收到的数据一样;
  703. * tr_native = 0 表示获取区块链交易的原生数据,该数据未经过过滤处理,存在许多不同的字段数据;
  704. * @return bool|false|string
  705. */
  706. public static function transaction_detail($coin_type, $hash, $tr_native = -1)
  707. {
  708. $data = [
  709. 'appid' => self::$app_id,
  710. 'method' => 'transaction_detail',
  711. 'hash' => $hash,
  712. 'name' => $coin_type,
  713. ];
  714. if ($tr_native != -1) $data['tr_native'] = $tr_native;
  715. return self::request($data);
  716. }
  717. /**
  718. * 币币行情
  719. * @return bool|false|string
  720. * 返回示例
  721. * 1.{
  722. * 2. "code": 0,
  723. * 3. "message": "行情获取成功",
  724. * 4. "data": {
  725. * 5. "btc": {
  726. * 6. "gains": "-0.90", //涨幅百分比
  727. * 7. "cny": "56078.68", //折合人民币价格
  728. * 8. "usd": 7918.48, //折合美元的价格
  729. * 9. "high": 7998.8, //24小时美元最高价格
  730. * 10. "high_cny": "56647.50", //24小时人民币最高价
  731. * 11. "low": 7869.9, //24小时美元最低价
  732. * 12. "low_cny": "55734.63" //24小时人民币最低价
  733. * 13. },
  734. * 14. "usdt": {
  735. * 15. "gains": "0.01",
  736. * 16. "cny": "7.09",
  737. * 17. "usd": 1.0011,
  738. * 18. "high": 1.0011,
  739. * 19. "high_cny": "7.09",
  740. * 20. "low": 1.0008,
  741. * 21. "low_cny": "7.09"
  742. * 22. }
  743. * 23. },
  744. * 24. "time": "2019-01-0100:00:00"
  745. * 25.}
  746. */
  747. public static function market()
  748. {
  749. $data = [
  750. 'appid' => self::$app_id,
  751. 'method' => 'market',
  752. ];
  753. return self::request($data);
  754. }
  755. /**
  756. * EOS获取账号信息
  757. * @param string $con_type 币种名称
  758. * @param string $eos_account_name EOS账号
  759. * @return bool|false|string
  760. */
  761. public static function eos_get_account($con_type, $eos_account_name)
  762. {
  763. $data = [
  764. 'appid' => self::$app_id,
  765. 'method' => 'eos_get_account',
  766. 'name' => $con_type,
  767. 'eos_account_name' => $eos_account_name,
  768. ];
  769. return self::request($data);
  770. }
  771. }