CashTradeController.php 20 KB

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