ChatBuy.php 3.7 KB

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