ChatBuy.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\api\controller;
  4. use app\BaseController;
  5. use app\model\api\ChatBalanceLog;
  6. use app\model\api\ChatOrder;
  7. use app\model\api\User as UserModel;
  8. use app\Request;
  9. use app\services\chat\ChatBalanceService;
  10. /**
  11. * 聊天次数购买控制器
  12. */
  13. class ChatBuy extends BaseController
  14. {
  15. /**
  16. * 获取购买配置信息
  17. */
  18. public function config(Request $request)
  19. {
  20. $price = ChatBalanceService::getBuyPrice();
  21. $balance = ChatBalanceService::getBalance($request->user['uid']);
  22. return app('json')->success('获取成功', [
  23. 'price' => $price, // 单次购买价格(积分)
  24. 'balance' => $balance, // 当前剩余次数
  25. ]);
  26. }
  27. /**
  28. * 创建购买订单
  29. */
  30. public function createOrder(Request $request)
  31. {
  32. $data = $request->post();
  33. $chatNum = (int)($data['chat_num'] ?? 1);
  34. $userId = $request->user['uid'];
  35. if ($chatNum <= 0) {
  36. return app('json')->fail('购买数量必须大于0');
  37. }
  38. $price = ChatBalanceService::getBuyPrice();
  39. if ($price <= 0) {
  40. return app('json')->fail('购买价格未设置');
  41. }
  42. $totalPrice = $price * $chatNum;
  43. // 检查用户积分是否足够
  44. $userScore = (float)(new UserModel)->where('uid', $userId)->value('score');
  45. if ($userScore < $totalPrice) {
  46. return app('json')->fail('积分不足,当前积分:' . $userScore);
  47. }
  48. // 创建订单
  49. $order = ChatOrder::createOrder($userId, $chatNum, $totalPrice);
  50. if (!$order) {
  51. return app('json')->fail('订单创建失败');
  52. }
  53. // 立即支付(积分支付,无需跳转)
  54. $result = ChatBalanceService::buyWithScore($userId, $chatNum, $order);
  55. if (!$result) {
  56. // 支付失败,取消订单
  57. ChatOrder::cancelOrder((int)$order->id);
  58. return app('json')->fail('支付失败');
  59. }
  60. // 更新订单状态
  61. ChatOrder::paySuccess((int)$order->id);
  62. $newBalance = ChatBalanceService::getBalance($userId);
  63. return app('json')->success('购买成功', [
  64. 'order_id' => $order->id,
  65. 'order_no' => $order->order_no,
  66. 'chat_num' => $chatNum,
  67. 'price' => $totalPrice,
  68. 'balance' => $newBalance,
  69. ]);
  70. }
  71. /**
  72. * 获取当前聊天次数余额
  73. */
  74. public function balance(Request $request)
  75. {
  76. $balance = ChatBalanceService::getBalance($request->user['uid']);
  77. return app('json')->success('获取成功', [
  78. 'balance' => $balance,
  79. ]);
  80. }
  81. /**
  82. * 获取购买记录列表
  83. */
  84. public function orderList(Request $request)
  85. {
  86. $data = $request->get();
  87. $page = (int)($data['page'] ?? 1);
  88. $limit = (int)($data['limit'] ?? 10);
  89. $result = ChatOrder::getUserOrders($request->user['uid'], $page, $limit);
  90. // 处理订单状态文本
  91. foreach ($result['list'] as &$item) {
  92. $item['status_text'] = ChatOrder::getStatusText($item['status']);
  93. }
  94. return app('json')->success('获取成功', $result);
  95. }
  96. /**
  97. * 获取变动明细列表
  98. */
  99. public function balanceLogList(Request $request)
  100. {
  101. $data = $request->get();
  102. $page = (int)($data['page'] ?? 1);
  103. $limit = (int)($data['limit'] ?? 10);
  104. $result = ChatBalanceLog::getUserLogs($request->user['uid'], $page, $limit);
  105. return app('json')->success('获取成功', $result);
  106. }
  107. }