CashTradeController.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. <?php
  2. namespace app\api\controller\trade;
  3. use app\models\mining\MiningMachine;
  4. use app\models\trade\CashTradeOrder;
  5. use app\models\trade\CashTradeOrderPayment;
  6. use app\models\user\User;
  7. use app\models\user\UserMoney;
  8. use app\Request;
  9. use crmeb\basic\BaseModel;
  10. use crmeb\repositories\OrderRepository;
  11. use crmeb\services\AliPayService;
  12. use crmeb\services\CacheService;
  13. use crmeb\services\UtilService;
  14. use think\db\exception\DataNotFoundException;
  15. use think\db\exception\DbException;
  16. use think\db\exception\ModelNotFoundException;
  17. class CashTradeController
  18. {
  19. /**
  20. * @param $type
  21. * @return bool|string
  22. */
  23. public function merged($type)
  24. {
  25. // $key = 'mx0J52sOMse4D3bE3c';
  26. // $sec = 'ea508c4381c84527ae892fc5cbdd674d';
  27. $type = strtolower($type);
  28. // $type = 'eth';
  29. $url = "https://api.huobi.de.com/market/detail/merged?symbol={$type}usdt";
  30. // var_dump($url);
  31. $res = do_request($url, [], null, false, true);
  32. return json_decode($res, true);
  33. }
  34. /**
  35. * @param Request $request
  36. * @return mixed
  37. * @throws DataNotFoundException
  38. * @throws DbException
  39. * @throws ModelNotFoundException
  40. */
  41. /**
  42. * @param Request $request
  43. * @return mixed
  44. * @throws DataNotFoundException
  45. * @throws DbException
  46. * @throws ModelNotFoundException
  47. */
  48. public function can_trade_money(Request $request)
  49. {
  50. $list = sys_data('money_type');
  51. $new = [];
  52. foreach ($list as $v) {
  53. if (explode('_', $v['code'])[0] == "USDT") {
  54. if ($v['price'] <= 0) {
  55. //计算前一天成交的平均价格
  56. $v['price'] = CashTradeOrder::averagePrice($v['code']);
  57. }
  58. $usdt_price = $v['price'];
  59. }
  60. if ($v['is_trade']) {
  61. // if ($v['price'] <= 0) {
  62. // //计算前一天成交的平均价格
  63. // $v['price'] = CashTradeOrder::averagePrice($v['code']);
  64. // }
  65. if ($request->uid())
  66. $v['wallet'] = UserMoney::initialUserMoney($request->uid(), $v['code']);
  67. unset($v['cash_commission_ratio']);
  68. unset($v['cash_commission_type']);
  69. unset($v['can_cash']);
  70. unset($v['can_trade']);
  71. unset($v['is_trade']);
  72. $new[] = $v;
  73. }
  74. }
  75. foreach ($new as $k => $v) {
  76. $new[$k]['usdt'] = (isset($usdt_price) && $usdt_price > 0) ? bcdiv($new[$k]['price'], $usdt_price, 8) : 0;
  77. }
  78. return app('json')->success('ok', $new);
  79. }
  80. public function all_money(Request $request)
  81. {
  82. $list = sys_data('money_type');
  83. $new = [];
  84. $status = $request->get('index', 0);
  85. foreach ($list as $v) {
  86. if (explode('_', $v['code'])[0] == "USDT") {
  87. if ($v['price'] <= 0) {
  88. //计算前一天成交的平均价格
  89. $v['price'] = CashTradeOrder::averagePrice($v['code']);
  90. }
  91. $usdt_price = $v['price'];
  92. }
  93. if ($request->uid())
  94. $v['wallet'] = UserMoney::initialUserMoney($request->uid(), $v['code']);
  95. unset($v['cash_commission_ratio']);
  96. unset($v['cash_commission_type']);
  97. unset($v['can_cash']);
  98. unset($v['can_trade']);
  99. unset($v['is_trade']);
  100. $v['has_mining'] = (MiningMachine::valid()->where('get_money_type', $v['code'])->find()) ? 1 : 0;
  101. $new[] = $v;
  102. }
  103. // foreach ($new as $k => $v) {
  104. // $new[$k]['usdt'] = (isset($usdt_price) && $usdt_price > 0) ? bcdiv($new[$k]['price'], $usdt_price, 8) : 0;
  105. // }
  106. if ($status) {
  107. foreach ($new as $k => $v) {
  108. if (!(explode('_', $v['code'])[0] == "USDT")) {
  109. $res = $this->merged($v['code']);
  110. // var_dump($res);
  111. if ($res['status'] == 'error') {
  112. $new[$k]['usdt'] = 0;
  113. $new[$k]['price'] = 0;
  114. $new[$k]['up'] = 0;
  115. } else {
  116. $new[$k]['usdt'] = $res['tick']['close'];
  117. $new[$k]['price'] = bcmul($usdt_price, $new[$k]['usdt'], 2);
  118. $new[$k]['up'] = bcdiv(bcsub($res['tick']['close'], $res['tick']['open'], 8), $res['tick']['open'], 4);
  119. }
  120. //$new[$k]['merged'] = $res;
  121. } else {
  122. $new[$k]['usdt'] = 1;
  123. $new[$k]['up'] = 0;
  124. //$new[$k]['merged'] = $res;
  125. }
  126. }
  127. }
  128. return app('json')->success('ok', $new);
  129. }
  130. public function can_cash_money(Request $request)
  131. {
  132. $list = sys_data('money_type');
  133. $new = [];
  134. foreach ($list as $v) {
  135. if (explode('_', $v['code'])[0] == "USDT") {
  136. if ($v['price'] <= 0) {
  137. //计算前一天成交的平均价格
  138. $v['price'] = CashTradeOrder::averagePrice($v['code']);
  139. }
  140. $usdt_price = $v['price'];
  141. }
  142. if ($v['can_cash']) {
  143. // if ($v['price'] <= 0) {
  144. // //计算前一天成交的平均价格
  145. // $v['price'] = CashTradeOrder::averagePrice($v['code']);
  146. // }
  147. if ($request->uid())
  148. $v['wallet'] = UserMoney::initialUserMoney($request->uid(), $v['code']);
  149. unset($v['cash_commission_ratio']);
  150. unset($v['cash_commission_type']);
  151. unset($v['can_cash']);
  152. unset($v['can_trade']);
  153. unset($v['is_trade']);
  154. $new[] = $v;
  155. }
  156. }
  157. foreach ($new as $k => $v) {
  158. $new[$k]['usdt'] = (isset($usdt_price) && $usdt_price > 0) ? bcdiv($new[$k]['price'], $usdt_price, 8) : 0;
  159. }
  160. return app('json')->success('ok', $new);
  161. }
  162. /**
  163. * @param Request $request
  164. * @return mixed
  165. */
  166. public function sale_list(Request $request)
  167. {
  168. $where = UtilService::getMore([
  169. ['money_type', ''],
  170. ['uid', 0],
  171. ['page', 1],
  172. ['limit', 10],
  173. ['status', 1],
  174. ], $request);
  175. $where['trade_type'] = 1;
  176. return app('json')->success('ok', CashTradeOrder::getList($where));
  177. }
  178. /**
  179. * @param Request $request
  180. * @return mixed
  181. */
  182. public function buy_list(Request $request)
  183. {
  184. $where = UtilService::getMore([
  185. ['money_type', ''],
  186. ['uid', 0],
  187. ['page', 1],
  188. ['limit', 10],
  189. ['status', 1],
  190. ], $request);
  191. $where['trade_type'] = 2;
  192. return app('json')->success('ok', CashTradeOrder::getList($where));
  193. }
  194. /**
  195. * 挂起
  196. * @param Request $request
  197. * @return mixed
  198. * @throws DataNotFoundException
  199. * @throws DbException
  200. * @throws ModelNotFoundException
  201. */
  202. public function hang(Request $request)
  203. {
  204. $user = $request->user();
  205. $uid = $user['uid'];
  206. list($money_type, $money_num, $price, $trade_type, $trade_way, $from, $hang_time, , $captcha) = UtilService::postMore([
  207. ['money_type', 'USDT_ERC20', '', '', ['not_empty_check', function ($item) {
  208. $moneys = sys_data('money_type');
  209. $new_money = [];
  210. foreach ($moneys as $v) {
  211. if ($v['is_trade'] == 1) {
  212. $new_money[] = $v['code'];
  213. }
  214. }
  215. return in_array($item, $new_money);
  216. }], ['请选择交易的币种', '请选择支持交易的币种']],
  217. ['money_num', 0],
  218. ['price', 0],
  219. ['trade_type', 0, '', '', ['not_empty_check', function ($item) {
  220. return in_array($item, [1, 2]);
  221. }], '请选择挂买或挂卖'],
  222. ['trade_way', 'weixin'],
  223. ['from', 'weixin'],
  224. ['hang_time', 0, '', '', ['not_empty_check', function ($item) {
  225. return $item > 0 && $item < 1000;
  226. }], '请输入正确的挂出时常'],
  227. ['trade_psw', '', '', '', ['not_empty_check', function ($item) use ($user) {
  228. return md5(md5($item)) == $user['trade_pwd'];
  229. }], ['请输入交易密码', '交易密码错误']],
  230. ['captcha', '']
  231. ], $request, true);
  232. if ($money_num <= 0) {
  233. return app('json')->fail('请输入币数');
  234. }
  235. if ($price <= 0) {
  236. return app('json')->fail('请输入单价');
  237. }
  238. $sum = bcmul($money_num, $price, 2);
  239. if ($sum >= 10000) {
  240. $verifyCode = CacheService::get('code_' . $user['account']);
  241. if (!$verifyCode)
  242. return app('json')->fail('请先获取验证码');
  243. $verifyCode = substr($verifyCode, 0, 6);
  244. if ($verifyCode != $captcha)
  245. return app('json')->fail('验证码错误');
  246. }
  247. switch ($trade_type) {
  248. case 1:
  249. $res = CashTradeOrder::hangSale($uid, $money_type, $money_num, $price, $hang_time);
  250. break;
  251. case 2:
  252. $res = CashTradeOrder::hangBuy2($uid, $money_type, $money_num, $price, $hang_time);//改方式
  253. // $res = CashTradeOrder::hangBuy($uid, $money_type, $money_num, $price, $hang_time);
  254. // if ($res) {
  255. // $orderId = $res['order_id'];
  256. // switch ($trade_way) {
  257. // case "weixin":
  258. // $orderInfo = CashTradeOrderPayment::where('order_id', $orderId)->find();
  259. // if (!$orderInfo || !isset($orderInfo['paid'])) return app('json')->fail('支付订单不存在!');
  260. // $orderInfo = $orderInfo->toArray();
  261. // if ($orderInfo['paid']) return app('json')->fail('支付已支付!');
  262. // //支付金额为0
  263. // if (bcsub((float)$orderInfo['pay_money'], 0, 2) <= 0) {
  264. // //创建订单jspay支付
  265. // $payPriceStatus = CashTradeOrderPayment::jsPayPrice($orderId, $uid);
  266. // if ($payPriceStatus)//0元支付成功
  267. // return app('json')->status('success', '微信支付成功');
  268. // else
  269. // return app('json')->status('pay_error', CashTradeOrderPayment::getErrorInfo());
  270. // } else {
  271. // try {
  272. // if ($from == 'routine') {
  273. // $jsConfig = OrderRepository::tradeJsPay($orderId); //创建订单jspay
  274. // } else if ($from == 'weixinh5') {
  275. // $jsConfig = OrderRepository::tradeH5Pay($orderId);
  276. // } else {
  277. // $jsConfig = OrderRepository::tradeWxPay($orderId);
  278. // }
  279. // } catch (\Exception $e) {
  280. // return app('json')->status('pay_error', $e->getMessage());
  281. // }
  282. // $res['jsConfig'] = $jsConfig;
  283. // if ($from == 'weixinh5') {
  284. // return app('json')->status('wechat_h5_pay', '订单创建成功', $res);
  285. // } else {
  286. // return app('json')->status('wechat_pay', '订单创建成功', $res);
  287. // }
  288. // }
  289. // case 'yue':
  290. // if (CashTradeOrderPayment::yuePay($orderId, $request->uid()))
  291. // return app('json')->status('success', '余额支付成功');
  292. // else {
  293. // $errorinfo = CashTradeOrderPayment::getErrorInfo();
  294. // if (is_array($errorinfo))
  295. // return app('json')->status($errorinfo['status'], $errorinfo['msg']);
  296. // else
  297. // return app('json')->status('pay_error', $errorinfo);
  298. // }
  299. // case 'ali':
  300. // try {
  301. // $jsConfig = AliPayService::createTrade($orderId); //创建订单jspay
  302. // } catch (\Exception $e) {
  303. // return app('json')->status('pay_error', $e->getMessage());
  304. // }
  305. // $res['jsConfig'] = $jsConfig;
  306. // return app('json')->status('ali_pay', '订单创建成功', $res);
  307. // default:
  308. // return app('json')->fail('支付方式错误');
  309. // }
  310. // } else return app('json')->fail(CashTradeOrder::getErrorInfo('订单生成失败!'));
  311. break;
  312. default:
  313. $res = false;
  314. break;
  315. }
  316. if ($res) {
  317. return app('json')->success('挂出成功');
  318. } else {
  319. return app('json')->fail('挂出失败:' . CashTradeOrder::getErrorInfo('挂出错误'));
  320. }
  321. }
  322. public function trade(Request $request)
  323. {
  324. $user = $request->user();
  325. $uid = $user['uid'];
  326. list($id, $trade_way, $from, , $captcha) = UtilService::postMore([
  327. ['id', 'USDT_ERC20', '', '', ['not_empty_check'], ['请选择要进行的交易']],
  328. ['trade_way', 'weixin'],
  329. ['from', 'weixin'],
  330. ['trade_psw', '', '', '', ['not_empty_check', function ($item) use ($user) {
  331. return md5(md5($item)) == $user['trade_pwd'];
  332. }], ['请输入交易密码', '交易密码错误']],
  333. ['captcha', '']
  334. ], $request, true);
  335. $order = CashTradeOrder::setStatus(1)->where('id', $id)->find();
  336. // var_dump(CashTradeOrder::getLastSql());
  337. if (!$order) {
  338. return app('json')->fail('订单不存在或已结束挂出');
  339. }
  340. $sum = bcmul($order['money_num'], $order['price'], 2);
  341. if ($sum >= 10000) {
  342. $verifyCode = CacheService::get('code_' . $user['account']);
  343. if (!$verifyCode)
  344. return app('json')->fail('请先获取验证码');
  345. $verifyCode = substr($verifyCode, 0, 6);
  346. if ($verifyCode != $captcha)
  347. return app('json')->fail('验证码错误');
  348. }
  349. switch ($order['trade_type']) {
  350. case 2:
  351. $res = CashTradeOrder::sale($uid, $id);
  352. break;
  353. case 1:
  354. $res = CashTradeOrder::buy2($uid, $id);
  355. // if ($res) {
  356. // $orderId = $res['order_id'];
  357. // switch ($trade_way) {
  358. // case "weixin":
  359. // $orderInfo = CashTradeOrderPayment::where('order_id', $orderId)->find();
  360. // if (!$orderInfo || !isset($orderInfo['paid'])) return app('json')->fail('支付订单不存在!');
  361. // $orderInfo = $orderInfo->toArray();
  362. // if ($orderInfo['paid']) return app('json')->fail('支付已支付!');
  363. // //支付金额为0
  364. // if (bcsub((float)$orderInfo['pay_money'], 0, 2) <= 0) {
  365. // //创建订单jspay支付
  366. // $payPriceStatus = CashTradeOrderPayment::jsPayPrice($orderId, $uid);
  367. // if ($payPriceStatus)//0元支付成功
  368. // return app('json')->status('success', '微信支付成功');
  369. // else
  370. // return app('json')->status('pay_error', CashTradeOrderPayment::getErrorInfo());
  371. // } else {
  372. // try {
  373. // if ($from == 'routine') {
  374. // $jsConfig = OrderRepository::tradeJsPay($orderId); //创建订单jspay
  375. // } else if ($from == 'weixinh5') {
  376. // $jsConfig = OrderRepository::tradeH5Pay($orderId);
  377. // } else {
  378. // $jsConfig = OrderRepository::tradeWxPay($orderId);
  379. // }
  380. // } catch (\Exception $e) {
  381. // return app('json')->status('pay_error', $e->getMessage());
  382. // }
  383. // $res['jsConfig'] = $jsConfig;
  384. // if ($from == 'weixinh5') {
  385. // return app('json')->status('wechat_h5_pay', '订单创建成功', $res);
  386. // } else {
  387. // return app('json')->status('wechat_pay', '订单创建成功', $res);
  388. // }
  389. // }
  390. // case 'yue':
  391. // if (CashTradeOrderPayment::yuePay($orderId, $request->uid()))
  392. // return app('json')->status('success', '余额支付成功');
  393. // else {
  394. // $errorinfo = CashTradeOrderPayment::getErrorInfo();
  395. // if (is_array($errorinfo))
  396. // return app('json')->status($errorinfo['status'], $errorinfo['msg']);
  397. // else
  398. // return app('json')->status('pay_error', $errorinfo);
  399. // }
  400. // case 'ali':
  401. // try {
  402. // $jsConfig = AliPayService::createTrade($orderId); //创建订单jspay
  403. // } catch (\Exception $e) {
  404. // return app('json')->status('pay_error', $e->getMessage());
  405. // }
  406. // $res['jsConfig'] = $jsConfig;
  407. // return app('json')->status('ali_pay', '订单创建成功', $res);
  408. // default:
  409. // return app('json')->fail('支付方式错误');
  410. // }
  411. // } else return app('json')->fail(CashTradeOrder::getErrorInfo('订单生成失败!'));
  412. break;
  413. default:
  414. $res = false;
  415. break;
  416. }
  417. if ($res) {
  418. return app('json')->success('交易开始进行,' . $order['trade_type'] == 1 ? '请通过用户的转账方式交易并上传交易凭证' : '请等待买家转账并上传凭证');
  419. } else {
  420. return app('json')->fail('交易失败:' . CashTradeOrder::getErrorInfo('挂出错误'));
  421. }
  422. }
  423. public function myOrder(Request $request)
  424. {
  425. $where = UtilService::getMore([
  426. ['money_type', ''],
  427. ['page', 1],
  428. ['limit', 10],
  429. ['status', ''],
  430. ['trade_type', '']
  431. ], $request);
  432. // $where['trade_type'] = 2;
  433. $where['uid'] = $request->uid();
  434. return app('json')->success('ok', CashTradeOrder::getList($where));
  435. }
  436. public function uploadProof($id, Request $request)
  437. {
  438. $order = CashTradeOrder::get($id);
  439. $proof = $request->post('proof', '');
  440. if (!not_empty_check($proof)) return app('json')->fail('请上传凭证');
  441. if ($order['close_time'] < time()) return app('json')->fail('订单已关闭');
  442. switch ($order['trade_type']) {
  443. case 1:
  444. if ($order['trade_uid'] != $request->uid()) return app('json')->fail('订单交易方错误');
  445. if ($order['status'] != -1) return app('json')->fail('订单状态错误');
  446. break;
  447. case 2:
  448. if ($order['uid'] != $request->uid()) return app('json')->fail('订单交易方错误');
  449. if ($order['status'] != 0) return app('json')->fail('订单状态错误');
  450. break;
  451. default:
  452. break;
  453. }
  454. $res = CashTradeOrder::where('id', $id)->update(['proof' => $proof, 'status' => 3]);
  455. if ($res) {
  456. return app('json')->fail('上传成功');
  457. } else {
  458. return app('json')->fail('上传失败');
  459. }
  460. }
  461. public function cancel($id, Request $request)
  462. {
  463. $order = CashTradeOrder::get($id);
  464. if ($order['close_time'] < time()) return app('json')->fail('订单已关闭');
  465. if ($order['status'] > 0) return app('json')->fail('订单不可撤销');
  466. BaseModel::beginTrans();
  467. $res = true;
  468. switch ($order['trade_type']) {
  469. case 1:
  470. //退回币
  471. $res = $res && UserMoney::incomeMoney($order['uid'], $order['money_type'], $order['money_num'], 'hang_sale_cancel', '挂卖取消', '挂卖取消,退回钱包');
  472. $res = $res && CashTradeOrder::where('id', $order['id'])->update(['status' => 2]);
  473. break;
  474. case 2:
  475. //
  476. if ($order['trade_uid'])
  477. $res = $res && UserMoney::incomeMoney($order['trade_uid'], $order['money_type'], $order['money_num'], 'hang_buy_cancel', '挂买取消', '挂买取消,退回钱包');
  478. $res = $res && CashTradeOrder::where('id', $order['id'])->update(['status' => 2]);
  479. break;
  480. default:
  481. break;
  482. }
  483. BaseModel::checkTrans($res);
  484. if ($res) {
  485. return app('json')->fail('取消成功');
  486. } else {
  487. return app('json')->fail('取消失败');
  488. }
  489. }
  490. public function check($id, $ok, Request $request)
  491. {
  492. $order = CashTradeOrder::where('id', $id)->where('status', 3)->find();
  493. if (!in_array($ok, ['y', 'n'])) return app('json')->fail('参数错误');
  494. $res = true;
  495. BaseModel::beginTrans();
  496. if ($ok == 'y') {
  497. switch ($order['trade_type']) {
  498. case 1:
  499. if ($order['uid'] != $request->uid()) return app('json')->fail('订单审核方错误');
  500. $res = $res && UserMoney::incomeMoney($order['trade_uid'], $order['money_type'], $order['money_num'], '购币成功', 'buy_success', '购币成功,出售方' . $order['uid']);
  501. break;
  502. case 2:
  503. if ($order['trade_uid'] != $request->uid()) return app('json')->fail('订单审核方错误');
  504. $res = $res && UserMoney::incomeMoney($order['uid'], $order['money_type'], $order['money_num'], '购币成功', 'buy_success', '购币成功,出售方' . $order['trade_uid']);
  505. break;
  506. default:
  507. break;
  508. }
  509. $res = $res && CashTradeOrder::where('id', $id)->update(['status' => 1, 'trade_time' => time()]);
  510. BaseModel::checkTrans($res);
  511. if ($res) {
  512. return app('json')->fail('审核成功');
  513. } else {
  514. return app('json')->fail('审核失败');
  515. }
  516. } else {
  517. return app('json')->fail('请联系后台审核');
  518. }
  519. }
  520. }