diff --git a/app/Console/Tasks/CleanLogTask.php b/app/Console/Tasks/CleanLogTask.php index 9f0f5926..453b41e2 100644 --- a/app/Console/Tasks/CleanLogTask.php +++ b/app/Console/Tasks/CleanLogTask.php @@ -20,7 +20,7 @@ class CleanLogTask extends Task $this->cleanVodLog(); $this->cleanStorageLog(); $this->cleanAlipayLog(); - $this->cleanWechatLog(); + $this->cleanWxpayLog(); $this->cleanRefundLog(); } @@ -115,9 +115,9 @@ class CleanLogTask extends Task /** * 清理微信支付服务日志 */ - protected function cleanWechatLog() + protected function cleanWxpayLog() { - $this->cleanLog('wechat', 30); + $this->cleanLog('wxpay', 30); } /** diff --git a/app/Console/Tasks/CloseTradeTask.php b/app/Console/Tasks/CloseTradeTask.php index 3855f420..38f34192 100644 --- a/app/Console/Tasks/CloseTradeTask.php +++ b/app/Console/Tasks/CloseTradeTask.php @@ -3,8 +3,8 @@ namespace App\Console\Tasks; use App\Models\Trade as TradeModel; -use App\Services\Alipay as AlipayService; -use App\Services\Wechat as WechatService; +use App\Services\Payment\Alipay as AlipayService; +use App\Services\Payment\Wxpay as WxpayService; use Phalcon\Cli\Task; use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\ResultsetInterface; @@ -23,8 +23,8 @@ class CloseTradeTask extends Task foreach ($trades as $trade) { if ($trade->channel == TradeModel::CHANNEL_ALIPAY) { $this->closeAlipayTrade($trade); - } elseif ($trade->channel == TradeModel::CHANNEL_WECHAT) { - $this->closeWechatTrade($trade); + } elseif ($trade->channel == TradeModel::CHANNEL_WXPAY) { + $this->closeWxpayTrade($trade); } } } @@ -36,19 +36,14 @@ class CloseTradeTask extends Task */ protected function closeAlipayTrade($trade) { - $service = new AlipayService(); + $alipay = new AlipayService(); - $alyOrder = $service->findOrder($trade->sn); + $success = $alipay->close($trade->sn); - if ($alyOrder) { - if ($alyOrder->trade_status == 'WAIT_BUYER_PAY') { - $service->closeOrder($trade->sn); - } + if ($success) { + $trade->status = TradeModel::STATUS_CLOSED; + $trade->update(); } - - $trade->status = TradeModel::STATUS_CLOSED; - - $trade->update(); } /** @@ -56,28 +51,23 @@ class CloseTradeTask extends Task * * @param TradeModel $trade */ - protected function closeWechatTrade($trade) + protected function closeWxpayTrade($trade) { - $service = new WechatService(); + $wxpay = new WxpayService(); - $wxOrder = $service->findOrder($trade->sn); + $success = $wxpay->close($trade->sn); - if ($wxOrder) { - if ($wxOrder->trade_state == 'NOTPAY') { - $service->closeOrder($trade->sn); - } + if ($success) { + $trade->status = TradeModel::STATUS_CLOSED; + $trade->update(); } - - $trade->status = TradeModel::STATUS_CLOSED; - - $trade->update(); } /** * 查找待关闭交易 * * @param int $limit - * @return Resultset|ResultsetInterface + * @return ResultsetInterface|Resultset|TradeModel[] */ protected function findTrades($limit = 5) { diff --git a/app/Console/Tasks/LearningTask.php b/app/Console/Tasks/LearningTask.php index 150635d3..15b99460 100644 --- a/app/Console/Tasks/LearningTask.php +++ b/app/Console/Tasks/LearningTask.php @@ -41,11 +41,13 @@ class LearningTask extends Task if (!$requestIds) return; foreach ($requestIds as $requestId) { - $itemKey = $syncer->getItemKey($requestId); - $this->handleLearning($itemKey); - } - $this->redis->sRem($syncKey, ...$requestIds); + $itemKey = $syncer->getItemKey($requestId); + + $this->handleLearning($itemKey); + + $this->redis->sRem($syncKey, $requestId); + } } /** diff --git a/app/Console/Tasks/LiveNoticeConsumerTask.php b/app/Console/Tasks/LiveNoticeConsumerTask.php new file mode 100644 index 00000000..fe2fa948 --- /dev/null +++ b/app/Console/Tasks/LiveNoticeConsumerTask.php @@ -0,0 +1,70 @@ + 23) { + return; + } + + $this->cache = $this->getDI()->get('cache'); + + $this->redis = $this->cache->getRedis(); + + $providerTask = new LiveNoticeProviderTask(); + + $cacheKey = $providerTask->getCacheKey(); + + $members = $this->redis->sMembers($cacheKey); + + if (!$members) return; + + $smser = new LiveSmser(); + + $now = time(); + + foreach ($members as $member) { + + list($chapterId, $userId, $startTime) = explode(':', $member); + + $remove = false; + + if ($now - $startTime < 3600) { + $smser->handle($chapterId, $userId, $startTime); + $remove = true; + } + + if ($now > $startTime) { + $remove = true; + } + + if ($remove) { + $this->redis->sRem($cacheKey, $member); + } + } + } + +} diff --git a/app/Console/Tasks/LiveNoticeProviderTask.php b/app/Console/Tasks/LiveNoticeProviderTask.php new file mode 100644 index 00000000..022b266f --- /dev/null +++ b/app/Console/Tasks/LiveNoticeProviderTask.php @@ -0,0 +1,96 @@ +cache = $this->getDI()->get('cache'); + + $this->redis = $this->cache->getRedis(); + + $tasks = $this->findTasks(); + + if ($tasks->count() == 0) { + return; + } + + $values = []; + + foreach ($tasks as $task) { + $items = [$task->chapter_id, $task->user_id, $task->start_time]; + $values[] = implode(':', $items); + } + + $key = $this->getCacheKey(); + + $lifetime = $this->getLifetime(); + + $this->redis->sAdd($key, ...$values); + + $this->redis->expire($key, $lifetime); + } + + /** + * @return ResultsetInterface|Resultset + */ + protected function findTasks() + { + $beginTime = strtotime('today'); + + $endTime = strtotime('tomorrow'); + + /** + * 过滤付费和导入用户,减少发送量 + */ + $sourceTypes = [ + CourseUserModel::SOURCE_CHARGE, + CourseUserModel::SOURCE_IMPORT, + ]; + + $rows = $this->modelsManager->createBuilder() + ->columns(['cu.course_id', 'cu.user_id', 'cl.chapter_id', 'cl.start_time']) + ->addFrom(ChapterLiveModel::class, 'cl') + ->join(CourseUserModel::class, 'cl.course_id = cu.course_id', 'cu') + ->inWhere('cu.source_type', $sourceTypes) + ->betweenWhere('start_time', $beginTime, $endTime) + ->getQuery()->execute(); + + return $rows; + } + + public function getLifetime() + { + $tomorrow = strtotime('tomorrow'); + + $lifetime = $tomorrow - time(); + + return $lifetime; + } + + public function getCacheKey() + { + return 'live_notice'; + } + +} diff --git a/app/Console/Tasks/ProcessOrderTask.php b/app/Console/Tasks/OrderTask.php similarity index 70% rename from app/Console/Tasks/ProcessOrderTask.php rename to app/Console/Tasks/OrderTask.php index 27536c4b..3f640456 100644 --- a/app/Console/Tasks/ProcessOrderTask.php +++ b/app/Console/Tasks/OrderTask.php @@ -4,16 +4,20 @@ namespace App\Console\Tasks; use App\Models\CourseUser as CourseUserModel; use App\Models\Order as OrderModel; +use App\Models\Refund as RefundModel; use App\Models\Task as TaskModel; +use App\Models\Trade as TradeModel; use App\Repos\Course as CourseRepo; 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; -class ProcessOrderTask extends Task +class OrderTask extends Task { const TRY_COUNT = 3; @@ -30,15 +34,17 @@ class ProcessOrderTask extends Task foreach ($tasks as $task) { + /** + * @var array $itemInfo + */ + $itemInfo = $task->item_info; + + $order = $orderRepo->findById($itemInfo['order']['id']); + + if (!$order) continue; + try { - /** - * @var array $itemInfo - */ - $itemInfo = $task->item_info; - - $order = $orderRepo->findById($itemInfo['order']['id']); - switch ($order->item_type) { case OrderModel::ITEM_COURSE: $this->handleCourseOrder($order); @@ -51,6 +57,12 @@ class ProcessOrderTask extends Task break; } + $task->status = TaskModel::STATUS_FINISHED; + + $task->update(); + + $this->handleOrderNotice($order); + } catch (\Exception $e) { $task->try_count += 1; @@ -62,6 +74,13 @@ class ProcessOrderTask extends Task $task->update(); } + + /** + * 任务失败,申请退款 + */ + if ($task->status == TaskModel::STATUS_FAILED) { + $this->handleOrderRefund($order); + } } } @@ -143,6 +162,38 @@ class ProcessOrderTask extends Task } } + /** + * @param OrderModel $order + */ + protected function handleOrderNotice(OrderModel $order) + { + $smser = new OrderSmser(); + + $smser->handle($order); + } + + /** + * @param OrderModel $order + */ + protected function handleOrderRefund(OrderModel $order) + { + $trade = $this->findFinishedTrade($order->id); + + if (!$trade) return; + + $refund = new RefundModel(); + + $refund->subject = $order->subject; + $refund->amount = $order->amount; + $refund->apply_note = '开通失败,自动退款'; + $refund->review_note = '自动操作'; + $refund->user_id = $order->user_id; + $refund->order_id = $order->id; + $refund->trade_id = $trade->id; + + $refund->create(); + } + /** * @param int $courseId * @param int $userId @@ -166,13 +217,30 @@ class ProcessOrderTask extends Task } } + /** + * @param $orderId + * @return Model|TradeModel + */ + protected function findFinishedTrade($orderId) + { + $status = TradeModel::STATUS_FINISHED; + + $result = TradeModel::findFirst([ + 'conditions' => ['order_id = :order_id: AND status = :status:'], + 'bind' => ['order_id' => $orderId, 'status' => $status], + 'order' => 'id DESC', + ]); + + return $result; + } + /** * @param int $limit * @return ResultsetInterface|Resultset|TaskModel[] */ protected function findTasks($limit = 100) { - $itemType = TaskModel::TYPE_PROCESS_ORDER; + $itemType = TaskModel::TYPE_ORDER; $status = TaskModel::STATUS_PENDING; $tryCount = self::TRY_COUNT; diff --git a/app/Console/Tasks/RefundTask.php b/app/Console/Tasks/RefundTask.php index d0df4c6a..64453494 100644 --- a/app/Console/Tasks/RefundTask.php +++ b/app/Console/Tasks/RefundTask.php @@ -11,8 +11,9 @@ use App\Repos\Order as OrderRepo; use App\Repos\Refund as RefundRepo; use App\Repos\Trade as TradeRepo; use App\Repos\User as UserRepo; -use App\Services\Alipay as AlipayService; -use App\Services\Wechat as WechatService; +use App\Services\Payment\Alipay as AlipayService; +use App\Services\Payment\Wxpay as WxpayService; +use App\Services\Smser\Refund as RefundSmser; use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\ResultsetInterface; @@ -49,6 +50,10 @@ class RefundTask extends Task $trade = $tradeRepo->findById($itemInfo['refund']['trade_id']); $order = $orderRepo->findById($itemInfo['refund']['order_id']); + if (!$refund || !$trade || !$order) { + continue; + } + try { $this->db->begin(); @@ -83,6 +88,8 @@ class RefundTask extends Task $this->db->commit(); + $this->handleRefundNotice($refund); + } catch (\Exception $e) { $this->db->rollback(); @@ -92,8 +99,6 @@ class RefundTask extends Task if ($task->try_count > self::TRY_COUNT) { $task->status = TaskModel::STATUS_FAILED; - $refund->status = RefundModel::STATUS_FAILED; - $refund->update(); } $task->update(); @@ -103,6 +108,11 @@ class RefundTask extends Task 'task' => $task->toArray(), ])); } + + if ($task->status == TaskModel::STATUS_FAILED) { + $refund->status = RefundModel::STATUS_FAILED; + $refund->update(); + } } } @@ -120,22 +130,13 @@ class RefundTask extends Task $alipay = new AlipayService(); - $response = $alipay->refundOrder([ - 'out_trade_no' => $trade->sn, - 'out_request_no' => $refund->sn, - 'refund_amount' => $refund->amount, - ]); + $response = $alipay->refund($refund); - } elseif ($trade->channel == TradeModel::CHANNEL_WECHAT) { + } elseif ($trade->channel == TradeModel::CHANNEL_WXPAY) { - $wechat = new WechatService(); + $wxpay = new WxpayService(); - $response = $wechat->refundOrder([ - 'out_trade_no' => $trade->sn, - 'out_refund_no' => $refund->sn, - 'total_fee' => 100 * $trade->amount, - 'refund_fee' => 100 * $refund->amount, - ]); + $response = $wxpay->refund($refund); } if (!$response) { @@ -252,6 +253,16 @@ class RefundTask extends Task } + /** + * @param RefundModel $refund + */ + protected function handleRefundNotice(RefundModel $refund) + { + $smser = new RefundSmser(); + + $smser->handle($refund); + } + /** * @param int $limit * @return ResultsetInterface|Resultset|TaskModel[] diff --git a/app/Console/Tasks/RevokeVipTask.php b/app/Console/Tasks/RevokeVipTask.php index ca743909..ce30a64a 100644 --- a/app/Console/Tasks/RevokeVipTask.php +++ b/app/Console/Tasks/RevokeVipTask.php @@ -28,7 +28,7 @@ class RevokeVipTask extends Task * 查找待解锁用户 * * @param int $limit - * @return UserModel[]|Resultset|ResultsetInterface + * @return ResultsetInterface|Resultset|UserModel[] */ protected function findUsers($limit = 1000) { diff --git a/app/Console/Tasks/VodEventTask.php b/app/Console/Tasks/VodEventTask.php index 020b3fd1..150c1c4e 100644 --- a/app/Console/Tasks/VodEventTask.php +++ b/app/Console/Tasks/VodEventTask.php @@ -22,13 +22,17 @@ class VodEventTask extends Task $count = 0; foreach ($events as $event) { + $handles[] = $event['EventHandle']; + if ($event['EventType'] == 'NewFileUpload') { $this->handleNewFileUploadEvent($event); } elseif ($event['EventType'] == 'ProcedureStateChanged') { $this->handleProcedureStateChangedEvent($event); } + $count++; + if ($count >= 12) { break; } @@ -61,8 +65,10 @@ class VodEventTask extends Task * @var array $attrs */ $attrs = $chapter->attrs; + $attrs['file_status'] = ChapterModel::FS_TRANSLATING; $attrs['duration'] = (int)$duration; + $chapter->update(['attrs' => $attrs]); $this->updateVodAttrs($chapter->course_id); @@ -71,6 +77,7 @@ class VodEventTask extends Task protected function handleProcedureStateChangedEvent($event) { $fileId = $event['ProcedureStateChangeEvent']['FileId']; + $processResult = $event['ProcedureStateChangeEvent']['MediaProcessResultSet']; $chapterRepo = new ChapterRepo(); @@ -110,7 +117,9 @@ class VodEventTask extends Task * @var array $attrs */ $attrs = $chapter->attrs; + $attrs['file_status'] = $fileStatus; + $chapter->update(['attrs' => $attrs]); } diff --git a/app/Http/Admin/Controllers/ConfigController.php b/app/Http/Admin/Controllers/ConfigController.php index b08ad249..9682a3b1 100644 --- a/app/Http/Admin/Controllers/ConfigController.php +++ b/app/Http/Admin/Controllers/ConfigController.php @@ -148,6 +148,7 @@ class ConfigController extends Controller if ($this->request->isPost()) { $section = $this->request->getPost('section'); + $data = $this->request->getPost(); $configService->updateSectionConfig($section, $data); @@ -157,10 +158,10 @@ class ConfigController extends Controller } else { $alipay = $configService->getSectionConfig('payment.alipay'); - $wechat = $configService->getSectionConfig('payment.wechat'); + $wxpay = $configService->getSectionConfig('payment.wxpay'); $this->view->setVar('alipay', $alipay); - $this->view->setVar('wechat', $wechat); + $this->view->setVar('wxpay', $wxpay); } } diff --git a/app/Http/Admin/Controllers/TestController.php b/app/Http/Admin/Controllers/TestController.php index 75699b37..59411b6e 100644 --- a/app/Http/Admin/Controllers/TestController.php +++ b/app/Http/Admin/Controllers/TestController.php @@ -4,10 +4,11 @@ namespace App\Http\Admin\Controllers; use App\Http\Admin\Services\AlipayTest as AlipayTestService; use App\Http\Admin\Services\Config as ConfigService; +use App\Http\Admin\Services\WxpayTest as WxpayTestService; use App\Services\Captcha as CaptchaService; use App\Services\Live as LiveService; -use App\Services\Mailer as MailerService; -use App\Services\Smser as SmserService; +use App\Services\Mailer\Test as TestMailerService; +use App\Services\Smser\Test as TestSmserService; use App\Services\Storage as StorageService; use App\Services\Vod as VodService; use Phalcon\Mvc\View; @@ -21,7 +22,7 @@ class TestController extends Controller /** * @Post("/storage", name="admin.test.storage") */ - public function storageTestAction() + public function storageAction() { $storageService = new StorageService(); @@ -37,7 +38,7 @@ class TestController extends Controller /** * @Post("/vod", name="admin.test.vod") */ - public function vodTestAction() + public function vodAction() { $vodService = new VodService(); @@ -53,12 +54,17 @@ class TestController extends Controller /** * @Get("/live/push", name="admin.test.live.push") */ - public function livePushTestAction() + public function livePushAction() { $liveService = new LiveService(); $pushUrl = $liveService->getPushUrl('test'); + $codeUrl = $this->url->get( + ['for' => 'home.qr.img'], + ['text' => urlencode($pushUrl)] + ); + $obs = new \stdClass(); $position = strrpos($pushUrl, '/'); @@ -66,14 +72,15 @@ class TestController extends Controller $obs->stream_code = substr($pushUrl, $position + 1); $this->view->pick('config/live_push_test'); - $this->view->setVar('push_url', $pushUrl); + + $this->view->setVar('code_url', $codeUrl); $this->view->setVar('obs', $obs); } /** * @Get("/live/pull", name="admin.test.live.pull") */ - public function livePullTestAction() + public function livePullAction() { $liveService = new LiveService(); @@ -81,7 +88,9 @@ class TestController extends Controller $flvPullUrls = $liveService->getPullUrls('test', 'flv'); $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); + $this->view->pick('public/live_player'); + $this->view->setVar('m3u8_pull_urls', $m3u8PullUrls); $this->view->setVar('flv_pull_urls', $flvPullUrls); } @@ -89,13 +98,13 @@ class TestController extends Controller /** * @Post("/smser", name="admin.test.smser") */ - public function smserTestAction() + public function smserAction() { $phone = $this->request->getPost('phone'); - $smserService = new SmserService(); + $smserService = new TestSmserService(); - $response = $smserService->sendTestMessage($phone); + $response = $smserService->handle($phone); if ($response) { return $this->ajaxSuccess(['msg' => '发送短信成功,请到收件箱确认']); @@ -107,13 +116,13 @@ class TestController extends Controller /** * @Post("/mailer", name="admin.test.mailer") */ - public function mailerTestAction() + public function mailerAction() { $email = $this->request->getPost('email'); - $mailerService = new MailerService(); + $mailerService = new TestMailerService(); - $result = $mailerService->sendTestMail($email); + $result = $mailerService->handle($email); if ($result) { return $this->ajaxSuccess(['msg' => '发送邮件成功,请到收件箱确认']); @@ -125,7 +134,7 @@ class TestController extends Controller /** * @Post("/captcha", name="admin.test.captcha") */ - public function captchaTestAction() + public function captchaAction() { $post = $this->request->getPost(); @@ -149,37 +158,47 @@ class TestController extends Controller /** * @Get("/alipay", name="admin.test.alipay") */ - public function alipayTestAction() + public function alipayAction() { $alipayTestService = new AlipayTestService(); $this->db->begin(); - $order = $alipayTestService->createTestOrder(); - $trade = $alipayTestService->createTestTrade($order); - $qrcode = $alipayTestService->getTestQrCode($trade); + $order = $alipayTestService->createOrder(); + $trade = $alipayTestService->createTrade($order); + $code = $alipayTestService->scan($trade); - if ($order->id > 0 && $trade->id > 0 && $qrcode) { + if ($order && $trade && $code) { $this->db->commit(); } else { $this->db->rollback(); } + $codeUrl = null; + + if ($code) { + $codeUrl = $this->url->get( + ['for' => 'home.qr.img'], + ['text' => urlencode($code)] + ); + } + $this->view->pick('config/payment_alipay_test'); - $this->view->setVar('trade', $trade); - $this->view->setVar('qrcode', $qrcode); + + $this->view->setVar('trade_sn', $trade->sn); + $this->view->setVar('code_url', $codeUrl); } /** * @Post("/alipay/status", name="admin.test.alipay.status") */ - public function alipayTestStatusAction() + public function alipayStatusAction() { - $sn = $this->request->getPost('sn'); + $tradeSn = $this->request->getPost('trade_sn'); $alipayTestService = new AlipayTestService(); - $status = $alipayTestService->getTestStatus($sn); + $status = $alipayTestService->status($tradeSn); return $this->ajaxSuccess(['status' => $status]); } @@ -187,13 +206,66 @@ class TestController extends Controller /** * @Post("/alipay/cancel", name="admin.test.alipay.cancel") */ - public function alipayTestCancelAction() + public function alipayCancelAction() { - $sn = $this->request->getPost('sn'); + $tradeSn = $this->request->getPost('trade_sn'); $alipayTestService = new AlipayTestService(); - $alipayTestService->cancelTestOrder($sn); + $alipayTestService->cancel($tradeSn); + + return $this->ajaxSuccess(['msg' => '取消订单成功']); + } + + /** + * @Get("/wxpay", name="admin.test.wxpay") + */ + public function wxpayAction() + { + $wxpayTestService = new WxpayTestService(); + + $this->db->begin(); + + $order = $wxpayTestService->createOrder(); + $trade = $wxpayTestService->createTrade($order); + $codeUrl = $wxpayTestService->scan($trade); + + if ($order && $trade && $codeUrl) { + $this->db->commit(); + } else { + $this->db->rollback(); + } + + $this->view->pick('config/payment_wxpay_test'); + + $this->view->setVar('trade_sn', $trade->sn); + $this->view->setVar('code_url', $codeUrl); + } + + /** + * @Post("/wxpay/status", name="admin.test.wxpay.status") + */ + public function wxpayStatusAction() + { + $tradeSn = $this->request->getPost('trade_sn'); + + $wxpayTestService = new WxpayTestService(); + + $status = $wxpayTestService->status($tradeSn); + + return $this->ajaxSuccess(['status' => $status]); + } + + /** + * @Post("/wxpay/cancel", name="admin.test.wxpay.cancel") + */ + public function wxpayCancelAction() + { + $tradeSn = $this->request->getPost('trade_sn'); + + $wxpayTestService = new WxpayTestService(); + + $wxpayTestService->cancel($tradeSn); return $this->ajaxSuccess(['msg' => '取消订单成功']); } diff --git a/app/Http/Admin/Services/AlipayTest.php b/app/Http/Admin/Services/AlipayTest.php index 09c49653..e48c9b18 100644 --- a/app/Http/Admin/Services/AlipayTest.php +++ b/app/Http/Admin/Services/AlipayTest.php @@ -6,44 +6,38 @@ use App\Models\Order as OrderModel; use App\Models\Trade as TradeModel; use App\Repos\Order as OrderRepo; use App\Repos\Trade as TradeRepo; -use App\Services\Alipay as AlipayService; +use App\Services\Payment\Alipay as AlipayService; class AlipayTest extends PaymentTest { - /** - * 获取测试二维码 - * - * @param TradeModel $trade - * @return mixed - */ - public function getTestQrCode($trade) - { - $outOrder = [ - 'out_trade_no' => $trade->sn, - 'total_amount' => $trade->amount, - 'subject' => $trade->subject, - ]; + protected $channel = TradeModel::CHANNEL_ALIPAY; + public function scan(TradeModel $trade) + { $alipayService = new AlipayService(); - $qrcode = $alipayService->getQrCode($outOrder); + $qrcode = $alipayService->scan($trade); $result = $qrcode ?: false; return $result; } - /** - * 取消测试订单 - * - * @param string $sn - */ - public function cancelTestOrder($sn) + public function status($tradeNo) + { + $alipayService = new AlipayService(); + + $result = $alipayService->status($tradeNo); + + return $result; + } + + public function cancel($tradeNo) { $tradeRepo = new TradeRepo(); - $trade = $tradeRepo->findBySn($sn); + $trade = $tradeRepo->findBySn($tradeNo); $orderRepo = new OrderRepo(); @@ -51,11 +45,13 @@ class AlipayTest extends PaymentTest $alipayService = new AlipayService(); - $response = $alipayService->cancelOrder($trade->sn); + $response = $alipayService->cancel($trade->sn); if ($response) { + $trade->status = TradeModel::STATUS_CLOSED; $trade->update(); + if ($order->status != OrderModel::STATUS_PENDING) { $order->status = OrderModel::STATUS_PENDING; $order->update(); diff --git a/app/Http/Admin/Services/PaymentTest.php b/app/Http/Admin/Services/PaymentTest.php index 2f61e7a7..b485f475 100644 --- a/app/Http/Admin/Services/PaymentTest.php +++ b/app/Http/Admin/Services/PaymentTest.php @@ -4,18 +4,25 @@ namespace App\Http\Admin\Services; use App\Models\Order as OrderModel; use App\Models\Trade as TradeModel; -use App\Repos\Trade as TradeRepo; abstract class PaymentTest extends Service { /** - * 创建测试订单 + * @var string 支付平台 + */ + protected $channel; + + /** + * 创建订单 * * @return OrderModel */ - public function createTestOrder() + public function createOrder() { + /** + * @var object $authUser + */ $authUser = $this->getDI()->get('auth')->getAuthInfo(); $order = new OrderModel(); @@ -36,7 +43,7 @@ abstract class PaymentTest extends Service * @param OrderModel $order * @return TradeModel $trade */ - public function createTestTrade($order) + public function createTrade(OrderModel $order) { $trade = new TradeModel(); @@ -44,7 +51,7 @@ abstract class PaymentTest extends Service $trade->order_id = $order->id; $trade->subject = $order->subject; $trade->amount = $order->amount; - $trade->channel = TradeModel::CHANNEL_ALIPAY; + $trade->channel = $this->channel; $trade->create(); @@ -52,33 +59,27 @@ abstract class PaymentTest extends Service } /** - * 获取订单状态 + * 交易状态 * - * @param string $sn + * @param string $tradeNo * @return string */ - public function getTestStatus($sn) - { - $tradeRepo = new TradeRepo(); - - $trade = $tradeRepo->findBySn($sn); - - return $trade->status; - } + abstract public function status($tradeNo); /** - * 获取测试二维码 + * 扫码下单 * * @param TradeModel $trade - * @return mixed + * @return string|bool */ - abstract public function getTestQrCode($trade); + abstract public function scan(TradeModel $trade); /** - * 取消测试订单 + * 取消交易 * - * @param string $sn + * @param string $tradeNo + * @return bool */ - abstract public function cancelTestOrder($sn); + abstract public function cancel($tradeNo); } diff --git a/app/Http/Admin/Services/Refund.php b/app/Http/Admin/Services/Refund.php index d4c8c16c..85dd0b22 100644 --- a/app/Http/Admin/Services/Refund.php +++ b/app/Http/Admin/Services/Refund.php @@ -94,7 +94,7 @@ class Refund extends Service $data = []; - $validator->checkIfAllowReview($refund); + $validator->checkReviewAction($refund); $data['status'] = $validator->checkReviewStatus($post['status']); $data['review_note'] = $validator->checkReviewNote($post['review_note']); diff --git a/app/Http/Admin/Services/Trade.php b/app/Http/Admin/Services/Trade.php index 13d4c50d..78760466 100644 --- a/app/Http/Admin/Services/Trade.php +++ b/app/Http/Admin/Services/Trade.php @@ -95,6 +95,7 @@ class Trade extends Service $validator->checkIfAllowClose($trade); $trade->status = TradeModel::STATUS_CLOSED; + $trade->update(); return $trade; @@ -114,7 +115,7 @@ class Trade extends Service $refund->amount = $trade->amount; $refund->user_id = $trade->user_id; $refund->order_id = $trade->order_id; - $refund->trade_id = $trade->sn; + $refund->trade_id = $trade->id; $refund->apply_note = '后台人工申请退款'; $refund->create(); diff --git a/app/Http/Admin/Services/WechatTest.php b/app/Http/Admin/Services/WechatTest.php deleted file mode 100644 index 65e17820..00000000 --- a/app/Http/Admin/Services/WechatTest.php +++ /dev/null @@ -1,66 +0,0 @@ - $trade->sn, - 'total_fee' => 100 * $trade->amount, - 'body' => $trade->subject, - ]; - - $wechatService = new WechatService(); - - $qrcode = $wechatService->getQrCode($outOrder); - - $result = $qrcode ?: false; - - return $result; - } - - /** - * 取消测试订单 - * - * @param string $sn - */ - public function cancelTestOrder($sn) - { - $tradeRepo = new TradeRepo(); - - $trade = $tradeRepo->findBySn($sn); - - $orderRepo = new OrderRepo(); - - $order = $orderRepo->findById($trade->order_id); - - $wechatService = new WechatService(); - - $response = $wechatService->closeOrder($trade->sn); - - if ($response) { - $trade->status = TradeModel::STATUS_CLOSED; - $trade->update(); - if ($order->status != OrderModel::STATUS_PENDING) { - $order->status = OrderModel::STATUS_PENDING; - $order->update(); - } - } - } - -} diff --git a/app/Http/Admin/Services/WxpayTest.php b/app/Http/Admin/Services/WxpayTest.php new file mode 100644 index 00000000..04628706 --- /dev/null +++ b/app/Http/Admin/Services/WxpayTest.php @@ -0,0 +1,42 @@ +scan($trade); + + $result = $qrcode ?: false; + + return $result; + } + + public function status($tradeNo) + { + $wxpayService = new WxpayService(); + + $result = $wxpayService->status($tradeNo); + + return $result; + } + + public function cancel($tradeNo) + { + $wxpayService = new WxpayService(); + + $response = $wxpayService->close($tradeNo); + + return $response; + } + +} diff --git a/app/Http/Admin/Views/config/live_push_test.volt b/app/Http/Admin/Views/config/live_push_test.volt index e17df224..b2e38e48 100644 --- a/app/Http/Admin/Views/config/live_push_test.volt +++ b/app/Http/Admin/Views/config/live_push_test.volt @@ -3,7 +3,7 @@