diff --git a/app/Console/Tasks/CleanLogTask.php b/app/Console/Tasks/CleanLogTask.php index 453b41e2..7cc0287a 100644 --- a/app/Console/Tasks/CleanLogTask.php +++ b/app/Console/Tasks/CleanLogTask.php @@ -21,6 +21,7 @@ class CleanLogTask extends Task $this->cleanStorageLog(); $this->cleanAlipayLog(); $this->cleanWxpayLog(); + $this->cleanOrderLog(); $this->cleanRefundLog(); } @@ -120,6 +121,14 @@ class CleanLogTask extends Task $this->cleanLog('wxpay', 30); } + /** + * 清理订单日志 + */ + protected function cleanOrderLog() + { + $this->cleanLog('order', 30); + } + /** * 清理退款日志 */ diff --git a/app/Console/Tasks/OrderTask.php b/app/Console/Tasks/OrderTask.php index 9f938b5b..29afa0ff 100644 --- a/app/Console/Tasks/OrderTask.php +++ b/app/Console/Tasks/OrderTask.php @@ -13,7 +13,6 @@ use App\Repos\CourseUser as CourseUserRepo; use App\Repos\Order as OrderRepo; use App\Repos\User as UserRepo; use App\Services\Smser\Order as OrderSmser; -use Phalcon\Cli\Task; use Phalcon\Mvc\Model; use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\ResultsetInterface; @@ -25,6 +24,8 @@ class OrderTask extends Task public function mainAction() { + $logger = $this->getLogger('order'); + $tasks = $this->findTasks(); if ($tasks->count() == 0) { @@ -77,6 +78,13 @@ class OrderTask extends Task } $task->update(); + + $logger->info('Order Task Exception ' . kg_json_encode([ + 'line' => $e->getLine(), + 'code' => $e->getCode(), + 'message' => $e->getMessage(), + 'task' => $task->toArray(), + ])); } /** @@ -98,7 +106,7 @@ class OrderTask extends Task $data = [ 'user_id' => $order->user_id, 'course_id' => $order->item_id, - 'expiry_time' => $itemInfo['course']['expiry_time'], + 'expiry_time' => $itemInfo['course']['study_expiry_time'], 'role_type' => CourseUserModel::ROLE_STUDENT, 'source_type' => CourseUserModel::SOURCE_CHARGE, ]; @@ -124,7 +132,7 @@ class OrderTask extends Task $data = [ 'user_id' => $order->user_id, 'course_id' => $course['id'], - 'expiry_time' => $course['expiry_time'], + 'expiry_time' => $course['study_expiry_time'], 'role_type' => CourseUserModel::ROLE_STUDENT, 'source_type' => CourseUserModel::SOURCE_CHARGE, ]; @@ -179,7 +187,7 @@ class OrderTask extends Task $refund->subject = $order->subject; $refund->amount = $order->amount; - $refund->apply_note = '开通失败,自动退款'; + $refund->apply_note = '开通服务失败,自动退款'; $refund->review_note = '自动操作'; $refund->user_id = $order->user_id; $refund->order_id = $order->id; @@ -214,7 +222,7 @@ class OrderTask extends Task /** * @param int $courseId * @param int $userId - * @return ResultsetInterface|Resultset|TaskModel[] + * @return ResultsetInterface|Resultset|CourseUserModel[] */ protected function findPlanChapterUsers($courseId, $userId) { @@ -228,7 +236,7 @@ class OrderTask extends Task /** * @param int $courseId * @param int $userId - * @return ResultsetInterface|Resultset|TaskModel[] + * @return ResultsetInterface|Resultset|CourseUserModel[] */ protected function findPlanLearnings($courseId, $userId) { @@ -267,7 +275,7 @@ class OrderTask extends Task return TaskModel::query() ->where('item_type = :item_type:', ['item_type' => $itemType]) ->andWhere('status = :status:', ['status' => $status]) - ->andWhere('try_count < :try_count:', ['try_count' => $tryCount]) + ->andWhere('try_count < :try_count:', ['try_count' => $tryCount + 1]) ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Console/Tasks/RefundTask.php b/app/Console/Tasks/RefundTask.php index 04cd5cfb..138f118b 100644 --- a/app/Console/Tasks/RefundTask.php +++ b/app/Console/Tasks/RefundTask.php @@ -97,13 +97,15 @@ class RefundTask extends Task $task->try_count += 1; $task->priority += 1; - if ($task->try_count >= self::TRY_COUNT) { + if ($task->try_count > self::TRY_COUNT) { $task->status = TaskModel::STATUS_FAILED; } $task->update(); $logger->info('Refund Task Exception ' . kg_json_encode([ + 'line' => $e->getLine(), + 'code' => $e->getCode(), 'message' => $e->getMessage(), 'task' => $task->toArray(), ])); @@ -186,7 +188,7 @@ class RefundTask extends Task $courseUser->deleted = 1; if ($courseUser->update() === false) { - throw new \RuntimeException('Delete CourseQuery User Failed'); + throw new \RuntimeException('Delete Course User Failed'); } } } @@ -214,7 +216,7 @@ class RefundTask extends Task $courseUser->deleted = 1; if ($courseUser->update() === false) { - throw new \RuntimeException('Delete CourseQuery User Failed'); + throw new \RuntimeException('Delete Course User Failed'); } } } @@ -293,7 +295,7 @@ class RefundTask extends Task return TaskModel::query() ->where('item_type = :item_type:', ['item_type' => $itemType]) ->andWhere('status = :status:', ['status' => $status]) - ->andWhere('try_count < :try_count:', ['try_count' => $tryCount]) + ->andWhere('try_count < :try_count:', ['try_count' => $tryCount + 1]) ->orderBy('priority ASC') ->limit($limit) ->execute(); diff --git a/app/Http/Admin/Controllers/TestController.php b/app/Http/Admin/Controllers/TestController.php index 19bc59e2..ce0118fa 100644 --- a/app/Http/Admin/Controllers/TestController.php +++ b/app/Http/Admin/Controllers/TestController.php @@ -77,11 +77,11 @@ class TestController extends Controller ['text' => urlencode($pushUrl)] ); - $obs = new \stdClass(); + $obs = []; - $position = strrpos($pushUrl, '/'); - $obs->fms_url = substr($pushUrl, 0, $position + 1); - $obs->stream_code = substr($pushUrl, $position + 1); + $pos = strrpos($pushUrl, '/'); + $obs['fms_url'] = substr($pushUrl, 0, $pos + 1); + $obs['stream_code'] = substr($pushUrl, $pos + 1); $this->view->pick('setting/live_push_test'); $this->view->setVar('code_url', $codeUrl); @@ -176,29 +176,29 @@ class TestController extends Controller $order = $alipayTestService->createOrder(); $trade = $alipayTestService->createTrade($order); - $codeUrl = $alipayTestService->scan($trade); + $qrcodeUrl = $alipayTestService->scan($trade); - if ($order && $trade && $codeUrl) { + if ($order && $trade && $qrcodeUrl) { $this->db->commit(); } else { $this->db->rollback(); } $this->view->pick('setting/pay_alipay_test'); - $this->view->setVar('trade_sn', $trade->sn); - $this->view->setVar('code_url', $codeUrl); + $this->view->setVar('sn', $trade->sn); + $this->view->setVar('qrcode_url', $qrcodeUrl); } /** - * @Post("/alipay/status", name="admin.test.alipay_status") + * @Get("/alipay/status", name="admin.test.alipay_status") */ public function alipayStatusAction() { - $tradeSn = $this->request->getPost('trade_sn'); + $sn = $this->request->getQuery('sn'); $alipayTestService = new AlipayTestService(); - $status = $alipayTestService->status($tradeSn); + $status = $alipayTestService->status($sn); return $this->jsonSuccess(['status' => $status]); } @@ -208,11 +208,11 @@ class TestController extends Controller */ public function alipayCancelAction() { - $tradeSn = $this->request->getPost('trade_sn'); + $sn = $this->request->getPost('sn'); $alipayTestService = new AlipayTestService(); - $alipayTestService->cancel($tradeSn); + $alipayTestService->cancel($sn); return $this->jsonSuccess(['msg' => '取消订单成功']); } @@ -228,29 +228,29 @@ class TestController extends Controller $order = $wxpayTestService->createOrder(); $trade = $wxpayTestService->createTrade($order); - $codeUrl = $wxpayTestService->scan($trade); + $qrcodeUrl = $wxpayTestService->scan($trade); - if ($order && $trade && $codeUrl) { + if ($order && $trade && $qrcodeUrl) { $this->db->commit(); } else { $this->db->rollback(); } $this->view->pick('setting/pay_wxpay_test'); - $this->view->setVar('trade_sn', $trade->sn); - $this->view->setVar('code_url', $codeUrl); + $this->view->setVar('sn', $trade->sn); + $this->view->setVar('qrcode_url', $qrcodeUrl); } /** - * @Post("/wxpay/status", name="admin.test.wxpay_status") + * @Get("/wxpay/status", name="admin.test.wxpay_status") */ public function wxpayStatusAction() { - $tradeSn = $this->request->getPost('trade_sn'); + $sn = $this->request->getQuery('sn'); $wxpayTestService = new WxpayTestService(); - $status = $wxpayTestService->status($tradeSn); + $status = $wxpayTestService->status($sn); return $this->jsonSuccess(['status' => $status]); } @@ -260,11 +260,11 @@ class TestController extends Controller */ public function wxpayCancelAction() { - $tradeSn = $this->request->getPost('trade_sn'); + $sn = $this->request->getPost('sn'); $wxpayTestService = new WxpayTestService(); - $wxpayTestService->cancel($tradeSn); + $wxpayTestService->cancel($sn); return $this->jsonSuccess(['msg' => '取消订单成功']); } diff --git a/app/Http/Admin/Controllers/UserController.php b/app/Http/Admin/Controllers/UserController.php index 84a6ccdc..520f539b 100644 --- a/app/Http/Admin/Controllers/UserController.php +++ b/app/Http/Admin/Controllers/UserController.php @@ -104,12 +104,7 @@ class UserController extends Controller $userService->updateAccount($id); } - $location = $this->url->get(['for' => 'admin.user.list']); - - $content = [ - 'location' => $location, - 'msg' => '更新用户成功', - ]; + $content = ['msg' => '更新用户成功']; return $this->jsonSuccess($content); } diff --git a/app/Http/Admin/Views/setting/pay_alipay.volt b/app/Http/Admin/Views/setting/pay_alipay.volt index 701bb604..644d240d 100644 --- a/app/Http/Admin/Views/setting/pay_alipay.volt +++ b/app/Http/Admin/Views/setting/pay_alipay.volt @@ -90,7 +90,7 @@ type: 2, title: '支付宝 - 支付测试', resize: false, - area: ['480px', '300px'], + area: ['640px', '300px'], content: [url, 'no'] }); }); diff --git a/app/Http/Admin/Views/setting/pay_alipay_test.volt b/app/Http/Admin/Views/setting/pay_alipay_test.volt index a7ba81e3..4e5f5c64 100644 --- a/app/Http/Admin/Views/setting/pay_alipay_test.volt +++ b/app/Http/Admin/Views/setting/pay_alipay_test.volt @@ -1,12 +1,12 @@
- {% if code_url %} + {% if qrcode_url %}
- 二维码图片 + 二维码图片
- +
支付成功 @@ -26,19 +26,19 @@
-{% if code_url %} +{% if qrcode_url %} + {% endblock %} \ No newline at end of file diff --git a/app/Models/ChapterUser.php b/app/Models/ChapterUser.php index 5f832558..d3d027d1 100644 --- a/app/Models/ChapterUser.php +++ b/app/Models/ChapterUser.php @@ -14,6 +14,13 @@ class ChapterUser extends Model */ public $id; + /** + * 计划编号(course_user主键) + * + * @var int + */ + public $plan_id; + /** * 课程编号 * diff --git a/app/Models/Learning.php b/app/Models/Learning.php index 01b955e0..98029f41 100644 --- a/app/Models/Learning.php +++ b/app/Models/Learning.php @@ -27,6 +27,13 @@ class Learning extends Model */ public $request_id; + /** + * 计划编号(course_user主键) + * + * @var int + */ + public $plan_id; + /** * 课程编号 * diff --git a/app/Services/Frontend/My/OrderList.php b/app/Services/Frontend/My/OrderList.php index 090ab922..b0bc30d3 100644 --- a/app/Services/Frontend/My/OrderList.php +++ b/app/Services/Frontend/My/OrderList.php @@ -59,7 +59,6 @@ class OrderList extends FrontendService 'item_id' => $order['item_id'], 'item_type' => $order['item_type'], 'item_info' => $order['item_info'], - 'source_type' => $order['source_type'], 'create_time' => $order['create_time'], ]; } diff --git a/app/Services/Frontend/Order/OrderCreate.php b/app/Services/Frontend/Order/OrderCreate.php index f7a5ddd7..e4f20f2c 100644 --- a/app/Services/Frontend/Order/OrderCreate.php +++ b/app/Services/Frontend/Order/OrderCreate.php @@ -38,13 +38,7 @@ class OrderCreate extends FrontendService /** * 存在新鲜的未支付订单直接返回(减少订单记录) */ - if ($order) { - $caseA = $order->status == OrderModel::STATUS_PENDING; - $caseB = time() - $order->create_time < 12 * 3600; - if ($caseA && $caseB) { - return $order; - } - } + if ($order) return $order; if ($post['item_type'] == OrderModel::ITEM_COURSE) { @@ -83,7 +77,7 @@ class OrderCreate extends FrontendService return $order; } - public function createCourseOrder(CourseModel $course, UserModel $user) + protected function createCourseOrder(CourseModel $course, UserModel $user) { $itemInfo = []; @@ -105,7 +99,7 @@ class OrderCreate extends FrontendService return $order; } - public function createPackageOrder(PackageModel $package, UserModel $user) + protected function createPackageOrder(PackageModel $package, UserModel $user) { $packageRepo = new PackageRepo(); @@ -140,7 +134,7 @@ class OrderCreate extends FrontendService return $order; } - public function createVipOrder(VipModel $vip, UserModel $user) + protected function createVipOrder(VipModel $vip, UserModel $user) { $baseTime = $user->vip_expiry_time > time() ? $user->vip_expiry_time : time(); $expiryTime = strtotime("+{$vip->expiry} months", $baseTime); @@ -169,7 +163,7 @@ class OrderCreate extends FrontendService return $order; } - public function createRewardOrder(CourseModel $course, RewardModel $reward, UserModel $user) + protected function createRewardOrder(CourseModel $course, RewardModel $reward, UserModel $user) { $itemInfo = [ 'course' => $this->handleCourseInfo($course), diff --git a/app/Validators/Order.php b/app/Validators/Order.php index 5057f023..bf7498dd 100644 --- a/app/Validators/Order.php +++ b/app/Validators/Order.php @@ -145,7 +145,7 @@ class Order extends Validator { $orderRepo = new OrderRepo(); - $itemType = OrderModel::ITEM_PACKAGE; + $itemType = OrderModel::ITEM_COURSE; $order = $orderRepo->findUserLastFinishedOrder($userId, $courseId, $itemType); @@ -156,7 +156,7 @@ class Order extends Validator */ $itemInfo = $order->item_info; - if ($itemInfo['course']['expiry_time'] > time()) { + if ($itemInfo['course']['study_expiry_time'] > time()) { throw new BadRequestException('order.has_bought_course'); } } diff --git a/app/Validators/Trade.php b/app/Validators/Trade.php index 1203a030..57707d5e 100644 --- a/app/Validators/Trade.php +++ b/app/Validators/Trade.php @@ -48,6 +48,8 @@ class Trade extends Validator if (!isset($list[$channel])) { throw new BadRequestException('trade.invalid_channel'); } + + return $channel; } public function checkIfAllowClose(TradeModel $trade) diff --git a/public/static/admin/css/common.css b/public/static/admin/css/common.css index 634d5759..83227403 100644 --- a/public/static/admin/css/common.css +++ b/public/static/admin/css/common.css @@ -158,6 +158,7 @@ img.kg-cover { img.kg-qrcode { width: 140px; height: 140px; + border: 3px dashed #ccc; } .kg-order-date { diff --git a/public/static/web/css/common.css b/public/static/web/css/common.css index 3c63738c..8a8b1235 100644 --- a/public/static/web/css/common.css +++ b/public/static/web/css/common.css @@ -692,7 +692,6 @@ body { } .cart-stats .pay-amount { - color: red; font-size: 18px; font-weight: 700; } @@ -726,7 +725,7 @@ body { .payment .channel { margin-top: 50px; - margin-bottom: 40px; + margin-bottom: 80px; text-align: center; } @@ -750,7 +749,6 @@ body { background-position: center center; } - .payment .footer { text-align: center; } @@ -760,6 +758,25 @@ body { font-size: 12px; } +#pay-layer { + padding-top: 50px; +} + +#pay-layer .qrcode { + text-align: center; +} + +#pay-layer .qrcode img { + width: 160px; + height: 160px; + border: 3px dashed #ccc; +} + +#pay-layer .success-tips { + color: green; + text-align: center; +} + .verify-tips-btn { color: green; }