You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

218 lines
6.5 KiB

<?php
namespace App\Controller\v3;
use App\Constants\v3\OrderState;
use App\Controller\BaseController;
use App\Exception\BusinessException;
use App\Model\v3\CcbPayment;
use App\Model\v3\Order;
use App\Service\v3\CcbPaymentService;
use App\Service\v3\Interfaces\BadgeServiceInterface;
use App\Service\v3\Interfaces\CouponRebateServiceInterface;
use App\Service\v3\Interfaces\DeviceServiceInterface;
use App\Service\v3\Interfaces\FeiePrintServiceInterface;
use App\Service\v3\Interfaces\MiniprogramServiceInterface;
use App\Service\v3\Interfaces\MqttServiceInterface;
use App\Service\v3\Interfaces\OrderOnlineServiceInterface;
use App\Service\v3\Interfaces\OrderStatisticsServiceInterface;
use App\Service\v3\Interfaces\SeparateAccountsServiceInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Logger\LoggerFactory;
use Hyperf\Utils\ApplicationContext;
class CcbNotifyController extends BaseController
{
/**
* @var \Psr\Log\LoggerInterface
*/
private $logger;
/**
* @Inject
* @var MqttServiceInterface
*/
protected $mqttService;
/**
* @Inject
* @var DeviceServiceInterface
*/
protected $deviceService;
/**
* @Inject
* @var MiniprogramServiceInterface
*/
protected $miniprogramService;
/**
* @Inject
* @var FeiePrintServiceInterface
*/
protected $feiePrintService;
/**
* @Inject
* @var CouponRebateServiceInterface
*/
protected $couponRebateService;
/**
* @Inject
* @var OrderOnlineServiceInterface
*/
protected $orderOnlineService;
/**
* @Inject
* @var SeparateAccountsServiceInterface
*/
protected $separateAccountsService;
/**
* @Inject
* @var BadgeServiceInterface
*/
protected $badgeService;
/**
* @Inject
* @var OrderStatisticsServiceInterface
*/
protected $orderStatisticsService;
public function __construct(LoggerFactory $loggerFactory)
{
parent::__construct();
$this->logger = $loggerFactory->get('ccb.notify');
}
private function saveLog($func, $content)
{
$this->logger->info($func."\n".$content."\n");
}
public function pay()
{
try {
$this->saveLog(__FUNCTION__, $this->request->getBody()->getContents());
$data = $this->request->all();
if (!isset($data['Main_Ordr_No'], $data['Sign_Inf'])) {
throw new BusinessException(500, '缺少参数');
}
$ccb = ApplicationContext::getContainer()->get(CcbPaymentService::class);
if (!$ccb->verifySign($ccb->createSign($data), $data['Sign_Inf'])) {
throw new BusinessException(500, '验签失败');
}
$model = CcbPayment::where('main_ordr_no', $data['Main_Ordr_No'])->first();
if (!$model) {
throw new BusinessException(500, '下单记录不存在');
}
$payResult = $ccb->gatherEnquireOrder($data['Main_Ordr_No']);
if ($payResult['Ordr_Stcd'] != $data['Ordr_Stcd']) {
throw new BusinessException(500, '订单状态不一致');
}
// 状态已同步
if ($model->ordr_stcd == $data['Ordr_Stcd']) {
return $this->response->json([
'Svc_Rsp_St' => '00',
]);
}
$model->ordr_stcd = $data['Ordr_Stcd'];
$model->pay_time = $data['Pay_Time'];
$model->pay_type = $data['TYPE'];
$model->pay_channel = $data['PAY_CHANNEL'];
$model->debit_credit_type = $data['DEBIT_CREDIT_TYPE'];
$model->save();
if ($payResult['Ordr_Stcd'] == '2') {
$orderMain = $model->orderMain;
if ($orderMain->state != OrderState::UNPAID) {
throw new BusinessException(500, '订单状态异常');
}
$this->orderOnlineService->doByPaid($orderMain->global_order_id);
$this->separateAccountsService->orderOnlinePaid($orderMain->global_order_id);
//记录当前市场的当天外卖订单数
$this->orderStatisticsService->setForMarket($orderMain->market_id);
// 优惠券返券
$this->couponRebateService->couponRebateInTask($orderMain->global_order_id);
// 喇叭通知,兼容旧音响,MQTT+IOT
$res = $this->mqttService->speakToStore($orderMain->global_order_id);
$res = $this->deviceService->pubMsgToStoreByOrderMainId($orderMain->global_order_id);
// 打印订单,自动打印
$res = $this->feiePrintService->feiePrint($orderMain->global_order_id);
// 记录badge
$orderChildIds = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->pluck('store_id');
$this->badgeService->doByOrder($orderMain->user_id, $orderChildIds, $orderMain->global_order_id, OrderState::PAID);
// 公众号模板消息
$res = $this->miniprogramService->sendTemMsgForOnlineOrder($orderMain->global_order_id);
}
return $this->response->json([
'Svc_Rsp_St' => '00',
]);
} catch (\Exception $e) {
return $this->response->json([
'Svc_Rsp_St' => '01',
'Rsp_Inf' => $e instanceof BusinessException ? $e->getMessage() : '内部错误'
]);
}
}
public function refund()
{
$this->saveLog(__FUNCTION__, $this->request->getBody()->getContents());
return $this->response->json([
'Svc_Rsp_St' => '00',
]);
}
public function merchant()
{
$this->saveLog(__FUNCTION__, $this->request->getBody()->getContents());
return $this->response->json([
'Svc_Rsp_St' => '00',
]);
}
public function accounting()
{
$this->saveLog(__FUNCTION__, $this->request->getBody()->getContents());
return $this->response->json([
'Svc_Rsp_St' => '00',
]);
}
public function bill()
{
$this->saveLog(__FUNCTION__, $this->request->getBody()->getContents());
return $this->response->json([
'Svc_Rsp_St' => '00',
]);
}
public function platform()
{
$this->saveLog(__FUNCTION__, $this->request->getBody()->getContents());
return $this->response->json([
'Svc_Rsp_St' => '00',
]);
}
}