db->beginTransaction(); try { //1.判断订单是否可以取消 $oderMain = new OrderMain(); $orderInfo = $oderMain->getOrderInfoById($order_id); if ($is_check == 1) {//是否校验 是否可以退款 $isCancel = static::checkOrderCanCancel($orderInfo); if ($isCancel['flag'] == false) { $transaction->rollBack(); return $isCancel; } } //2.如果订单已支付 则添加退款记录 取消分销商的佣金 if (in_array($orderInfo['order_status'], [2, 3, 4])) { $order_status = 4;//退款 //2.1添加退款记录 已经存在记录则自动跳出 $refund = static::addPayRefund($orderInfo); if ($refund['flag'] == false) { $transaction->rollBack(); return $refund; } //2.2修改佣金记录 没有佣金记录则自动自动退出 $setCommission = static::setCommission($order_id); if ($setCommission['flag'] == false) { $transaction->rollBack(); return $refund; } } else { $order_status = 5;//取消 } //3.修改订单状态 退款 或者 取消 $canCel = static::cancelOrder($order_id, $order_status); if ($canCel['flag'] == false) { $transaction->rollBack(); return $canCel; } //4.通知供应商订单取消 if ($is_send == 1) {//是否发送退款请求通知供应商 //去cs取消订单 不是车票或没有spider_order_id 会自动跳出方法 $csFlag = static::cancelOrderCsBus($orderInfo); if ($csFlag['flag'] == false) { $transaction->rollBack(); return $csFlag; } } //5.发送用户通知 目前只有酒店订单发送通知 static::sendCancelOrderMsg($orderInfo, $is_confrim); Util::sendWxMsg(['order_id' => $order_id, 'type' => 5]);//发送微信取消通知 $transaction->commit(); if (in_array($orderInfo['order_status'], [2, 3])) {//退款 Util::addOrderLog($uid, $u_type, $order_id, '申请退款', 5); } else { Util::addOrderLog($uid, $u_type, $order_id, '自动取消', 4); } return Util::returnArrSu(); } catch (Exception $e) { $transaction->rollBack();//回滚 return Util::returnArrEr('订单取消失败![10000]'); } } /** * Des:取消订单发送短信通知 * Name: sendCancelOrderMsg * @param $orderInfo * @return array * @author 倪宗锋 */ public static function sendCancelOrderMsg($orderInfo, $is_confirm = 0) { if (in_array($orderInfo['category_id'], [3]) == false) { return Util::returnArrSu(); } $siteConfig = Util::getSiteConfig(); try { $orderMain = new OrderMain(); $hotelOrderInfo = $orderMain->getHotelOrderInfo($orderInfo['order_id']); $night = count(json_decode($hotelOrderInfo['total_details'], true)); if ($is_confirm == 0) { $msg = "预订失败:订单号{$orderInfo['order_id']},您预订的{$hotelOrderInfo['start_date']}入住"; $msg .= "{$hotelOrderInfo['hotel_name']}酒店{$hotelOrderInfo['room_name']}{$hotelOrderInfo['prod_cnt']}间{$night}晚,已支付{$hotelOrderInfo['total_money']}元。"; $msg .= "稍后会将您支付的全款原路退回您的账户,请注意查收。客服电话:{$siteConfig['kefu_tel']},遇到任何问题可关注微信公众号“{$siteConfig['web_name']}”,咨询在线客服,服务时间:09:00 - 21:00,祝您旅途愉快!"; } else { $msg = "您预定的{$hotelOrderInfo['start_date']}入住的{$hotelOrderInfo['room_name']}{$hotelOrderInfo['prod_cnt']}间{$night}晚的订单已被酒店确认无房,请您选择其他的房型入住。您所支付的金额将会全额退回您的支付账号。请注意查收。"; } return Util::sendMessage($msg, $hotelOrderInfo['contacts_phone']); } catch (Exception $e) { return Util::returnArrEr('发送短信通知失败'); } } /** * Des:判断订单是否可以取消 * Name: checkOrderCanCancel * @param $orderInfo * @return array * @author 倪宗锋 */ private static function checkOrderCanCancel($orderInfo) { $siteConfig = Util::getSiteConfig(); if (empty($orderInfo)) {//订单不存在 return Util::returnArrEr('网络异常,请您稍后再试'); } if ($orderInfo['category_id'] == 1) {//车票只能取消开车前的订单 $busStart = strtotime($orderInfo['start_date'] . ' ' . $orderInfo['start_time']) - 1800; $time = time(); if ($time > $busStart) { return Util::returnArrEr('订单取消失败,已过取消截止时间'); } } elseif (in_array($orderInfo['category_id'], [2, 3, 4, 5])) {//门票、酒店、巴士自由行、上门接 订单不允许退款 return Util::returnArrEr("请您联系客服 {$siteConfig['kefu_tel']} 进行取消和退款。"); } else {//其他订单 $start = strtotime($orderInfo['start_date']); $date = strtotime(date('Y-m-d')); if ($date >= $start) {//只能取消开始之前的订单 return Util::returnArrEr('订单取消失败,已过取消截止时间'); } } if ($orderInfo['category_id'] == 3 && $orderInfo['is_confirm']) {//已确认的 酒店订单不可以退款 return Util::returnArrEr("请您联系客服 {$siteConfig['kefu_tel']} 进行取消和退款。"); } if (in_array($orderInfo['order_status'], [1, 2]) == false) {//订单状态 1,2取消(支付、未支付) 其他的状态订单不可操作取消 return Util::returnArrEr("请您联系客服 {$siteConfig['kefu_tel']} 进行取消和退款。"); } return Util::returnArrSu(); } /** * Des:取消订单 修改订单状态为5 已取消 * Name: cancelOrder * @param $order_id * @param $order_status * @return array * @author 倪宗锋 */ private static function cancelOrder($order_id, $order_status = 5) { $oderMain = new OrderMain(); $upFlag = $oderMain->upOrder(['order_status' => $order_status], [$order_id]); if ($upFlag == false) { return Util::returnArrEr('订单取消失败[10005]'); } else { return Util::returnArrSu(); } } /** * Des:添加申请退款记录 * Name: addPayRefund * @param $orderInfo * @return array * @author 倪宗锋 */ private static function addPayRefund($orderInfo) { //校验申请退款数据是否已存在 $payRefush = new PayRefush(); $pay = $payRefush->getInfoByOrderId($orderInfo['order_id']); if (empty($pay) == false) {//如果已经存在数据 则只需返回成功 return Util::returnArrSu(); } //判断订单是否支付过 $payMain = new PayMain(); $payInfo = $payMain->getPayInfo($orderInfo['order_id']); if (empty($payInfo)) { return Util::returnArrEr('订单取消失败![10006]'); } //往退票表提交申请 $resushArr = [ 'order_id' => $orderInfo['order_id'], 'pay_order_id' => $payInfo['pay_order_id'], 'pay_type' => $payInfo['pay_type'], 'amount_money' => $payInfo['amount_money'], 'refush_money' => $payInfo['order_money'], 'fx_uid' => $orderInfo['fx_uid'], 'sh_uid' => $orderInfo['sh_uid'], 'status' => 1, 'create_time' => date('Y-m-d H:i:s'), 'delete_flag' => 0, 'category_id' => $orderInfo['category_id'], 'app_id' => $payInfo['app_id'], 'open_id' => $payInfo['open_id'] ]; $payRefush->attributes = $resushArr; $insertFlag = $payRefush->insert(); if (!$insertFlag) { return Util::returnArrEr('add refush fail!'); } return Util::returnArrSu(); } /** * Des:修改佣金状态 * Name: setCommission * @param $order_id * @return array * @author 倪宗锋 */ private static function setCommission($order_id) { $commission = new FxCommissionInfo(); $commissionInfo = $commission->getInfoByOrderId($order_id);//获取佣金详细 if (empty($commissionInfo)) { return Util::returnArrSu(); } if ($commissionInfo['status'] == '2') {//订单已取消则不可取消 return Util::returnArrSu('订单取消失败![10007]'); } if ($commissionInfo['status'] == '3') {//已取消则不在操作 return Util::returnArrSu(); } $up = $commission->editStatus($order_id, 3);//修改订单状态 if ($up) { return Util::returnArrSu(); } return Util::returnArrEr('订单取消失败![10008]'); } /** * Des:去CS取消订单 - 车 * Name: CancelOrderCs * @param $order_info array * @return array * @author 倪宗锋 */ public static function cancelOrderCsBus($order_info) { if (empty($order_info['spider_order_id'])) {//没有关联订单ID return Util::returnArrSu(); } $send_data = [ 'action' => '', 'if_link' => 1, 'order_id' => $order_info['spider_order_id'], 'sign' => $order_info['spider_order_id'], 'cancel_reason' => '取消订单' ]; if ($order_info['category_id'] == 1) {//如果是车票 $send_data['action'] = 'cancel_bus_order'; $url = '/api/submit-order'; } elseif ($order_info['category_id'] == 2) {//如果是门票 $send_data['action'] = 'cancel_ticket_order'; $url = '/api/submit-order'; } elseif ($order_info['category_id'] == 3) {//如果酒店 $url = '/hotel/api/cancel-hotel-order'; $send_data['HotelID'] = $order_info['hotel_id']; $send_data['RoomID'] = $order_info['room_id']; $send_data['OrderID'] = 'fx' . $order_info['order_id']; $send_data['Reason'] = '订单取消'; $result = Util::sendCs($send_data, $url, 2, 2); return $result; #临时模拟成功 ---倪宗锋------++++++++++++++ } elseif ($order_info['category_id'] == 4) {//如果是巴士自由行 $send_data['action'] = 'cancel_tourist'; $url = '/api/submit-order'; } else {//不是车票和门票则 直接跳出该方法 return Util::returnArrSu(); } $result = Util::sendCs($send_data, $url, 2, $order_info['system']); return $result; } /** * Des:微信支付 * Name: getWeChatOrderPayParams * @return array * @author 倪宗锋 */ public static function weChatOrderPay() { $getContent = file_get_contents("php://input"); $content = Util::xmlToArray($getContent); /**支付结果判定*/ if ($content['result_code'] != 'SUCCESS' || $content['return_code'] != 'SUCCESS') { return Util::returnArrEr('code error!'); } $param = [ 'app_id' => $content['appid'], 'out_trade_no' => $content['out_trade_no'],//订单号 'total_fee' => $content['total_fee'] / 100, 'openid' => $content['openid'],//用户标识 'payType' => 1, 'trade_no' => $content['transaction_id'],//流水号 ]; return static::payOrder($param); } /** * Des:支付宝支付 * Name: aliOrderPay * @return array * @author 倪宗锋 */ public static function aliOrderPay() { /***支付结果判定***/ if ($_POST['trade_status'] != 'TRADE_SUCCESS') { return Util::returnArrEr('code error!'); } $params = [ 'app_id' => $_POST['app_id'], 'out_trade_no' => $_POST['out_trade_no'],//订单号 'total_fee' => intval($_POST['buyer_pay_amount']), 'openid' => $_POST['buyer_id'],//用户标识 'payType' => 2, 'trade_no' => $_POST['trade_no'],//流水号 ]; return static::payOrder($params); } /** * Des:余额支付 * Name: amountPay * @return array * @author 倪宗锋 */ public static function amountOrderPay() { $time = $_POST['time']; $code = $_POST['code']; $code = Util::authCode($code);//将字符串进行解析 parse_str($code, $data);//将get参数转换成数组 if (empty($data['time']) || $time != $data['time']) { return Util::returnArrEr('code error'); } $params = [ 'app_id' => '', 'out_trade_no' => $data['out_trade_no'],//订单号 'total_fee' => intval($data['buyer_pay_amount']), 'openid' => '',//用户标识 'payType' => 3, 'trade_no' => $data['out_trade_no'] ]; return static::payOrder($params); } /** * Des:订单支付成功 数据处理 * Name: payOrder * @param $params * payType int 支付方式 1 微信,2支付宝 * @return array * @author 倪宗锋 */ public static function payOrder($params) { $orderIds = $params['out_trade_no'];//订单ID $orderStr = explode('_', $orderIds); $orderArr = explode('-', $orderStr['0']); /********************数据处理 * 循环设置订单支付信息 *******************************/ $csOrderType = 0; $transaction = \Yii::$app->db->beginTransaction(); try { //1.循环设置订单支付信息 foreach ($orderArr as $key => $orderId) { $setOrderPay = static::setOrderPay($orderId, $params);//修改订单状态及插入订单支付记录 if ($setOrderPay['flag'] == false) { $transaction->rollBack(); if ($setOrderPay['code'] == '1000') {//如果已经支付 则 返回成功 return Util::returnArrSu(); } return $setOrderPay;//是否则返回错误信息 } $csOrderType = $setOrderPay['data']['csOrderType'];//成功则重置订单类型 } //2.数据提交 $transaction->commit(); } catch (Exception $e) { $transaction->rollBack();//回滚 return Util::returnArrEr('system error!'); } //3.添加支付成功记录日志 Util::addOrderLog(0, 0, implode('-', $orderArr), '付款时间', 3); //4.发送微信通知 foreach ($orderArr as $orderIdVal) { Util::sendWxMsg(['type' => 1, 'order_id' => $orderIdVal]); } if ($csOrderType == 0) {//自有的产品 则到此结束 return Util::returnArrSu(); } //5.cs下单 /******************如果是其他来源产品的订单 * 去cs下订单**/ $makeOrder = static::makeCsOrder($orderArr, $csOrderType, $params['payType'], $params['trade_no']); if ($makeOrder['flag'] == false) { foreach ($orderArr as $key => $orderId) { $cancel = static::applyCancelOrder($orderId, 0);//微信申请取消订单 if ($cancel['flag'] == false) { static::sendMsgForCsAddOrderFail($orderId);//发送异常通知 } } return Util::returnArrEr('cs error!'); } //6.发送短信通知 return Util::returnArrSu(); } /** * Des:发送酒店确认订单通知 * Name: sendHotelConfirmMsg * @param $order_id * @return array * @author 倪宗锋 */ public static function sendHotelConfirmMsg($order_id) { try { $orderMain = new OrderMain(); $orderInfo = $orderMain->getOrderInfoById($order_id); if (in_array($orderInfo['category_id'], [3]) == false) { return Util::returnArrSu(); } $hotelOrderInfo = $orderMain->getHotelOrderInfo($orderInfo['order_id']); $night = count(json_decode($hotelOrderInfo['total_details'], true)); $siteConfig = Util::getSiteConfig(); $msg = "预订成功:订单号{$hotelOrderInfo['order_id']},{$hotelOrderInfo['users']}{$hotelOrderInfo['start_date']}入住"; $msg .= "{$hotelOrderInfo['hotel_name']}酒店{$hotelOrderInfo['room_name']}{$hotelOrderInfo['prod_cnt']}间{$night}晚,已支付{$hotelOrderInfo['total_money']}元。房间已预留,入住请出示入住人有效身份证件,酒店地址:{$hotelOrderInfo['address']}。订单不能取消修改。特别提示:请直接报{$hotelOrderInfo['users']}办理入住。"; $msg .= "客服电话:{$siteConfig['kefu_tel']},遇到任何问题可关注微信公众号“{$siteConfig['web_name']}”,咨询在线客服,服务时间:09:00-21:00,祝您旅途愉快!"; return Util::sendMessage($msg, $hotelOrderInfo['contacts_phone']); } catch (Exception $e) { return Util::returnArrEr('发送短信通知失败'); } } /** * Des:发送未支付通知 * Name: sendUnPayMsg * @param $order_id * @param $phone * @return array * @author 倪宗锋 */ public static function sendUnPayMsg($order_id, $phone) { try { $msg = "您有未支付的订单{$order_id}即将超时,请您抓紧时间完成支付。下单后15分钟内未完成支付的订单将被自动取消。"; return Util::sendMessage($msg, $phone); } catch (Exception $e) { return Util::returnArrEr('发送短信通知失败'); } } /** * Des:设置订单支付状态 * Name: setOrderPay * @param $orderId * @param $params * @return array * @author 倪宗锋 */ public static function setOrderPay($orderId, $params) { /**获取订单信息**/ $orderMain = new OrderMain(); $orderInfo = $orderMain->getOrderInfoById($orderId); /**已支付订单处理*/ if (!in_array($orderInfo['order_status'], [1, 5])) {//判断订单是否已支付 if ($params['out_trade_no'] == $orderInfo['pay_order_id']) {//重复请求 return Util::returnArrEr('order have paid ' . $orderId, '', '', '1000'); } else { static::refundOrderForRepeatPay($params);//订单重复支付退款 return Util::returnArrEr('order is paid by other ' . $orderId); } } /**修改订单主表信息*/ $upArray = [ 'order_id' => $orderId, 'order_status' => 2, ]; $upFlag = $orderMain->upOrder($upArray, [$orderId]); if (!$upFlag) { return Util::returnArrEr('order_main update error!'); } /**在支付表添加记录**/ $payMain = new PayMain(); $payArray = [ 'pay_type' => $params['payType'], 'amount_money' => $params['total_fee'],//支付总金额 'order_money' => $orderInfo['total_money'], 'pay_user' => 0, 'order_id' => $orderId, 'pay_order_id' => $params['out_trade_no'], 'app_id' => $params['app_id'], 'open_id' => $params['openid'] ]; $payMain->attributes = $payArray; $insertFlag = $payMain->insert(); if (!$insertFlag) { return Util::returnArrEr('add pay_main fail!'); } /**在佣金表添加记录**/ if (Util::checkPattern('intVal', $orderInfo['fx_uid'])) { $orderInfoTable = new OrderInfo(); if ($orderInfo['category_id'] == 4 && empty($orderInfo['sign']) == false) {//巴士自由行产品价格另行计算 $getCommission = static::getFreeWalkCommission($orderInfo); } elseif ($orderInfo['category_id'] == 3) { $getCommission = static::getHotelCommission($orderInfo); } else { $getCommission = $orderInfoTable->getOrderCommission($orderId); if (in_array($orderInfo['fx_uid'], [686, 749]) && in_array($orderInfo['prod_cate_id'], [1354, 1346])) { $getCommission = 5 * intval($orderInfo['prod_cnt']); //人民广场-迪士尼 } if (in_array($orderInfo['fx_uid'], [222]) && in_array($orderInfo['prod_cate_id'], [1354, 2213])) { $getCommission = 17 * intval($orderInfo['prod_cnt']); //人民广场-迪士尼 } if (in_array($orderInfo['fx_uid'], [80]) && in_array($orderInfo['prod_cate_id'], [1346])) { $getCommission = 5 * intval($orderInfo['prod_cnt']); //人民广场-迪士尼 } if (in_array($orderInfo['fx_uid'], [80]) && in_array($orderInfo['prod_cate_id'], [1354])) { $getCommission = 15 * intval($orderInfo['prod_cnt']); //人民广场-迪士尼 } if (in_array($orderInfo['fx_uid'], [80]) && in_array($orderInfo['prod_cate_id'], [2213])) { $getCommission = 15 * intval($orderInfo['prod_cnt']); //人民广场-迪士尼 } if (in_array($orderInfo['fx_uid'], [686, 823]) && in_array($orderInfo['prod_cate_id'], [2218, 2214])) { $getCommission = 5 * intval($orderInfo['prod_cnt']); //上海火车站-迪士尼 迪士尼-上海火车站 } if (in_array($orderInfo['fx_uid'], [686, 823]) && in_array($orderInfo['prod_cate_id'], [2213, 1354])) { $getCommission = 5 * intval($orderInfo['prod_cnt']); //人民广场-迪士尼 迪士尼-人广 } //瑞景木每子 15000189822 分销线路编号:1354 人民广场-迪士尼 20元 2213 迪士尼-人民广场 20元 if (in_array($orderInfo['fx_uid'], [807]) && in_array($orderInfo['prod_cate_id'], [1354, 2213])) { $getCommission = 10 * intval($orderInfo['prod_cnt']); } } $fxCommission = new FxCommissionInfo(); $commissionFlag = $fxCommission->add($orderInfo['fx_uid'], $getCommission, $orderId); if (!$commissionFlag) { return Util::returnArrEr('add orderInfo fail!'); } } /**判断订单需求去cs下单的订单类型*/ $csOrderType = 0; if ($orderInfo['prod_source'] == 2) {//产品来源2位cs系统 $csOrderType = $orderInfo['category_id'];//分类ID } /**发送订单支付成功通知,通知客服*/ if ($csOrderType == 0 || in_array($csOrderType, [2, 4, 5])) {//发送下单成功通知 static::sendMsgForOrderPay($orderInfo); } $return = [ 'csOrderType' => $csOrderType ]; return Util::returnArrSu('', $return); } /** * Des:获取巴士自由行的佣金 * Name: getFreeWalkCommission * @param $orderInfo * @return int * @author 倪宗锋 */ public function getFreeWalkCommission($orderInfo) { $orderInfoTable = new OrderInfo(); $data = []; $data['sign'] = $orderInfo['sign']; $data['prod_arr'] = json_encode($orderInfoTable->geProdArr($orderInfo['order_id']));//获取票种产品数据 $data['date'] = $orderInfo['start_date']; $data['action'] = 'get_tourist_pay_total'; $data['org_id'] = '164'; $getTotalCost = Util::sendCs($data, '/api/wx', 2); if ($getTotalCost['flag'] == true) { $total_cost = $getTotalCost['data']['list']['extra_info']['total_cost'];//低价 $cs_total_money = $getTotalCost['data']['list']['total_money'];//零售价 $insurance_money = $orderInfo['original_price'] - $cs_total_money;//保险金额 = 订单原价-零售价 //佣金等于 订单金额-零售价-保险金额 $getCommission = intval($orderInfo['total_money']) - intval($total_cost) - $insurance_money; } else { $getCommission = 0; } return $getCommission; } /** * Des:获取酒店的佣金金额 * Name: getHotelCommission * @param $orderInfo * @return float|int * @author 倪宗锋 */ public static function getHotelCommission($orderInfo) { $orderMain = new OrderMain(); $params = $orderMain->getHotelOrderInfo($orderInfo['order_id']); $roomPrices = json_decode($params['total_details'], true); foreach ($roomPrices as &$val) { $val['RunDate'] = $val['date']; $val['Price'] = $params['prod_cnt'] * $val['price']; unset($val['date']); unset($val['price']); } $data = [ 'HotelID' => $params['hotel_id'], 'RoomID' => $params['room_id'], 'RoomNum' => $params['prod_cnt'], 'CheckIn' => $params['start_date'], 'CheckOut' => $params['end_date'], 'RoomPrices' => $roomPrices, 'IfCheckPrice' => 0, ]; $result = Util::sendCs($data, '/hotel/api/get-low-price', 2); $getCommission = 0; if ($result['flag'] == true) { $total_cost = $result['data']['data']['low_price'];//底价 //佣金等于 订单金额-底价 if ($total_cost < $orderInfo['total_money']) { $getCommission = round($orderInfo['total_money'] - $total_cost, 2); } } return $getCommission; } /** * Des:前往cs下单 * Name: makeCsOrder * @param $orderArr * @param $csOrderType * @param $payType * @param $trade_no * @return array * @author 倪宗锋 */ public static function makeCsOrder($orderArr, $csOrderType, $payType, $trade_no = '') { //支付类型 替换成cs if ($payType == 3) { $pay_type = 275; } else if ($payType == 1) { $pay_type = 278; } else { $pay_type = 638; } if ($csOrderType == 1) {//车票 $makeOrder = static::makeBusTicket($orderArr, $pay_type); } elseif ($csOrderType == 2) {//门票 $makeOrder = static::makeMenPTicket($orderArr, $pay_type); } elseif ($csOrderType == 3) {//酒店 $makeOrder = static::makeHotel($orderArr, $pay_type, $trade_no); } elseif ($csOrderType == 4) {//巴士自由行 $makeOrder = static::makeFreeWalk($orderArr, $pay_type); } else { return Util::returnArrSu(); } return $makeOrder; } /** * Des:酒店下单 * Name: makeHotel * @param $orderArr * @param $pay_type * @param $trade_no * @return array * @author 倪宗锋 */ public static function makeHotel($orderArr, $pay_type, $trade_no) { $orderMain = new OrderMain(); $orderId = $orderArr[0]; $orderInfo = $orderMain->getHotelOrderInfo($orderId); if (empty($orderInfo['order_id'])) { return Util::returnArrEr('订单数据异常!'); } // $system = $orderInfo['system']; $system = 2;//展示写死 $siteConfig = Util::getSiteConfig(); $siteConfig['adm_user_id'] = $siteConfig['adm_user_arr'][$system]['adm_user_id'];//重置配置 $siteConfig['adm_source_id'] = $siteConfig['adm_user_arr'][$system]['adm_source_id'];//重置配置 //出行人信息 $orderContacts = new OrderContacts(); $passArr = $orderContacts->getPassAngerPeople($orderId); $passengerInfo = []; if (count($passArr) != 0) { foreach ($passArr as $key => $v) { $passengerInfo[]['Name'] = $v['contacts_name']; } } //每日价格信息 $roomPrices = json_decode($orderInfo['total_details'], true); $sum_price = 0; foreach ($roomPrices as &$val) { $val['RunDate'] = $val['date']; $val['Price'] = round($val['price'] * ($orderInfo['total_money'] / $orderInfo['original_price']), 2); $sum_price = $sum_price + $val['Price']; unset($val['date']); unset($val['price']); } $roomPrices[0]['Price'] = round(($orderInfo['total_money'] / $orderInfo['prod_cnt'] - $sum_price + $roomPrices[0]['Price']), 2); $send_data = [ 'CreateUserID' => $siteConfig['adm_user_id'], 'OrderID' => 'fx' . $orderId, //渠道订单号 'HotelID' => $orderInfo['hotel_id'], //酒店ID 'RoomID' => $orderInfo['room_id'], //房型ID 'DistribID' => $siteConfig['adm_source_id'],//渠道ID 'RoomNum' => $orderInfo['prod_cnt'], //房间数量 'CheckIn' => $orderInfo['start_date'], //入住日期 'CheckOut' => $orderInfo['end_date'], //离店日期, 'TotalPrice' => $orderInfo['total_money'],//订单总价 'Commission' => $orderInfo['commission'],//佣金 'Currency' => 'RMB', //币种 'ContactName' => $orderInfo['contacts_name'],//联系人姓名 'ContactTel' => $orderInfo['contacts_phone'], //联系人电话 'PayType' => $pay_type, // 638:支付宝支付; 221:现金支付 ;275:授信支付;278:微信支付 'PayTradeNo' => $trade_no, //支付流水号 'OrderGuests' => $passengerInfo, //入住人信息 'Comment' => $orderInfo['remarks'], //客人备注 'NeedInvoice' => 0, 'InvoiceInfos' => [ //发票信息 ], 'RoomPrices' => $roomPrices, ]; $curlInterface = new CurlInterface($send_data, 4); $curlInterface->setBaseUrl(''); $ticket_arr_cs = $curlInterface->execute($siteConfig['adm_host1'] . '/hotel/api/book-hotel-order', 'POST'); if (isset($ticket_arr_cs['code']) && $ticket_arr_cs['code'] == 0) { $orderMain->addSpiderOrder($ticket_arr_cs['data']['order_id'], $orderId); return Util::returnArrSu(); } else { return Util::returnArrEr(); } } /** * Des:去cs下车票订单 * Name: makeBusTicket * @param $orderArr * @param $pay_type * @return array * @author 倪宗锋 */ public static function makeBusTicket($orderArr, $pay_type) { $orderMain = new OrderMain(); $orderId = $orderArr[0]; $cs_prod_str = $orderMain->GetCsBusProdInfo($orderId); $system = $cs_prod_str['system']; $prod_str = '{1,' . $cs_prod_str['run_id'] . ',' . $cs_prod_str['ticket_id'] . ',' . $cs_prod_str['price'] . ',' . $cs_prod_str['prod_cnt'] . '}'; $outside_no = 'fx' . $orderId; if (count($orderArr) == 2) { $orderId = $orderArr[1]; $cs_prod_str = $orderMain->GetCsBusProdInfo($orderId); $prod_str .= '{2,' . $cs_prod_str['run_id'] . ',' . $cs_prod_str['ticket_id'] . ',' . $cs_prod_str['price'] . ',' . $cs_prod_str['prod_cnt'] . '}'; $outside_no .= '|fx' . $orderId; } //联系人信息 $customer_info_str = '{' . $cs_prod_str['contacts_name'] . ',' . $cs_prod_str['contacts_phone'] . ',150,' . '}'; $time = time(); $siteConfig = Util::getSiteConfig(); $siteConfig['adm_user_id'] = $siteConfig['adm_user_arr'][$system]['adm_user_id'];//重置配置 $siteConfig['adm_source_id'] = $siteConfig['adm_user_arr'][$system]['adm_source_id'];//重置配置 //受保人信息 $orderContacts = new OrderContacts(); $result = $orderContacts->getInsuredPeople($orderId); if (count($result) == 0) { $buy_insurance = 0; $insurance = ''; } else { $j = 0; $arr1 = array(); foreach ($result as $v) { $i = 0; $arr1[$j][$i] = $v['contacts_name']; $arr1[$j][++$i] = $v['contacts_ID']; $j++; } $buy_insurance = 1; $insurance = json_encode($arr1); } //出行人信息 $orderContacts = new OrderContacts(); $passArr = $orderContacts->getPassAngerPeople($orderId); if (count($passArr) == 0) { $passengerInfo = ''; } else { $arr = array(); foreach ($passArr as $key => $v) { $arr[$key]['passenger_name'] = $v['contacts_name']; $arr[$key]['passenger_mobile'] = ''; $arr[$key]['passenger_cardid'] = $v['contacts_ID']; } $passengerInfo = json_encode($arr); } $send_data = [ 'auth_code' => Util::authCodeForCs($time), 'user_key' => $siteConfig['adm_user_key'], 'user' => $siteConfig['adm_user'], 'user_id' => $siteConfig['adm_user_id'], 'request_time' => $time, 'action' => 'submit_bus_order', 'prod_str' => $prod_str, 'order_info_str' => "{{$siteConfig['adm_user_id']},0,{$siteConfig['adm_source_id']},$outside_no,0,{$pay_type},1,1}", 'customer_info_str' => $customer_info_str, 'buy_insurance' => $buy_insurance, 'insurance' => $insurance, 'passenger_info' => $passengerInfo ]; $curlInterface = new CurlInterface($send_data, 4); $curlInterface->setBaseUrl(''); $ticket_arr_cs = $curlInterface->execute($siteConfig['adm_host1'] . '/api/submit-order', 'POST'); if (isset($ticket_arr_cs['code']) && $ticket_arr_cs['code'] == 0) { if (count($orderArr) == 2) { $order_arr = explode(',', $ticket_arr_cs['data']); $addSpiderOrder = $orderMain->addSpiderOrder($order_arr[0], $orderArr[0]); $addSpiderOrder1 = $orderMain->addSpiderOrder($order_arr[1], $orderArr[1]); if ($addSpiderOrder == 0 || $addSpiderOrder1 == 0) { file_put_contents(APP_PATH . '/log/order/error' . date('Y-m-d') . '.log', $orderArr[0] . '在cs 下单失败 ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND); } } else { $addSpiderOrder = $orderMain->addSpiderOrder($ticket_arr_cs['data'], $orderArr[0]); if ($addSpiderOrder == 0) { file_put_contents(APP_PATH . '/log/order/error' . date('Y-m-d') . '.log', $orderArr[0] . '在cs 下单失败 ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND); } } return Util::returnArrSu(); } else { file_put_contents(APP_PATH . '/log/order/error' . date('Y-m-d') . '.log', $orderArr[0] . '在cs 下单失败 ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND); return Util::returnArrEr(); } } /** * Des:去cs下门票订单 * Name: makeBusTicket * @param $orderArr * @param $pay_type * @return array * @author 倪宗锋 */ public static function makeMenPTicket($orderArr, $pay_type) { foreach ($orderArr as $orderId) { $orderMain = new OrderMain(); $cs_prod_str = $orderMain->getCsUnBusProdInfo($orderId);//获取非巴士产品的下单产品信息 if (empty($cs_prod_str['prod_str'])) { return Util::returnArrEr('前往cs下单失败'); } $system = $cs_prod_str['system']; $outside_no = 'fx' . $orderId; //联系人信息 $customer_info_str = "{{$cs_prod_str['contacts_name']},{$cs_prod_str['contacts_phone']},150,{$cs_prod_str['contacts_ID']}}"; $time = time(); $siteConfig = Util::getSiteConfig(); $siteConfig['adm_user_id'] = $siteConfig['adm_user_arr'][$system]['adm_user_id'];//重置配置 $siteConfig['adm_source_id'] = $siteConfig['adm_user_arr'][$system]['adm_source_id'];//重置配置 $send_data = [ 'auth_code' => Util::authCodeForCs($time), 'user_key' => $siteConfig['adm_user_key'], 'user' => $siteConfig['adm_user'], 'user_id' => $siteConfig['adm_user_id'], 'request_time' => $time, 'action' => 'submit_ticket_order', 'main_prod_id' => $cs_prod_str['main_prod_id'], 'prod_str' => $cs_prod_str['prod_str'], 'run_date' => $cs_prod_str['run_date'], 'order_info_str' => "{{$siteConfig['adm_user_id']},0,{$siteConfig['adm_source_id']},$outside_no ,0,{$pay_type},1,1}", 'customer_info_str' => $customer_info_str ]; $curlInterface = new CurlInterface($send_data, 4); $curlInterface->setBaseUrl(''); $ticket_arr_cs = $curlInterface->execute($siteConfig['adm_host1'] . '/api/submit-order', 'POST'); if ($ticket_arr_cs['code'] == 0) { $orderMain->addSpiderOrder($ticket_arr_cs['data'], $orderId); } else { return Util::returnArrEr('cs下单失败!'); } } return Util::returnArrSu(); } /** * Des:巴士自由行订单下单 * Name: makeFreeWalk * @param $orderArr * @param $pay_type * @return array * @author 倪宗锋 */ public static function makeFreeWalk($orderArr, $pay_type) { foreach ($orderArr as $orderId) { try { $orderMain = new OrderMain(); $prodCate = new ProdCategory(); $cs_prod_str = $orderMain->getCsFreeWalkProdForMakeOrder($orderId);//获取巴士自由行产品的下单产品信息 if (empty($cs_prod_str)) { return Util::returnArrEr('前往cs下单失败'); } $orderInfo = $orderMain->getOrderInfoById($orderId); $prodInfo = $prodCate->getProdDetail($orderInfo['prod_cate_id']); //出行人信息 $orderContacts = new OrderContacts(); $passArr = $orderContacts->getPassAngerPeople($orderId); if (count($passArr) == 0) { $passengerInfo = ''; } else { $arr = array(); foreach ($passArr as $key => $v) { $arr[$key]['passenger_name'] = $v['contacts_name']; $arr[$key]['passenger_mobile'] = ''; $arr[$key]['passenger_cardid'] = $v['contacts_ID']; # modify nizf 联系人证件使用第一个出行人的证件 if (empty($v['contacts_ID']) == false && empty($orderInfo['contacts_ID'])) { $orderInfo['contacts_ID'] = $v['contacts_ID']; } } $passengerInfo = json_encode($arr); } //受保人信息 $orderContacts = new OrderContacts(); $result = $orderContacts->getInsuredPeople($orderId); if (count($result) == 0) { $buy_insurance = 0; $insurance = ''; } else { $j = 0; $arr1 = array(); foreach ($result as $v) { $i = 0; $arr1[$j][$i] = $v['contacts_name']; $arr1[$j][++$i] = $v['contacts_ID']; $j++; } $buy_insurance = 1; $insurance = json_encode($arr1); } //联系人信息 $customer_info = [ 'customer_name' => $orderInfo['contacts_name'], 'customer_mobile' => $orderInfo['contacts_phone'], 'customer_id_type' => '150', 'customer_id_no' => $orderInfo['contacts_ID'], 'customer_memo' => '无' ]; $siteConfig = Util::getSiteConfig(); $system = $orderInfo['system']; $siteConfig['adm_user_id'] = $siteConfig['adm_user_arr'][$system]['adm_user_id'];//重置配置 $siteConfig['adm_source_id'] = $siteConfig['adm_user_arr'][$system]['adm_source_id'];//重置配置 //订单信息 $orderInfoArr = [ 'user_id' => $siteConfig['adm_user_id'], 'member_id' => 2, 'outside_sale_org_id' => $siteConfig['adm_source_id'], 'outside_sale_order_no' => 'zzcx' . $orderId, 'total_money' => $orderInfo['total_money'], 'order_book_status' => 0, 'pay_type' => $pay_type, 'order_pay_status' => 1, 'sales_man' => '' ]; //发送报文 $time = time(); $data = [ 'auth_code' => Util::authCodeForCs($time), 'user_key' => $siteConfig['adm_user_key'], 'user' => $siteConfig['adm_user'], 'user_id' => $siteConfig['adm_user_id'], 'request_time' => $time, 'sign' => $prodInfo['sign'], 'date' => $orderInfo['start_date'], 'prod_arr' => json_encode($cs_prod_str), 'customer_info' => json_encode($customer_info), 'order_info' => json_encode($orderInfoArr), 'passenger_info' => $passengerInfo, 'buy_insurance' => $buy_insurance, 'insurance' => $insurance, 'action' => 'submit_tourist_order' ]; $ticket_arr_cs = Util::sendCs($data, '/api/wx/', 2, $system); if ($ticket_arr_cs['flag']) { $orderMain->addSpiderOrder($ticket_arr_cs['data']['order_title_id'], $orderId); //巴士自由行订单发送短信通知 $smg = "您有新的巴士自由行订单了!{$orderInfo['order_name']},微信:{$orderId},CS:{$ticket_arr_cs['data']['order_title_id']}"; $siteConfig = Util::getSiteConfig(); if (empty($siteConfig['freeWalkOrder']) == false) { Util::sendMessage($smg, $siteConfig['freeWalkOrder']); } } else { return Util::returnArrEr('cs下单失败!'); } } catch (Exception $e) { return Util::returnArrEr('cs下单失败!'); } } return Util::returnArrSu(); } /** * Des:下单成功 发送短信通知和RTX通知 * Name: sendMsgForOrderPay * @param $orderInfo * @author 倪宗锋 */ public static function sendMsgForOrderPay($orderInfo) { $siteConfig = Util::getSiteConfig(); //发送提示信息 if (empty($siteConfig['YunYinPhone']) == false ) {//如果保存了运营电话就发送短信通知 $msg = "您有新订单了:订单号:{$orderInfo['order_id']} 订单类型:{$orderInfo['category_name']} 预定产品:{$orderInfo['order_name']} 数量:{$orderInfo['prod_cnt']} 开始日期:{$orderInfo['start_date']} 结束日期:{$orderInfo['end_date']} 订单金额:¥{$orderInfo['total_money']} 联系人:{$orderInfo['contacts_name']} 手机:{$orderInfo['contacts_phone']} 请注意查看"; Util::sendMessage($msg, $siteConfig['YunYinPhone']); } if (empty($siteConfig['YunYinRTX']) == false) {//如果保存运营rtx则发送订单通知 $title = '【移动分销】您有新订单了'; $msg = "订单号:{$orderInfo['order_id']} 订单类型:{$orderInfo['category_name']} 预定产品:{$orderInfo['order_name']} 数量:{$orderInfo['prod_cnt']} 开始日期:{$orderInfo['start_date']} 结束日期:{$orderInfo['end_date']} 订单金额:¥{$orderInfo['total_money']} 联系人:{$orderInfo['contacts_name']} 手机:{$orderInfo['contacts_phone']} 请注意查看"; Util::sendMsgRTX($siteConfig['YunYinRTX'], $title, $msg); } if($orderInfo['category_id'] == 2) {//给用户发送短信通知 $msg = "您预定的“{$orderInfo["order_name"]}{$orderInfo["order_id"]}”已成功;为了保障您的出行,请务必至少提前两小时预定;否则订单款项将原路退回;车牌号及司机信息最晚将于发车前一小时发至您手机上,请注意查看;如遇问题请拨打0571-86693985"; Util::sendMessage($msg, $orderInfo['contacts_phone']); } } /** * Des:下单失败短信通知 * Name: sendMsgForCsAddOrderFail * @param $orderId * @author 倪宗锋 */ public static function sendMsgForCsAddOrderFail($orderId) { if (empty($siteConfig['YunYinRTX']) == false) {//如果保存运营rtx则发送订单通知 $title = '【移动分销】下单异常'; $msg = "订单号:$orderId 同步巴士订单失败,且自动退款失败, 请立即通知开发人员。 请注意查看"; Util::sendMsgRTX($siteConfig['YunYinRTX'], $title, $msg); } } /** * Des:下单 * Name: makeOrder * @param $param_arr * @return array * @author 倪宗锋 */ public static function makeOrder($param_arr) { $transaction = \Yii::$app->db->beginTransaction(); try { /**去程下单*/ $order_go = static::createOrder($param_arr['go_params']);//去程下单 if ($order_go['flag'] == false) { $transaction->rollBack();//数据提交 return $order_go; } $orderId = $order_go['data']['order_id'];//订单ID $param_arr['total_money'] = (int)$order_go['data']['total_money'];// if ($param_arr['if_back'] == 1) { /**返程下单*/ $order_back = static::createOrder($param_arr['back_params']);//返程下单 if ($order_back['flag'] == false) { $transaction->rollBack();//数据提交 return $order_back; } $orderId .= '-' . $order_back['data']['order_id']; $param_arr['total_money'] += $order_back['data']['total_money']; } $transaction->commit(); } catch (Exception $e) { $transaction->rollBack();//回滚 return Util::returnArrEr('下单失败[1008]'); } //设置下单成功返回值 $return = static::setMakeOrderReturn($orderId, $param_arr['total_money'], $param_arr['go_params']['system'], $param_arr['go_params']['contacts_phone'], $param_arr['go_params']['fx_uid']); return Util::returnArrSu('', $return); } /** * Des:设置订单返回值 * Name: setMakeOrderReturn * @param $orderId * @param $total_money * @param $contacts_phone * @param $system * @param $fx_uid * @return array * @author 倪宗锋 */ public static function setMakeOrderReturn($orderId, $total_money, $contacts_phone, $system, $fx_uid) { //生成日志-开始 错误不终止程序 //发送 微信通知 错误不终止程序 try { if ($system == 2) { $checkLogin = LoginService::checkLogin();//如果当前用户是登录状态 则用户ID为当前用户 否则根据用户手机号去绑定 if ($checkLogin['flag'] == true) { $u_uid = LoginService::$uid; } else { $shUser = new ShUser(); $u_uid = $shUser->getUidByPhone(trim($contacts_phone)); } $u_type = 3;//微信用户下单 } else { $u_uid = $fx_uid; $u_type = 2;//分销用户下单 } Util::addOrderLog($u_uid, $u_type, $orderId, '创建时间', 1); } catch (Exception $e) { } //设置返回值 $siteConfig = Util::getSiteConfig(); $return = [ 'order_id' => $orderId, 'pay_url' => $siteConfig['host_name'] . $siteConfig['payUrl'] . $orderId, 'total_money' => $total_money ]; return $return; } /** * Function Description:本地数据库添加订单数据 * Function Name: createOrder * @param $param_arr * * @return array * * @author 娄梦宁 */ public static function createOrder($param_arr) { $order_info = new OrderInfo(); $order_main = new OrderMain(); $order_contacts = new OrderContacts(); $prod_cate = new ProdCategory(); //获取产品数量 $prod_cnt = 0; foreach ($param_arr['prod_arr'] as $val) { $prod_cnt += $val['prod_count']; } $param_arr['prod_cnt'] = $prod_cnt; /*****获取订单信息***/ $category = $prod_cate->getProdCateInfo($param_arr['pro_cate_id']); if (empty($category)) { return Util::returnArrEr('下单失败[1001]'); } $param_arr['category_id'] = $category['category_id']; if (empty($param_arr['prod_arr'])) { return Util::returnArrEr('下单失败[1002]'); } $totalMoney = static::getTotalMoney($param_arr, $category);//获取价格、如有需要计算子产品价格的则返回从cs获取到的产品的产品价格 if ($totalMoney['flag'] == false) { return Util::returnArrEr('下单失败[1003]'); } if (isset($totalMoney['data']['prod_arr'])) { $param_arr['prod_arr'] = $totalMoney['data']['prod_arr']; } //新增保险价格--2017-10-26 娄梦宁 $param_arr['total_money'] = $totalMoney['data']['total_money']; if ($param_arr['category_id'] == 1 && (!empty($param_arr['is_buy_insurance']) && $param_arr['insurance_list'])) { $param_arr['insurance_price'] = 3; $param_arr['total_money'] = $param_arr['total_money'] + count($param_arr['insurance_list']) * $param_arr['insurance_price']; } //新增自由行保险价格--2017-12-08 田玲菲 if ($param_arr['category_id'] == 4 && (!empty($param_arr['is_buy_insurance']) && $param_arr['insurance_list'])) { $param_arr['total_money'] = $param_arr['total_money'] + count($param_arr['insurance_list']) * $param_arr['insurance_price']; } /**********1.插入order_main***************/ $fxUser = new FxUser(); $fxUserInfo = $fxUser::findOne($param_arr['fx_uid']); $param_arr['main_user_id'] = $fxUserInfo['main_user_id'];//获取运营联系人 $param_arr['end_date'] = date('Y-m-d', strtotime($param_arr['start_date']) + 3600 * 24 * (intval($param_arr['days']) - 1)); $param_arr['order_name'] = $category['pro_cate_name']; $param_arr['prod_source'] = 1;//产品来源 1、系统自增,2、cs $param_arr['start_area'] = $category['start_area']; $param_arr['end_area'] = $category['end_area']; if ($category['category_id'] == 1 || empty($category['sign']) == false) { $param_arr['prod_source'] = 2; } $shUser = new ShUser(); $param_arr['sh_uid'] = $shUser->getUidByPhone(trim($param_arr['contacts_phone']));//订单归属于 手机号对应的用户 $insertOrderMain = $order_main->insertOrder($param_arr); if (!$insertOrderMain) { return Util::returnArrEr('下单失败[1004]'); } $orderId = $order_main->order_id; /**********2.插入order_info***************/ $freeWalkerProdArr = []; if ($category['category_id'] == 4) {//如果是巴士自由行 $freeWalker = new FreeWalker(); $getProd = $freeWalker->getProdArr($category, $param_arr['start_date']); $freeWalkerProdArr = $getProd['data']; } foreach ($param_arr['prod_arr'] as $val) { if ($val['prod_count'] == 0) { continue; } if (empty($val['prod_price'])) {//没有 价格 则为0 $val['prod_price'] = 0; } foreach ($freeWalkerProdArr as $freeWalkProd) {//重置价格 if ($freeWalkProd['prod_id'] == $val['prod_id']) { $val['prod_price'] = $freeWalkProd['prod_price']; } } $insertOrderInfo = $order_info->insertInfo($val, $orderId, $category); if (!$insertOrderInfo) { return Util::returnArrEr('下单失败[1005]'); } } /**********4.插入联系人信息***************/ $insertOrderContacts = $order_contacts->insertContacts($param_arr, $orderId); if (!$insertOrderContacts) { return Util::returnArrEr('下单失败[1006]'); } /**********5.产品销售数量+***************/ $addProdCnt = $prod_cate->addCount($param_arr['pro_cate_id'], $prod_cnt); if ($addProdCnt === false) { return Util::returnArrEr('下单失败[1007]'); } /**************6.添加受保人信息***********************/ $addInsured = static::addInsured($param_arr, $orderId, $param_arr['insurance_price']); if ($addInsured['flag'] == false) { return $addInsured; } /**************7.添加乘车人信息***********************/ $addPassAnger = static::addPassAnger($param_arr, $orderId); if ($addPassAnger['flag'] == false) { return $addPassAnger; } return Util::returnArrSu('', ['order_id' => $orderId, 'total_money' => $param_arr['total_money']]); } /** * Des:添加保险单出行人信息 * Name: addInsured * @param $param_arr * @param $orderId * @return array * @author 倪宗锋 */ public static function addInsured($param_arr, $orderId, $insurance_price = 0) { if (!empty($param_arr['is_buy_insurance']) && $param_arr['insurance_list']) { foreach ($param_arr['insurance_list'] as $v) { $arr = array( 'contacts_name' => $v['passenger_name'], 'contacts_ID' => $v['passenger_cardid'], 'insurance_price' => $insurance_price ); $orderContacts = new OrderContacts(); $res = $orderContacts->addInsuredPeople($arr, $orderId); if (!$res) { return Util::returnArrEr('下单失败[1008]'); } } } return Util::returnArrSu(); } /** * Des:添加保险单出行人信息 * Name: addInsured * @param $param_arr * @param $orderId * @return array * @author 倪宗锋 */ public static function addPassAnger($param_arr, $orderId) { if (empty($param_arr['passanger_arr']) == false) { foreach ($param_arr['passanger_arr'] as $v) { $arr = array( 'contacts_name' => $v['passenger_name'], 'contacts_ID' => $v['passenger_cardid'] ); $orderContacts = new OrderContacts(); $res = $orderContacts->addPassAngerPeople($arr, $orderId); if (!$res) { return Util::returnArrEr('下单失败[1009]'); } } } return Util::returnArrSu(); } /** * Des:添加酒店拓展信息 * Name: addHotelExtra * @param $param_arr * @param $orderId * @return array * @author 倪宗锋 */ public static function addHotelExtra($param_arr, $orderId) { if (empty($param_arr['hotel_extra']) == false) { $data = $param_arr['hotel_extra']; $data['main_order_id'] = $orderId; $hotelExtra = new OrderHotelExtra(); $addFlag = $hotelExtra->addRow($data); return $addFlag; } return Util::returnArrSu(); } /** * Des:获取订单总价格 * Name: getTotalMoney * @param $params * @param $category * @return array * @author 倪宗锋 */ public static function getTotalMoney($params, $category) { /********如果是cs门票订单* 去CS获取订单价格***********/ if ($category['category_id'] == 2 && empty($category['sign']) == false) { $ticket = new MenP();//门票通用函数 $getTotalMoney = $ticket->getOrderPriceFromCs($category, $params['start_date'], $params['prod_arr']); if ($getTotalMoney['flag'] == false) { return $getTotalMoney; } $totalMoney = $getTotalMoney['data']; } elseif ($category['category_id'] == 4 && empty($category['sign']) == false) { $ticket = new FreeWalker();//巴士自由行 $getTotalMoney = $ticket->getPrice($params); if ($getTotalMoney['flag'] == false) { return $getTotalMoney; } $totalMoney = $getTotalMoney['data']; } /****默认直接读取数据库中产品的数据********/ else { $prod_main = new ProdMain(); $totalMoney = $prod_main->getTotalMoney($params['prod_arr']);//获取订单总金额 $totalMoney = ['total_money' => $totalMoney]; } //微信系统的巴士产品打92折 if ($params['system'] == 2 && $params['category_id'] == 1) { $totalMoney['total_money'] = static::getBusDiscountPrice($params['pro_cate_id'], $totalMoney['total_money'], $params['prod_cnt']); } return Util::returnArrSu('', $totalMoney); } /** * Des:获取巴士票的打折后的价格 * Name: getBusDiscountPrice * @param $pro_cate_id * @param $total_money * @param $prod_cnt int 产品数量 * @return float * @author 倪宗锋 */ public static function getBusDiscountPrice($pro_cate_id, $total_money, $prod_cnt = 1) { $siteConfig = Util::getSiteConfig(); foreach ($siteConfig['bus_discount_list'] as $discountVal) { if (in_array($pro_cate_id, $discountVal['id'])) {//如果是独立设置的就直接返回 $total_money = ceil($total_money * $discountVal['discount']); return $total_money; } } $total_money = ceil($total_money * $siteConfig['all_discount']); $total_money = $total_money - $siteConfig['all_discount_price'] * $prod_cnt;//全局减金额 if ($total_money <= 0) { $total_money = 1; } return $total_money; } /** * Des:无产品下单 * Name: makeUnProdOrder * @param $data * @return array * @author 倪宗锋 */ public static function makeUnProdOrder($data) { $param_arr = [ 'total_money' => $data['total_money'],//总基恩 'pro_cate_id' => 0,//产品ID 'prod_cnt' => $data['prod_cnt'],//产品数量 'order_name' => $data['order_name'],//订单名称 'fx_uid' => $data['fx_uid'],//分销商ID 'start_date' => $data['start_date'],//开始日期 'start_time' => $data['start_time'],//开始时间 'sh_uid' => $data['sh_uid'],//用户ID 'end_date' => $data['end_date'],//接收日期 'end_time' => empty($data['end_time']) ? '00:00:00' : $data['end_time'],//结束时间 'category_id' => $data['category_id'],//订单类型 'system' => $data['system'],//系统 'contacts_name' => $data['contacts_name'],//联系人 'contacts_ID' => $data['contacts_ID'],//联系人证件ID 'contacts_phone' => $data['contacts_phone'],//联系人手机号 'prod_source' => empty($data['prod_source']) ? 1 : $data['prod_source'],//产品来源 'start_area' => $data['start_area'],//起始地点 'end_area' => $data['end_area'],//结束地点 'passanger_arr' => empty($data['passanger_arr']) ? [] : $data['passanger_arr'], 'hotel_extra' => empty($data['hotel_extra']) ? [] : $data['hotel_extra'], 'remark'=>empty($data['remark'])?"":$data['remark'] ]; $order_contacts = new OrderContacts(); $order_main = new OrderMain(); $transaction = \Yii::$app->db->beginTransaction(); try { /**********1.插入order_main***************/ if (empty($param_arr['sh_uid'])) { $shUser = new ShUser(); $param_arr['sh_uid'] = $shUser->getUidByPhone($param_arr['contacts_phone']); } $insertOrderMain = $order_main->insertOrder($param_arr); if (!$insertOrderMain) { $transaction->rollBack();//回滚 return Util::returnArrEr('下单失败[1004]'); } $orderId = $order_main->order_id; /**********4.插入联系人信息***************/ $insertOrderContacts = $order_contacts->insertContacts($param_arr, $orderId); if (!$insertOrderContacts) { $transaction->rollBack();//回滚 return Util::returnArrEr('下单失败[1006]'); } /**************7.添加乘车人信息***********************/ $addPassAnger = static::addPassAnger($param_arr, $orderId); if ($addPassAnger['flag'] == false) { return $addPassAnger; } /**************9.添加酒店拓展信息***********************/ $addPassAnger = static::addHotelExtra($param_arr, $orderId); if ($addPassAnger['flag'] == false) { return $addPassAnger; } $transaction->commit();//数据提交 } catch (Exception $e) { $transaction->rollBack();//回滚 return Util::returnArrEr('下单失败[1008]'); } return Util::returnArrSu('', ['order_id' => $orderId, 'total_money' => $param_arr['total_money']]); } /** * Des:对重复支付的订单进行退款 * Name: refundOrderForSetPay * @param $params * pay_type 支付类型 1、微信 2、支付宝 3、余额支付 * @return array * @author 倪宗锋 */ public static function refundOrderForRepeatPay($params) { if ($params['payType'] == 3) { return Util::returnArrSu(); } $data = [ 'order_id' => $params['out_trade_no'], 'total_fee' => $params['total_fee'], 'refund_fee' => $params['total_fee'], 'app_id' => $params['app_id'] ]; $payType = $params['payType']; $return = PayService::cancel($data, $payType); return $return; } /** * Des:发送微信退款通知 * Name: sendRefundTemplateMsg * @param $order_id int * @param $total_money int 退款金额 * @author 倪宗锋 * @return array */ public static function sendRefundWxMsg($order_id, $total_money) { $payMain = new PayMain(); $getInfo = $payMain->getPayInfo($order_id);///获取支付信息 if ($getInfo['pay_type'] != 1) { return Util::returnArrEr('非微信支付订单!'); } $open_id = $getInfo['open_id'];//微信用户OPENID $siteConfig = Util::getSiteConfig(); $url = $siteConfig['host_name'] . $siteConfig['order_detail'] . $order_id; /** * {{first.DATA}} * 订单号:{{keyword1.DATA}} * 退款原因:{{keyword2.DATA}} * 退款金额:{{keyword3.DATA}} * {{remark.DATA}} */ $data = [ 'first' => ['value' => '您好,您的退款申请已成功退款,请确认查收。', 'color' => '#743A3A'], 'keyword1' => ['value' => $order_id, 'color' => '#4191ff'], 'keyword2' => ['value' => '订单取消', 'color' => '#4191ff'], 'keyword3' => ['value' => $total_money . '元', 'color' => '#4191ff'], 'remark' => ['value' => '温馨提示:如有疑问,请咨询在线客服', 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendRefundWxMsg', $url, $data); if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:预定成功微信通知 * Name: sendCreateOrderWxMsg * @param $order_id * @return array * @author 倪宗锋 */ public static function sendCreateOrderWxMsg($order_id) { if (Util::checkPattern('intVal', $order_id) == false) { return Util::returnArrEr('params error'); } $orderMain = new OrderMain(); $getInfo = $orderMain->getSendCreateWxMsg($order_id); if (empty($getInfo['open_id'])) { return Util::returnArrEr('非微信支付订单!'); } $open_id = $getInfo['open_id'];//微信用户OPENID $siteConfig = Util::getSiteConfig(); $url = $siteConfig['host_name'] . $siteConfig['order_detail'] . $order_id; ///汽车票下单通知 if ($getInfo['category_id'] == 1) { $data = [ 'first' => ['value' => '您的订单已预订成功,马上为您出票。', 'color' => '#743A3A'], 'keyword1' => ['value' => $order_id, 'color' => '#4191ff'], 'keyword2' => ['value' => $getInfo['users'], 'color' => '#4191ff'], 'keyword3' => ['value' => $getInfo['start_area'] . ' - ' . $getInfo['end_area'], 'color' => '#4191ff'], 'keyword4' => ['value' => $getInfo['start_date'] . ' ' . $getInfo['start_time'], 'color' => '#4191ff'], 'remark' => ['value' => '温馨提示:请提前15分钟到站乘车,上车时请出示订单号进行检票上车,如需帮助,请咨询微信在线客服', 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendCreateOrderWxMsg_1', $url, $data); } ///门票下单通知 else if ($getInfo['category_id'] == 2) { $data = [ 'first' => ['value' => '您好,您的门票订单已预订成功。', 'color' => '#743A3A'], 'OrderID' => ['value' => $order_id, 'color' => '#4191ff'], 'PkgName' => ['value' => $getInfo['order_name'] . ' ' . $getInfo['prod_cnt'], 'color' => '#4191ff'], 'TakeOffDate' => ['value' => $getInfo['start_date'] . ' ' . $getInfo['start_time'], 'color' => '#4191ff'], 'remark' => ['value' => '使用方法:凭预订成功后收到的短信提示换票或刷身份证入园,未使用前短信请勿删除、不能转发。如不慎删除,请联系在线客服。', 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendCreateOrderWxMsg_2', $url, $data); } else if ($getInfo['category_id'] == 3) { $hotelOrder = $orderMain->getHotelOrderInfo($order_id); $data = [ 'first' => ['value' => "您好,您已经成功预订{$hotelOrder['hotel_name']}。等待酒店确认接单。如酒店不接单将全额退款至您的付款账户。", 'color' => '#743A3A'], 'keyword1' => ['value' => $order_id, 'color' => '#4191ff'],//订单号 'keyword2' => ['value' => $hotelOrder['start_date'], 'color' => '#4191ff'],//入住日期 'keyword3' => ['value' => $hotelOrder['all_days'] . '晚', 'color' => '#4191ff'],//入住天数 'keyword4' => ['value' => $hotelOrder['room_name'], 'color' => '#4191ff'],//房型名称 'keyword5' => ['value' => $hotelOrder['prod_cnt'] . '间', 'color' => '#4191ff'],//房间数 'remark' => ['value' => '如有疑问,请致电' . $siteConfig['kefu_tel'] . "或关注微信公众号“{$siteConfig['web_name']}”,咨询在线客服,服务时间:09:00 - 21:00。", 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendCreateOrderWxMsg_3', $url, $data); } else { return Util::returnArrEr('暂时只支持汽、门票和酒店下单通知!'); } if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:发送佣金变更微信通知信息 发送给分销 * Name: sendCommissionWxMsg * @param $order_id * @return array * @author 倪宗锋 */ public static function sendCommissionWxMsg($order_id) { if (Util::checkPattern('intVal', $order_id) == false) { return Util::returnArrEr('params error'); } $fxCommission = new FxCommissionInfo(); $getInfo = $fxCommission->getSendWxMsg($order_id); if (empty($getInfo['open_id'])) { return Util::returnArrEr('非微信支付订单!'); } if (empty($getInfo['commission'])) { return Util::returnArrEr('没有佣金不发送通知'); } $open_id = $getInfo['open_id'];//微信open_id $siteConfig = Util::getSiteConfig(); $url = $siteConfig['fx_host'] . '/web/fx/order_detail.html?order_id=' . $order_id;//分销订单详情页面 $data = [ 'first' => ['value' => '恭喜你有新的分销佣金入账。', 'color' => '#743A3A'], 'keyword1' => ['value' => $order_id, 'color' => '#4191ff'], 'keyword2' => ['value' => $getInfo['category_name'], 'color' => '#4191ff'], 'keyword3' => ['value' => '已完成', 'color' => '#4191ff'], 'keyword4' => ['value' => $getInfo['total_money'] . '元', 'color' => '#4191ff'], 'keyword5' => ['value' => $getInfo['commission'] . '元', 'color' => '#4191ff'], 'remark' => ['value' => '分销佣金入账,你离月薪十万还差一小步,再接再厉哦!', 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendCommissionWxMsg', $url, $data, '#7B68EE', $siteConfig['fx_wechat']); if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:发送巴士出行短信通知 * Name: sendRunBusWxMsg * @param $data * @return array * @author 倪宗锋 */ public static function sendRunBusWxMsg($data) { $open_id = $data['open_id'];//微信open_id $siteConfig = Util::getSiteConfig(); $url = $siteConfig['host_name'] . $siteConfig['order_detail'] . $data['order_id'];//微信订单详情页 $data = [ 'first' => ['value' => '出行车辆通知', 'color' => '#743A3A'], 'keyword1' => ['value' => $data['bus_no'], 'color' => '#4191ff'], 'keyword2' => ['value' => $data['seat_name'], 'color' => '#4191ff'], 'keyword3' => ['value' => $data['area'], 'color' => '#4191ff'], 'keyword4' => ['value' => $data['run_date'], 'color' => '#4191ff'], 'keyword5' => ['value' => '联系在线客服获取', 'color' => '#4191ff'], 'remark' => ['value' => '温馨提示:司机将会在发车前5-10分钟与您联系,请保持手机畅通', 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendRunBusWxMsg', $url, $data); if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:发送取消订单分销通知 * Name: sendCancelOrderWxMsg * @param $order_id * @return array * @author 倪宗锋 */ public static function sendCancelOrderWxMsg($order_id) { if (Util::checkPattern('intVal', $order_id) == false) { return Util::returnArrEr('params error'); } $orderMain = new OrderMain(); $getInfo = $orderMain->getSendCreateWxMsg($order_id); if (empty($getInfo['open_id'])) { return Util::returnArrEr('非微信支付订单!'); } $open_id = $getInfo['open_id'];//微信用户OPENID $siteConfig = Util::getSiteConfig(); $url = $siteConfig['host_name'] . $siteConfig['order_detail'] . $order_id; if ($getInfo['category_id'] == 3) { $hotelOrder = $orderMain->getHotelOrderInfo($order_id); $star_date = date('m月d日', strtotime($hotelOrder['start_date'])); $data = [ 'first' => ['value' => "您预定的{$star_date}入住的{$hotelOrder['room_name']}房型({$hotelOrder['prod_cnt']}间{$hotelOrder['all_days']}晚) 的订单已被酒店确认无房,请您选择其他的房型入住。您所支付的金额将会全额退回您的支付账号。请注意查收。", 'color' => '#743A3A'], 'keyword1' => ['value' => $hotelOrder['hotel_name'], 'color' => '#4191ff'],//酒店名称 'keyword2' => ['value' => $hotelOrder['start_date'], 'color' => '#4191ff'],//入住日期 'keyword3' => ['value' => $hotelOrder['end_date'], 'color' => '#4191ff'],//离店日期 'remark' => ['value' => '如有疑问,请致电' . $siteConfig['kefu_tel'] . "或关注微信公众号“{$siteConfig['web_name']}”,咨询在线客服,服务时间:09:00 - 21:00。", 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendCancelOrderWxMsg_3', $url, $data); } else { return Util::returnArrEr('暂时只支持酒店取消通知!'); } if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:分销下单通知 * Name: sendFxCreateOrder * @param $order_id * @return array * @author 倪宗锋 */ public static function sendFxCreateOrder($order_id) { if (Util::checkPattern('intVal', $order_id) == false) { return Util::returnArrEr('params error'); } $fxCommission = new FxCommissionInfo(); $getInfo = $fxCommission->getSendWxMsg($order_id); if (empty($getInfo['open_id'])) { return Util::returnArrEr('非微信支付订单!'); } if (empty($getInfo['open_id'])) { return Util::returnArrEr('没有分销商不发送通知'); } $open_id = $getInfo['open_id'];//微信open_id $siteConfig = Util::getSiteConfig(); $url = $siteConfig['fx_host'] . '/web/fx/order_detail.html?order_id=' . $order_id;//分销订单详情页面 $data = [ 'first' => ['value' => '进单啦!有人通过扫描您的蜘蛛二维码下单成功', 'color' => '#743A3A'], 'keyword1' => ['value' => $getInfo['order_name'], 'color' => '#4191ff'],//产品名称 'keyword2' => ['value' => $order_id, 'color' => '#4191ff'],//订单号 'keyword3' => ['value' => $getInfo['prod_cnt'], 'color' => '#4191ff'],//人数 'keyword4' => ['value' => $getInfo['total_money'], 'color' => '#4191ff'],//金额 'remark' => ['value' => '详情请查看您的分销订单列表。', 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendFxCreateOrder', $url, $data, '#7B68EE', $siteConfig['fx_wechat']); if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:发送酒店订单确认通知 * Name: sendConfirmWxMsg * @param $order_id * @return array * @author 倪宗锋 */ public static function sendConfirmWxMsg($order_id) { if (Util::checkPattern('intVal', $order_id) == false) { return Util::returnArrEr('params error'); } $orderMain = new OrderMain(); $getInfo = $orderMain->getSendCreateWxMsg($order_id); if (empty($getInfo['open_id'])) { return Util::returnArrEr('非微信支付订单!'); } $open_id = $getInfo['open_id'];//微信用户OPENID $siteConfig = Util::getSiteConfig(); $url = $siteConfig['host_name'] . $siteConfig['order_detail'] . $order_id; $hotelOrder = $orderMain->getHotelOrderInfo($order_id); $star_date = date('m月d日', strtotime($hotelOrder['start_date'])); $data = [ 'first' => ['value' => "您预定的{$star_date}入住的{$hotelOrder['room_name']}房型({$hotelOrder['prod_cnt']}间{$hotelOrder['all_days']}晚) 的订单已被酒店确认接单,请您于入住当日到酒店前台办理相关手续", 'color' => '#743A3A'], 'order' => ['value' => $hotelOrder['order_id'], 'color' => '#4191ff'],//订单号 'Name' => ['value' => $hotelOrder['users'], 'color' => '#4191ff'],//入住人 'datein' => ['value' => $hotelOrder['start_date'], 'color' => '#4191ff'],//入住日期 'dateout' => ['value' => $hotelOrder['end_date'], 'color' => '#4191ff'],//离店日期 'number' => ['value' => $hotelOrder['prod_cnt'] . '间', 'color' => '#4191ff'],//房间数量 'room type' => ['value' => $hotelOrder['room_name'], 'color' => '#4191ff'],//房型名称 'pay' => ['value' => $hotelOrder['total_money'], 'color' => '#4191ff'],//订单总价 'remark' => ['value' => '如有疑问,请致电' . $siteConfig['kefu_tel'] . "或关注微信公众号“{$siteConfig['web_name']}”,咨询在线客服,服务时间:09:00 - 21:00。", 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendConfirmWxMsg', $url, $data); if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:发送酒店出行通知 * Name: sendTravelTipsWxMsg * @param $params * @return array * @author 倪宗锋 */ public static function sendTravelTipsWxMsg($params) { $open_id = $params['open_id'];//微信用户OPENID $siteConfig = Util::getSiteConfig(); $url = $siteConfig['host_name'] . $siteConfig['order_detail'] . $params['order_id']; $data = [ 'first' => ['value' => "您好,{$params['hotel_name']}万分期待您的入住,为了让您有更好的入住体验,请您尽量于当天14点-18点到店,错开前台办理入住的高峰时段。", 'color' => '#743A3A'], 'OrderID' => ['value' => $params['order_id'], 'color' => '#4191ff'],//订单号 'HotelName' => ['value' => $params['hotel_name'], 'color' => '#4191ff'],//入住人 'CheckInDate' => ['value' => $params['start_date'], 'color' => '#4191ff'],//入住日期 'CheckOutDate' => ['value' => $params['end_date'], 'color' => '#4191ff'],//离店日期 'remark' => ['value' => '如有疑问,请致电' . $siteConfig['kefu_tel'] . "或关注微信公众号“{$siteConfig['web_name']}”,咨询在线客服,服务时间:09:00 - 21:00。", 'color' => '#743A3A'] ]; $flag = WeChatService::sendWxTemplate($open_id, 'sendTravelTipsWxMsg', $url, $data); if ($flag == true) { return Util::returnArrSu(); } return Util::returnArrEr('发送失败!'); } /** * Des:校验是否可定 * Name: checkHotel * @param $params * @return array * @author 倪宗锋 */ public static function checkHotel($params) { $roomPrices = json_decode($params['total_details'], true); foreach ($roomPrices as &$val) { $val['RunDate'] = $val['date']; $val['Price'] = $val['price']; unset($val['date']); unset($val['price']); } $data = [ 'HotelID' => $params['hotel_id'], 'RoomID' => $params['room_id'], 'RoomNum' => $params['prod_cnt'], 'CheckIn' => $params['start_date'], 'CheckOut' => $params['end_date'], 'RoomPrices' => $roomPrices, 'IfCheckPrice' => 0, ]; $result = Util::sendCs($data, '/hotel/api/check-room-avail', 2); if ($result['flag'] == true) { return Util::returnArrSu('', $result['data']['data']); } return Util::returnArrEr($result['msg']); } }