CashTradeController.php 19 KB

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