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; } }