'success', self::CTRIP_HOTEL_CODE => '携程创建子酒店失败', self::SYS_ERR0R => '系统错误', self::MASTER_HOTEL_EMPTY => '母酒店ID不能为空', self::REPEAT_CREATE => '携程子酒店已创建,但cs系统不存在子酒店id', self::MAPPING_HOTEL_ERROR => '酒店关联失败', self::UNMAPPING_CODE => '请检查 Mapping 关系!', self::PARAM_ERR0R => '请求参数缺失', self::ADD_HOTEL_ERR => '添加酒店信息失败', self::GET_MASTER_HOTEL_ERR => '获取代理通酒店信息失败', ]; const CTRIP_ID = 669; //携程 const QUNAR_ID = 1667; //去哪 const ELONG_ID = 1668; //艺龙 const CHANNELA_ID = 1669; //分销A const B2B_ID = 1670; //b2b public $enableCsrfValidation = false; public $ctripConf; public $request_params; /** * CtripSwitchController constructor. */ public function __construct() { $this->ctripConf = Yii::$app->params['ctrip_switch']; } /** * Notes:request请求 * User: Steven * Date: 2018/4/16 * Time: 15:28 * @param $target_url * @param $data * @return mixed */ public function request($target_url, $data) { $data['requestor'] = $this->getCommonParams(); $timestamp = $this->getTimestamp(); $signature = $this->setSignature($this->ctripConf['switch_supplier_id'], $timestamp, $this->ctripConf['interfacekey']); $client = new Client(['baseUrl' => $this->ctripConf['base_url']]); $request = $client->createRequest() ->setHeaders(['content-type' => 'application/json;charset=UTF-8']) ->addHeaders(["timestamp" => $timestamp]) ->addHeaders(['signature' => $signature]); $response = $request->setFormat(Client::FORMAT_JSON) ->setMethod('post') ->setUrl($target_url) ->setData($data) ->send(); return json_decode($response->content); } /** * Notes:生成公共节点 * User: Steven * Date: 2018/4/19 * Time: 14:38 * @return array */ private function getCommonParams() { return [ 'invoker' => $this->ctripConf['requestor']['invoker'], 'operatorName' => $this->ctripConf['requestor']['operatorName'], 'opClientIP' => $this->ctripConf['requestor']['opClientIP'], 'userId' => $this->ctripConf['requestor']['userId'], 'languageType' => $this->ctripConf['requestor']['languageType'], ]; } /** * Notes:加密验证逻辑 * User: Steven * Date: 2018/4/16 * Time: 15:42 * @param $supplierID //供应商ID,int类型 * @param $timestamp * @param $interfacekey //密钥Key * @param $signature * @return bool */ private function getSignature($supplierID, $timestamp, $interfacekey, $signature) { //加密算法是md5(base64) $signature_str = strtoupper(base64_encode(md5($supplierID . $timestamp . $interfacekey, true))); return $signature == $signature_str; } /** * Notes:生成加密串 * User: Steven * Date: 2018/4/16 * Time: 17:58 * @param $supplierID * @param $timestamp * @param $interfacekey * @return string */ private function setSignature($supplierID, $timestamp, $interfacekey) { //加密算法是md5(base64) $signature = strtoupper(base64_encode(md5($supplierID . $timestamp . $interfacekey, true))); return $signature; } /** * Notes:获取当前时间的毫秒数 * User: Steven * Date: 2018/4/16 * Time: 18:01 * @return float */ private function getTimestamp() { list($msec, $sec) = explode(' ', microtime()); $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); return $msectime; } /** * Created by PhpStorm. * NOTES:获取接口所需要的渠道ID * User: Steven * Date: 2018/4/27 * Time: 16:25 * Class getChannelID * @param $channel_str * @return string */ public function getChannelID($channel_str) { $channel_arr = explode(',', $channel_str); $channel_id_str = ''; foreach ($channel_arr as $value) { $channel_id_str .= $channel_id_str == '' ? '' : ','; switch ($value) { case self::CTRIP_ID: $channel_id_str .= 'Ctrip'; break; case self::QUNAR_ID: $channel_id_str .= 'Qunar'; break; case self::ELONG_ID: $channel_id_str .= 'Elong'; break; case self::CHANNELA_ID: $channel_id_str .= 'ChannelA'; break; case self::B2B_ID: $channel_id_str .= 'B2B'; break; default: break; } } return $channel_id_str; } }