|
- <?php
- /**
- * Created by PhpStorm.
- * User: Steven
- * Date: 2017/10/30
- * Time: 16:22
- */
-
- namespace backend\modules\hotel\controllers;
-
- use backend\common\Utils;
- use backend\modules\hotel\models\Ali\AliExecute;
- use backend\modules\hotel\models\Ali\AliOrder;
- use backend\modules\hotel\models\Ali\TopLogger;
- use backend\modules\hotel\models\OperaHotelRoom;
- use backend\modules\hotel\models\OrderInvoiceInfo;
- use backend\modules\hotel\models\OrderMain;
- use backend\modules\hotel\models\RunHotelDistrib;
- use common\models\BaseSupplier;
- use common\models\BaseSupplierSale;
- use Yii;
- use yii\filters\AccessControl;
- use yii\filters\ContentNegotiator;
- use yii\web\Response;
- use backend\modules\hotel\models\OperaHotelLog;
- use backend\modules\hotel\models\OrderHtStatusLog;
- use backend\modules\hotel\models\CtripOrder;
- use backend\modules\hotel\models\CommonOrder;
-
- class AliOrderController extends BaseController
- {
- public $enableCsrfValidation = false;
- private $apiParas = ''; // 接口参数
- private $scTime = 0; //请求响应时间差
- public $agent_id = self::AGENT_ALI_HOTEL_ID;
-
- public function behaviors()
- {
- //配置ContentNegotiator支持JSON和XML响应格式
- $behaviors['contentNegotiator'] = [
- 'class' => ContentNegotiator::className(),
- 'formats' => [
- 'application/xml' => Response::FORMAT_XML
- ],
- // 'only' => ['index'],//指定只是针对于index有效
- // 'except'=>[''] //只想剔除某个action
- ];
- $behaviors['access'] = [
- 'class' => AccessControl::className(),
- 'rules' => [
- [
- 'ips' => [
- /*'106.11.229.*', '106.11.230.*', '106.11.231.*', '106.11.228.*', '106.11.224.*', '106.11.225.*', '106.11.226.*', '140.205.51.*', '140.205.56.*',
- '106.11.227.*', '106.11.242.*', '106.11.243.*', '140.205.51.*', '140.205.144.*', '140.205.145.*', '140.205.40.*', '140.205.39.*',//阿里IP访问白名单
- '127.0.0.1', '106.14.56.77', '180.168.4.58', //蜘蛛及本地IP访问白名单
- '116.236.255.166'*/ //小黑鱼,测试功能用
- ],
- 'allow' => true,
- ],
- ],
- ];
- return $behaviors;
- }
-
-
- /**
- * Notes:对外接口入口
- * User: Steven
- * Date: 2018/1/17
- * Time: 15:16
- * @return object
- * @throws \yii\base\InvalidConfigException
- */
- public function actionIndex()
- {
- $startTime = microtime(TRUE);
- $request = Yii::$app->request->getRawBody();
- $exec = new AliExecute();
- $valid_res = $exec->validAuth($request);
- if (!$valid_res) {
- $result = ['Message' => '账号权限验证失败', 'ResultCode' => '-4'];
- } else {
- $this->apiParas = $exec->action_param;
- $action = $exec->action_id;
- $result = $this->$action();
- }
- $rs = \Yii::createObject([
- 'class' => 'yii\web\Response',
- 'format' => \yii\web\Response::FORMAT_XML,
- 'formatters' => [
- \yii\web\Response::FORMAT_XML => [
- 'class' => 'yii\web\XmlResponseFormatter',
- 'rootTag' => 'Result', //根节点
- ],
- ],
- 'data' => $result
- ]);
- $endTime = microtime(TRUE);
- $this->scTime = round(floatval($endTime - $startTime), 3);//时间差
- $logger = new TopLogger;
- $logger->log([date("Y-m-d H:i:s"), json_encode($result) . "\n" . 'time:' . $this->scTime . 's' . PHP_EOL], 'ali/order');
- return $rs;
- }
-
- /**
- * Author:Steven
- * Desc:酒店试单请求 用户进入预定页面之前,会通过此接口到直连商家确认产品是否可售
- * 1、响应时间2秒以内(超时认为试单通过) 2、有明确的成功或失败结果 3、价格、担保、退改规则有变化有正确的反馈
- * @return array
- */
- public function ValidateRQ()
- {
- $ali_order = new AliOrder(['scenario' => 'ValidateRQ']);
- $order = json_decode(json_encode($this->apiParas), true);
- if (!$ali_order->load($order, '') || !$ali_order->validate()) {
- $getError = $ali_order->getFirstErrors();
- $msg = '';
- foreach ($getError as $item) {
- $msg .= $item . ';';
- }
- return ['Message' => $msg, 'ResultCode' => '-116'];
- }
- $end_date = date('Y-m-d', strtotime("-1 day", strtotime($this->apiParas->CheckOut)));
- $data = RunHotelDistrib::getAvailProduct($this->apiParas->RatePlanCode, $this->apiParas->CheckIn, $end_date);
- $flag = empty($data) ? false : true;
- $non_book_cn = 0;
- foreach ($data as $item) {
- if ($item['RUN_STATUS'] == 329 || $item['AUTHORITY_STATUS'] == 0 || $item['ROOM_RUN_STATUS'] == 0 || $item['ROOM_IS_ONSALE'] == 0 || $item['IS_ONSALE'] == 0) {
- $flag = false;
- $non_book_cn++;
- }
- if ($this->apiParas->RoomNum > $item['REMAINING_COUNT']) {
- $flag = false;
- }
- $price_list[] = [
- 'date' => $item['RUN_DATE'],
- 'price' => $item['PROD_PRICE'] * 100,
- 'quota' => $item['REMAINING_COUNT']
- ];
- }
- if ($flag) {
- $result = [
- 'Message' => '',
- 'CreateOrderValidateKey' => time(),
- 'ResultCode' => '0',
- 'InventoryPrice' => json_encode($price_list)
- ];
- } else {
- $days = Utils::diffBetweenTwoDays($this->apiParas->CheckIn, $this->apiParas->CheckOut);
- $result = [
- 'Message' => '',
- 'CreateOrderValidateKey' => time(),
- 'ResultCode' => $days <= $non_book_cn ? '-1' : '-3',
- 'InventoryPrice' => json_encode($price_list)
- ];
- $msg = $days <= $non_book_cn ? '满房' : '房量不足(请求日期库存不全部为0,部分可售)';
- // 查询酒店信息
- $hotelInfo = OperaHotelRoom::find()
- ->select(["a.ROOM_NAME", "a.INNER_IDENTIFY", "b.HOTEL_NAME", "a.RP_ID"])
- ->leftJoin("opera_hotel as b", "a.HOTEL_ID = b.HOTEL_ID")
- ->from("opera_hotel_room as a")
- ->where(["a.ID" => $this->apiParas->RatePlanCode, "a.CANCEL_FLAG" => 0, "b.CANCEL_FLAG" => 0])
- ->asArray() ->one();
- $this->sendAliMsgToRtx('【阿里直连】酒店可定检查失败:', '原因:' . $msg . "\n酒店:" . $hotelInfo['HOTEL_NAME'] .
- "\n房型:" . $hotelInfo['ROOM_NAME'] . "\n内部标识:" . $hotelInfo['INNER_IDENTIFY'] . "\nRP_ID:". $hotelInfo["RP_ID"] ."\n日期:" . $this->apiParas->CheckIn . '~' . $this->apiParas->CheckOut, 2);
- }
- return $result;
- }
-
-
- /**
- * Notes: 预定订单 已经支付接口
- * 1、预订接口(BookRQ)要求多次调用返回相同的结果,且相同阿里订单号不重复创建预订
- * 2、支持同步和异步两种方式预订,如果需要异步处理,BookRQ返回接收成功,但不返回外部订单号即可
- * 3、处理能力要有合理评估并告知,去啊会根据性能要求投放流量
- * 4、 下单重试的时限为3分钟重试3次,查询重试的时限为30分钟重试30次,超过时限没有结果会当作失败处理,并给发出告警,需要人工处理避免占房
- * User: Steven
- * Date: 2018/1/16
- * Time: 11:44
- * @return array
- * @throws \yii\db\Exception
- */
- public function BookRQ()
- {
- $ali_order = new AliOrder(['scenario' => 'BookRQ']);
- $order = json_decode(json_encode($this->apiParas), true);
- //这里会在load判断是否已经存在该订单
- if ($ali_order->load($order, '') && $ali_order->validate()) {
- $res = $ali_order->validateBook(); //检查产品是否可定
- if ($res['ResultCode'] != 0) {
- $this->sendAliMsgToRtx('【阿里直连】酒店下单:', "下单失败" . "\n" . '淘宝单号' . $ali_order->TaoBaoOrderId . "\n" . '原因:' . json_decode($res["Message"], true)["reason"], 2);
-
- return $res; //这里会直接返回不可定的原因(价格或者库存校验失败)和code
- }
- $res_code = $ali_order->bookOrder();
- if ($res_code == AliOrder::RESPONSE_SUCCESS) { //下单成功
- $response = [
- 'Message' => AliOrder::RESPONSE_MSG[$res_code],
- 'ResultCode' => 0,
- 'OrderId' => $ali_order->zz_order_id,
- ];
- OrderMain::updateAll(['DOCKING_TYPE' => CtripOrder::ORDER_DOCKING_TYPE, 'CHANNEL_ORDER_STATUS' => OrderMain::ORDER_CHANNEL_STATUS_WAITING, 'UPDATE_TIME' => date('Y-m-d H:i:s', time())],
- ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $ali_order->zz_order_id], ['PARENT_ORDER_ID' => $ali_order->zz_order_id]]]);
- } else { //系统异常不能创建订单,请返回此错误码。第三方系统返回此错误码,去啊系统将自动将卖家从搜索中屏蔽。
- //这里我们还是返回预订成功, 然后进行异步下单(当Message和OrderId为空时表示异步下单)
- if ($res_code == AliOrder::RESPONSE_SYSERROR) {
- $ali_order->save();
- $response = [
- 'Message' => '',
- 'ResultCode' => 0,
- 'OrderId' => '',
- ];
- $this->sendAliMsgToRtx('【阿里直连】酒店下单:', "接收数据成功,系统下单失败" . "\n" . '淘宝单号:' .
- $ali_order->TaoBaoOrderId . "\n处理办法:" . '正常搬单,再变更订单类型为直连,后续操作同其他直连订单一致', 4);
- } else {
- $response = [
- 'Message' => AliOrder::RESPONSE_MSG[$res_code],
- 'ResultCode' => $res_code,
- 'OrderId' => '',
- ];
- }
- }
-
- return $response;
- } else {
- $error = $ali_order->getErrors();
- foreach ($error as $k => $v) {
- if ((array_key_exists($v[0], AliOrder::RESPONSE_MSG))) {
- $response = ['Message' => AliOrder::RESPONSE_MSG[$v[0]], 'ResultCode' => -$v[0]];
- } else {
- $response = ['Message' => AliOrder::RESPONSE_MSG[AliOrder::RESPONSE_PARAM_ERROR], 'ResultCode' => AliOrder::RESPONSE_PARAM_ERROR];
- }
-
- return $response;
- }
- }
- }
-
- /**
- * Author:Steven
- * Desc:下单接口
- * @param $order
- * @return array|bool
- */
- private function zzBook($order)
- {
- $params = [
- 'CreateUserID' => Yii::$app->params['ctrip']['base_user_id'],
- 'OrderID' => $this->OrderID, //渠道订单号
- 'HotelID' => $this->Spider_hotel, //酒店ID
- 'RoomID' => $this->Spider_room, //房型ID
- 'DistribID' => Yii::$app->params['ctrip']['supplier_id'],//渠道ID
- 'RoomNum' => $this->Quantity, //房间数量
- 'CheckIn' => $this->Arrival, //入住日期
- 'CheckOut' => $this->Departure, //离店日期,
- 'TotalPrice' => $this->CostAmount,//订单总价
- 'Currency' => $this->Currency, //币种
- 'ContactName' => '',//联系人姓名
- 'ContactTel' => '', //联系人电话
- 'PayType' => CommonOrder::PAY_TYPE_CREDIT, // 638:支付宝支付; 221:现金支付 ;275:授信支付;278:微信支付
- 'PayTradeNo' => '', //支付流水号
- 'OrderGuests' => CtripOrder::getGuestsName($this->Guests), //入住人信息
- 'Comment' => $this->Notice, //客人备注
- 'NeedInvoice' => 0,
- 'InvoiceInfos' => [ //发票信息
- ],
- 'RoomPrices' => CtripOrder::getRoomPrices($this->RoomPrices)
- ];
- $new_order = new CommonOrder(['scenario' => 'BookHotelOrder']);
-
-
- $room_type = OperaHotelRoom::findOne($order['RatePlanCode']);
- //构造下单需要的参数
- $user_id = Yii::$app->params['ali']['base_user_id'];
- $hotel_id = $order['HotelId'];
- $room_type = $room_type->ROOM_TYPE;
- $org_id = Yii::$app->params['ali']['supplier_id']; //携程渠道ID
- $org_num = $order['TaoBaoOrderId']; //渠道订单号
- $Guest_list = '';
- $OrderGuests = !isset($order['OrderGuests']['OrderGuest']['Name']) ? $order['OrderGuests']['OrderGuest'] : $order['OrderGuests'];
- foreach ($OrderGuests as $OrderGuest) {
- $Guest_list .= $OrderGuest['Name'] . ' ';
- }
- if (empty($Guest_list)) {
- $Guest_list = $order['ContactName'];
- }
- $new_room_list = '';
- $notes = empty($order['Comment']) ? '' : Yii::$app->params['ali']['base_user_id'] . "|" . time() . "|0|{$order['Comment']}}";
- $cus_list = "{{$Guest_list}{$order['ContactEmail']}," . ($order['ContactTel']) . "," . $notes . '}';
- $supplier = BaseSupplier::findOne(['ID' => Yii::$app->params['ali']['supplier_id']]);
- if ($supplier == null) {
- return false;
- }
- $commissionRule = $supplier->getCommissionRule(BaseSupplierSale::SALE_HOTEL);
- if ($commissionRule != null && $commissionRule->COMMISION_TYPE == BaseSupplierSale::TYPE_CHANNEL) {
- $base_com = $commissionRule->BACK_PERCENT;
- } else if ($commissionRule == null) {
- return false;
- } else {
- $base_com = 0;
- }
- $dailyInfo = !isset($order['DailyInfos']['DailyInfo']['Day']) ? $order['DailyInfos']['DailyInfo'] : $order['DailyInfos'];
- foreach ($dailyInfo as $DailyInfo) {
- $commission = round(($base_com / 100) * ($DailyInfo['Price'] / 100), 2);
- $new_room_list .= "{''" . $DailyInfo['Day'] . "''," . $order['RoomNum'] . "," . ($DailyInfo['Price'] / 100) . "," . $commission . "}";
- }
- //ht_make_order(259,197,9,675,'444444444','{''2017-11-09'',1,100,3.5}','{石福鹏测试,17602134075,}','23:00',0,313)
- // ht_make_order CALL ht_make_order(640,125,4,669,'4960112824 ','{''2017-11-24'',1,780,0}','{徐文成,,640|1511416569|1|尽量安排双床房。}','23:00',0,313)
- $checkin_time = date('H:i', strtotime($order['LatestArriveTime']));
- $sql = "CALL ht_make_order({$user_id},{$hotel_id},{$room_type},{$org_id},'{$org_num}','{$new_room_list}','{$cus_list}','{$checkin_time}',0,145)";
- $result = Yii::$app->db->createCommand($sql)->queryOne();
- $logger = new TopLogger;
- $logger->log([date("Y-m-d H:i:s"), "【阿里下单】" . "\n" . $sql . "\n" . json_encode($result)], 'ali/order');
- if ($result['errcode'] == 0) {
- //添加发票信息
- if (isset($order['InvoiceInfo']['NeedInvoice']) && $order['InvoiceInfo']['NeedInvoice'] == 1) {
- $order_invoice_info = new OrderInvoiceInfo();
- if (!$order_invoice_info->load($order['InvoiceInfo'], '')) {
- //加载数据失败
- $this->sendAliMsgToRtx('【阿里直连】酒店下单:', "保存发票信息到数据库失败,请联系技术进行处理" . "\n" . '订单号' . $result['order_id'], 1);
- }
- $order_invoice_info->InvoiceMoney = $order['TotalPrice'] / 100;
- $order_invoice_info->CreateUseId = Yii::$app->params['ali']['base_user_id'];
- $order_invoice_info->Status = 1;
- $order_invoice_info->ChannelId = Yii::$app->params['ali']['supplier_id'];
- $order_invoice_info->OrderID = $result['order_id'];
- $order_invoice_info->save();
- }
- //写订单日志、状态日志
- $orderLog = new OperaHotelLog();
- $orderLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
- $orderLog->HOTEL_ID = $order['HotelId'];
- $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER;
- $orderLog->ROOM_TYPE = $room_type;
- $orderLog->PARENT_ROOM_TYPE = $order['RoomTypeId'];
- $orderLog->LOG_DESC = "创建订单号为" . $result['order_id'] . "的订单";
- $orderLog->ORDER_ID = $result['order_id'];
- $orderLog->save();
- $statusLog = new OrderHtStatusLog();
- $statusLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
- $statusLog->UPDATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
- $statusLog->ORDER_STATUS = OrderMain::ORDER_STATUS_WAITING_SEND;
- $statusLog->ORDER_ID = $result['order_id'];
- $statusLog->save();
- $count = OrderMain::updateAll(['DOCKING_TYPE' => OrderMain::ORDER_TYPE_CHANNEL, 'ORDER_PAY_STATUS' => '0', 'CHANNEL_ORDER_STATUS' => OrderMain::ORDER_CHANNEL_STATUS_WAITING,
- 'ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_SEND],
- ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $result['order_id']], ['PARENT_ORDER_ID' => $result['order_id']]]]);
- return ['OrderId' => $result['order_id']];
- } else { //下单失败
- return false;
- }
- }
-
-
- /**
- * Author:Steven
- * Desc:
- * 使用场景:
- * 1、预订之后,查询预订结果 9
- * 2、补偿入住/NoShow状态
- * 3、补偿离店状态
- * 4、补偿账单
- * 5、取消订单后,查询取消结果
- * 要求:
- * 1、同步接口
- * 2、使用去啊订单号查询
- * 3、数据必须准确,必须和订单实时数据一致
- * 4、数据要全,预订状态、预订号、预订信息、结帐单(结帐状态后)等都需要
- * @return array
- */
- public function QueryStatusRQ()
- {
- $status = ''; //系统订单状态
- $flag = true;
- //QueryType 查询类型。 1-普通查询;2-下单过程中的查询(一般是进行对订单状态的确认);3-取消订单过程中的查询; 4:系统状态补偿查询
- $req_param = json_decode(json_encode($this->apiParas), true);
- if (empty($req_param['OrderId'])) { //说明是异步下单
- $res_order_id = OrderMain::find()->select(['ORDER_ID'])->where([
- 'OUTSIDE_ORDER_NO' => "{$req_param['TaoBaoOrderId']}",
- 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN,
- 'PARENT_ORDER_ID' => 0,
- 'CANCEL_FLAG' => 0,
- ])->limit(1)->asArray()->one();
- } else {
- $res_order_id = OrderMain::find()->where([
- 'ORDER_ID' => $req_param['OrderId'],
- 'OUTSIDE_ORDER_NO' => "{$req_param['TaoBaoOrderId']}",
- 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN,
- 'PARENT_ORDER_ID' => 0,
- 'CANCEL_FLAG' => 0,
- ])->limit(1)->asArray()->one();
- }
- $PmsResID = "";
- if (!empty($res_order_id)) { //在ORDER_MAIN 中下单成功
- $res = OrderMain::find()->select(['ORDER_ID', 'OUTSIDE_ORDER_NO', 'ORDER_VALID_STATUS', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE',
- 'CHANNEL_ORDER_STATUS', 'ORDER_STATUS', 'ORDER_CONFIRM_CODE', 'ORDER_PRICE', 'ORDER_DESCRIPTION', 'PARENT_PROD_NAME'])->where([
- 'OUTSIDE_ORDER_NO' => $req_param['TaoBaoOrderId'],
- 'ORDER_ID' => $res_order_id['ORDER_ID'],
- 'CANCEL_FLAG' => 0,
- ])->asArray()->one();
- if ($res['CHANNEL_ORDER_STATUS'] == OrderMain::ORDER_CHANNEL_STATUS_PAYING || $res['CHANNEL_ORDER_STATUS'] == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL
- || $res['CHANNEL_ORDER_STATUS'] == OrderMain::ORDER_CHANNEL_STATUS_WAITING) { //渠道待支付 待接单
- $status = 3;//订单等待处理中 待支付
- } elseif ($res['CHANNEL_ORDER_STATUS'] == OrderMain::ORDER_CHANNEL_STATUS_ACCEPT) { //渠道已接单
- $status = 1; //订单已经确认
- $PmsResID = $res['ORDER_CONFIRM_CODE']; //酒店的确认号
- } elseif ($res['CHANNEL_ORDER_STATUS'] == OrderMain::ORDER_CHANNEL_STATUS_REJECT
- || $res['CHANNEL_ORDER_STATUS'] == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED) { //已拒绝 拒单
- $status = 4; //订单已取消
- } elseif ($res['CHANNEL_ORDER_STATUS'] == OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_REJECT) { //渠道申请取消被拒
- if ($res['ORDER_STATUS'] == OrderMain::ORDER_STATUS_NO_PAID || $res['ORDER_STATUS'] == OrderMain::ORDER_STATUS_WAITING_SEND
- || $res['ORDER_STATUS'] = OrderMain::ORDER_STATUS_WAITING_CONFIRM) {//待支付 待发单
- $status = 3;//订单等待处理中
- } elseif ($res['ORDER_STATUS'] == OrderMain::ORDER_STATUS_CONFIRMED || $res['ORDER_STATUS'] == OrderMain::ORDER_STATUS_CHANGING
- || $res['ORDER_STATUS'] == OrderMain::ORDER_STATUS_FINISH) {
- $status = 1; //订单已经确认
- } elseif ($res['ORDER_STATUS'] == OrderMain::ORDER_STATUS_CANCEL_BEFORE_CONFIRM || $res['ORDER_STATUS'] == OrderMain::ORDER_STATUS_CANCEL) { //
- $status = 4; //订单已取消
- } else {
- $flag = false;
- }
- } elseif ($res['CHANNEL_ORDER_STATUS'] == 0) { //说明直连失败的订单,搬完单但是还没有变更成之直连的状态,这个时候也需要返回待确认
- $status = 3;
- } else {
- $flag = false;
- }
- } else { //order_main 中没有该订单
- $order = AliOrder::find()->select(['TotalPrice'])->where(['TaoBaoOrderId' => "{$req_param['TaoBaoOrderId']}"])->asArray()->one();
- if (empty($order)) {
- $result = ['ResultCode' => -302, 'Message' => '订单不存在', 'OrderId' => $req_param['OrderId']];
- } else {
- $result = [
- 'Message' => '',
- 'ResultCode' => '0',
- 'TaoBaoOrderId' => $req_param['TaoBaoOrderId'],
- 'OrderId' => '',
- 'Status' => 3,
- 'TotalRoomPrice' => $order['TotalPrice'],
- 'OtherFee' => 0,
- ];
- }
- return $result;
- }
-
- if (!$flag) { //查询订单状态的时候,有未判断到的其他状态,需要推送开发人员
- $this->sendAliMsgToRtx('【阿里直连】阿里渠道直连订单状态查询失败:', "有未判断到的其他订单状态,请关注" . "\n" . $req_param['OrderId'], '');
- $result = [];
- } else {
- $result = [
- 'Message' => '',
- 'ResultCode' => '0',
- 'TaoBaoOrderId' => $req_param['TaoBaoOrderId'],
- 'OrderId' => $res_order_id['ORDER_ID'],
- 'Status' => $status,
- 'PmsResID' => $PmsResID,
- 'TotalRoomPrice' => $res['ORDER_PRICE'] * 100,
- 'OtherFee' => 0,
- ];
- if ($res['PROD_START_STATION_DATE'] < date('Y-m-d', time())) {
- $desc = explode('|', $res['ORDER_DESCRIPTION']);
- $RoomQuantity = explode(',', $desc[0])[2];
- $result['OrderInfo'] = [
- 'CheckIn' => $res['PROD_START_STATION_DATE'] . ' 00:00:00',
- 'CheckOut' => $res['PROD_END_STATION_DATE'] . ' 00:00:00',
- 'RoomQuantity' => $RoomQuantity,
- 'Hotel' => $res['PARENT_PROD_NAME'],
- ];
- }
- }
-
- return $result;
- }
-
- /**
- * Author:Steven
- * Desc:支付成功回调 由于我们跟阿里合作的形式是先付款后下单
- * 根据此接口定义实现支付成功回调接口,并暴露成服务。
- * 此接口用于预付订单用户支付成功后通知第三方系统,仅通知一次(超时原因会重试3次)
- * @return array
- */
- public function PaySuccessRQ()
- {
- $flag = true;
- $order = json_decode(json_encode($this->apiParas), true);
- $res_order_id = OrderMain::find()
- ->leftJoin('opera_hotel_room', 'order_main.PARENT_PROD_ID=opera_hotel_room.HOTEL_ID and order_main.PROD_ID=opera_hotel_room.ROOM_TYPE and opera_hotel_room.CANCEL_FLAG=0')
- ->select(['ORDER_ID', 'PROD_ID', 'PARENT_PROD_ID', 'opera_hotel_room.PARENT_ROOM_TYPE'])->where([
- 'OUTSIDE_ORDER_NO' => "{$order['TaoBaoOrderId']}",
- 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN,
- 'PARENT_ORDER_ID' => 0,
- 'order_main.CANCEL_FLAG' => 0,
- ])->limit(1)->asArray()->one();
- if (empty($res_order_id)) { //order_main 说明订单是异步下单
- $count = AliOrder::updateAll(['AlipayTradeNo' => $order['AlipayTradeNo']], ['TaoBaoOrderId' => $order['TaoBaoOrderId']]);
- if ($count <= 0) {
- $flag = false;
- }
- } else {
- $orderLog = new OperaHotelLog();
- $orderLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
- $orderLog->HOTEL_ID = $res_order_id['PARENT_PROD_ID'];
- $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER;
- $orderLog->ROOM_TYPE = $res_order_id['PROD_ID'];
- $orderLog->PARENT_ROOM_TYPE = $res_order_id['PARENT_ROOM_TYPE'];
- $orderLog->LOG_DESC = "支付订单,支付宝流水号:" . $order['AlipayTradeNo'];
- $orderLog->ORDER_ID = $res_order_id['ORDER_ID'];
- if (!$orderLog->save()) {
- $flag = false;
- }
- }
- $result = $flag ? ['Message' => '处理成功', 'ResultCode' => 0] : ['Message' => '内部错误', 'ResultCode' => -400];
-
- return $result;
- }
-
- /**
- * Author:Steven
- * Desc:酒店退款通知请求 此接口请求只作为退款通知申请,不会根据响应结果做退款处理。
- * @return array
- */
- public function OrderRefundRQ()
- {
- $req_param = json_decode(json_encode($this->apiParas), true);
- $res_order_id = OrderMain::find()->leftJoin('opera_hotel_room', 'order_main.PARENT_PROD_ID=opera_hotel_room.HOTEL_ID and order_main.PROD_ID=opera_hotel_room.ROOM_TYPE and opera_hotel_room.CANCEL_FLAG=0')
- ->select(['ORDER_ID', 'PROD_ID', 'PARENT_PROD_ID', 'opera_hotel_room.PARENT_ROOM_TYPE'])->where([
- 'OUTSIDE_ORDER_NO' => "{$req_param['TaoBaoOrderId']}",
- 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN,
- 'PARENT_ORDER_ID' => 0,
- 'order_main.CANCEL_FLAG' => 0,
- ])->limit(1)->asArray()->one();
- $orderLog = new OperaHotelLog();
- $orderLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
- $orderLog->HOTEL_ID = $res_order_id['PARENT_PROD_ID'];
- $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER;
- $orderLog->ROOM_TYPE = $res_order_id['PROD_ID'];
- $orderLog->PARENT_ROOM_TYPE = $res_order_id['PARENT_ROOM_TYPE'];
- $orderLog->LOG_DESC = "买家申请退款,订单号:" . $res_order_id['ORDER_ID'];
- $orderLog->ORDER_ID = $res_order_id['ORDER_ID'];
- $orderLog->save();
-
- $Shipped = $req_param['Shipped'] ? '已发货' : '未发货';
- $this->sendAliMsgToRtx('【阿里直连】买家申请退款通知:', '订单:' . $req_param['OrderId'] . ' ' . $Shipped . "\n" . '买家申请退款,请至淘宝后台进行处理', 4);
- $result = ['Message' => '接受成功', 'ResultCode' => '0'];
-
- return $result;
- }
-
- /**
- * Author:Steven
- * Desc:用户取消订单
- * 1、由于我们的产品都是不可取消,所以客人申请取消,都需要我们同意或者拒绝,当同意退款的时候就会调用这个接口
- * 2、订单未付款 关闭时也会请求该接口
- * 3、我们拒单,或者我们确认无房 也会调用该接口
- * 4、下单失败的情况也会调用该接口
- * @return array
- */
- public function CancelRQ()
- {
- $req_param = json_decode(json_encode($this->apiParas), true);
- $res_order_id = OrderMain::find()->leftJoin('opera_hotel_room', 'order_main.PARENT_PROD_ID=opera_hotel_room.HOTEL_ID and order_main.PROD_ID=opera_hotel_room.ROOM_TYPE and opera_hotel_room.CANCEL_FLAG=0')
- ->select(['ORDER_ID', 'CHANNEL_ORDER_STATUS', 'PROD_ID', 'PARENT_PROD_ID', 'opera_hotel_room.PARENT_ROOM_TYPE'])->where([
- 'OUTSIDE_ORDER_NO' => "{$req_param['TaoBaoOrderId']}",
- 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN,
- 'PARENT_ORDER_ID' => 0,
- 'order_main.CANCEL_FLAG' => 0,
- ])->limit(1)->asArray()->one();
- if (empty($res_order_id)) {
- return ['Message' => '', 'ResultCode' => '-204']; //不存在该订单
- }
- $orderLog = new OperaHotelLog();
- $orderLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
- $orderLog->HOTEL_ID = $res_order_id['PARENT_PROD_ID'];
- $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER;
- $orderLog->ROOM_TYPE = $res_order_id['PROD_ID'];
- $orderLog->PARENT_ROOM_TYPE = $res_order_id['PARENT_ROOM_TYPE'];
- $orderLog->LOG_DESC = "买家申请取消订单,已同意取消(退款成功),订单号:" . $res_order_id['ORDER_ID'];
- $orderLog->ORDER_ID = $res_order_id['ORDER_ID'];
- $orderLog->save();
- if ($res_order_id['CHANNEL_ORDER_STATUS'] != OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED) {
- //当接收到取消通知的时候说明,订单已经同意取消或者超时自动取消,需要修改
- $count = OrderMain::updateAll(['CHANNEL_ORDER_STATUS' => OrderMain::ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED],
- ['and', ['CANCEL_FLAG' => 0], ['or', ['ORDER_ID' => $res_order_id['ORDER_ID']], ['PARENT_ORDER_ID' => $res_order_id['ORDER_ID']]]]);
- $orderLog = new OperaHotelLog();
- $orderLog->CREATE_USER_ID = Yii::$app->params['ali']['base_user_id'];
- $orderLog->HOTEL_ID = $res_order_id['PARENT_PROD_ID'];
- $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER;
- $orderLog->ROOM_TYPE = $res_order_id['PROD_ID'];
- $orderLog->PARENT_ROOM_TYPE = $res_order_id['PARENT_ROOM_TYPE'];
- $orderLog->LOG_DESC = "渠道订单状态变为已取消,订单号:" . $res_order_id['ORDER_ID'];
- $orderLog->ORDER_ID = $res_order_id['ORDER_ID'];
- $orderLog->save();
- } else {
- return ['Message' => '', 'ResultCode' => '-205']; //已取消
- }
- $this->sendAliMsgToRtx('【阿里直连】买家申请取消订单:', '订单号:' . $req_param['OrderId'] . "\n" . "阿里订单号:" . $req_param['TaoBaoOrderId'] . "\n" . '用户取消订单,请及时核实CS订单状态,如果订单在渠道上已经取消,请尽快取消CS订单', 4);
- $result = ['Message' => '', 'ResultCode' => '-100'];
-
- return $result;
- }
- }
|