|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415 |
- <?php
-
- namespace backend\modules\hotel\models\Ali;
-
- /**
- * Created by PhpStorm.
- * User: Steven
- * Date: 2017/10/12
- * Time: 14:28
- */
- use common\models\commonModel;
-
- class AliExecute extends commonModel
- {
- //TOP分配给应用的AppKey
- public $appkey = '23769843'; // 正式环境
- // public $appkey = '1023769843'; // 沙箱环境
- //TOP分配给应用的AppKey
- public $secretKey = '94327ea2d0e45d084b8b7f1a6eba590e';
- //响应格式。默认为xml格式,可选值:xml,json。
- public $format = "json";
- //HTTP请求地址
- public $gatewayUrl = "http://gw.api.taobao.com/router/rest"; //正式环境23769843
- // public $gatewayUrl = "http://gw.api.tbsandbox.com/router/rest"; //沙箱环境
- //签名的摘要算法,可选值为:hmac,md5
- protected $signMethod = "md5";
- //API协议版本,可选值:2.0。
- protected $apiVersion = "2.0";
-
- protected $sdkVersion = "top-sdk-php-20151012";
-
- public $connectTimeout;
-
- public $readTimeout;
-
- public $session = '6101915c7f2e081083b6971187bfa138e2805a913f2c8a42850504041';
-
- public $sessionUpdateTime = '2020-03-18 10:26:28';
-
- private $Username = 'taobao_zz'; //阿里用于请求下单等操作的用户名
-
- private $Password = "zzcx1q2w3e4r"; //密码
-
- private $CreateToken = '22251178182015010620150107497867981843210904377';
-
- public $action_id = '';
- public $action_param = '';
-
- /**
- * Author:Steven
- * Desc:
- * @param $request
- */
- public function validAuth($request)
- {
- if ($request == '') {
- return false;
- }
- $request = simplexml_load_string($request, 'SimpleXMLElement', LIBXML_NOCDATA);
- $this->action_id = $request->getName();
- $logger = new TopLogger;
- $user_ip=\Yii::$app->request->userIP;
- $logger->log([date("Y-m-d H:i:s"), "【{$this->action_id}】【{$user_ip}】" . $request->asXML()], 'ali/order');
-
- if (isset($request->AuthenticationToken)) {
- $AuthenticationToken = $request->AuthenticationToken;
- if ($AuthenticationToken->Username != $this->Username || $AuthenticationToken->Password != $this->Password) {
- //权限验证失败
- return false;
- }
- unset($request->AuthenticationToken);
- $this->action_param = $request;
- } else {
- return false;
- }
- return true;
- }
-
- /**
- * Author:Steven
- * Desc:生成合作伙伴身份标识
- * @return string
- */
- private function getClusterTag()
- {
- return substr($this->sdkVersion, 0, 11) . "-cluster" . substr($this->sdkVersion, 11);
- }
-
- /**
- * Author:Steven
- * Desc:组装需要的参数发送请求
- * @param $request
- * @param bool $session_flag
- * @param null $bestUrl
- * @return mixed|\SimpleXMLElement
- */
- public function execute($request, $session_flag = false, $bestUrl = null)
- {
- //组装系统参数(公共参数)
- $sysParams["app_key"] = $this->appkey;
- $sysParams["v"] = $this->apiVersion;
- $sysParams["format"] = $this->format;
- $sysParams["sign_method"] = $this->signMethod;
- //用户登录授权成功后,TOP颁发给应用的授权信息。当此API的标签上注明:“需要授权”,则此参数必传;“不需要授权”,则此参数不需要传;“可选授权”,则此参数为可选
- $sysParams["method"] = $request->getApiMethodName();
- $sysParams["timestamp"] = date("Y-m-d H:i:s");
- if ($session_flag) {
- $sysParams["session"] = $this->session;
- }
-
- //系统参数放入GET请求串
- if ($bestUrl) {
- $requestUrl = $bestUrl . "?";
- $sysParams["partner_id"] = $this->getClusterTag();
- } else {
- $requestUrl = $this->gatewayUrl . "?";
- $sysParams["partner_id"] = $this->sdkVersion;
- }
-
- //获取业务参数
- $apiParams = $request->getApiParas();
-
- //签名串
- $sysParams["sign"] = $this->generateSign(array_merge($apiParams, $sysParams));
-
- foreach ($sysParams as $sysParamKey => $sysParamValue) {
- // if(strcmp($sysParamKey,"timestamp") != 0)
- $requestUrl .= "$sysParamKey=" . urlencode($sysParamValue) . "&";
- }
-
- $fileFields = array();
- foreach ($apiParams as $key => $value) {
- if (is_array($value) && array_key_exists('type', $value) && array_key_exists('content', $value)) {
- $value['name'] = $key;
- $fileFields[$key] = $value;
- unset($apiParams[$key]);
- }
- }
-
- // $requestUrl .= "timestamp=" . urlencode($sysParams["timestamp"]) . "&";
- $requestUrl = substr($requestUrl, 0, -1);
-
- //发起HTTP请求
- try {
- $startTime = microtime(TRUE);
- $logger = new TopLogger;
- $logger->log(array(date("Y-m-d H:i:s"), $requestUrl . "\n" . json_encode($apiParams, true)), 'ali/room_status');
- if (count($fileFields) > 0) {
- $resp = $this->curl_with_memory_file($requestUrl, $apiParams, $fileFields);
- } else {
- $resp = $this->curl($requestUrl, $apiParams);
- }
- $endTime = microtime(TRUE);
- $scTime = round(floatval($endTime - $startTime), 3);//时间差
- $user_id = \Yii::$app -> user -> id;
- $logger->log(array($user_id. "\n". date("Y-m-d H:i:s"), $resp . "\n" . 'time:' . $scTime . 's' . PHP_EOL), 'ali/room_status');
- } catch (\Exception $e) {
- $this->logCommunicationError($sysParams["method"], $requestUrl, "HTTP_ERROR_" . $e->getCode(), $e->getMessage());
- $result['code'] = $e->getCode();
- $result['msg'] = $e->getMessage();
- return $result;
- }
- unset($apiParams);
- unset($fileFields);
- //解析返回结果
- $respWellFormed = false;
- if ("json" == $this->format) {
- $respObject = json_decode($resp);
- if (null !== $respObject) {
- $respWellFormed = true;
- foreach ($respObject as $propKey => $propValue) {
- $respObject = $propValue;
- }
- }
- } else if ("xml" == $this->format) {
- $respObject = @simplexml_load_string($resp);
- if (false !== $respObject) {
- $respWellFormed = true;
- }
- }
-
- //返回的HTTP文本不是标准JSON或者XML,记下错误日志
- if (false === $respWellFormed) {
- $this->logCommunicationError($sysParams["method"], $requestUrl, "HTTP_RESPONSE_NOT_WELL_FORMED", $resp);
- $result['code'] = 0;
- $result['msg'] = "HTTP_RESPONSE_NOT_WELL_FORMED";
- return $result;
- }
-
- //如果TOP返回了错误码,记录到业务错误日志中
- if (isset($respObject->code)) {
- $logger = new TopLogger;
- $logger->log(array(
- date("Y-m-d H:i:s"),
- $resp
- ));
- }
- return $respObject;
- }
-
- /**
- * Author:Steven
- * Desc:生成签名串
- * @param $params
- * @return string
- */
- protected function generateSign($params)
- {
- ksort($params);
-
- $stringToBeSigned = $this->secretKey;
- foreach ($params as $k => $v) {
- if (is_string($v) && "@" != substr($v, 0, 1)) {
- $stringToBeSigned .= "$k$v";
- }
- }
- unset($k, $v);
- $stringToBeSigned .= $this->secretKey;
-
- return strtoupper(md5($stringToBeSigned));
- }
-
- /**
- * Author:Steven
- * Desc:
- * @param $url
- * @param null $postFields
- * @return mixed
- * @throws Exception
- */
- public function curl($url, $postFields = null)
- {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_FAILONERROR, false);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- if ($this->readTimeout) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);
- }
- if ($this->connectTimeout) {
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
- }
- curl_setopt($ch, CURLOPT_USERAGENT, "top-sdk-php");
- //https 请求
- if (strlen($url) > 5 && strtolower(substr($url, 0, 5)) == "https") {
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
- }
-
- if (is_array($postFields) && 0 < count($postFields)) {
- $postBodyString = "";
- $postMultipart = false;
- foreach ($postFields as $k => $v) {
- if (!is_string($v))
- continue;
-
- if ("@" != substr($v, 0, 1))//判断是不是文件上传
- {
- $postBodyString .= "$k=" . urlencode($v) . "&";
- } else//文件上传用multipart/form-data,否则用www-form-urlencoded
- {
- $postMultipart = true;
- if (class_exists('\CURLFile')) {
- $postFields[$k] = new \CURLFile(substr($v, 1));
- }
- }
- }
- unset($k, $v);
- curl_setopt($ch, CURLOPT_POST, true);
- if ($postMultipart) {
- if (class_exists('\CURLFile')) {
- curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
- } else {
- if (defined('CURLOPT_SAFE_UPLOAD')) {
- curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
- }
- }
- curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
- } else {
- $header = array("content-type: application/x-www-form-urlencoded; charset=UTF-8");
- curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
- curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString, 0, -1));
- }
- }
- $reponse = curl_exec($ch);
-
- if (curl_errno($ch)) {
- throw new \Exception(curl_error($ch), 0);
- } else {
- $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- if (200 !== $httpStatusCode) {
- throw new \Exception($reponse, $httpStatusCode);
- }
- }
- curl_close($ch);
- return $reponse;
- }
-
- /**
- * Author:Steven
- * Desc:
- * @param $url
- * @param null $postFields
- * @param null $fileFields
- * @return mixed
- * @throws Exception
- */
- public function curl_with_memory_file($url, $postFields = null, $fileFields = null)
- {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_FAILONERROR, false);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- if ($this->readTimeout) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);
- }
- if ($this->connectTimeout) {
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
- }
- curl_setopt($ch, CURLOPT_USERAGENT, "top-sdk-php");
- //https 请求
- if (strlen($url) > 5 && strtolower(substr($url, 0, 5)) == "https") {
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
- }
- //生成分隔符
- $delimiter = '-------------' . uniqid();
- //先将post的普通数据生成主体字符串
- $data = '';
- if ($postFields != null) {
- foreach ($postFields as $name => $content) {
- $data .= "--" . $delimiter . "\r\n";
- $data .= 'Content-Disposition: form-data; name="' . $name . '"';
- //multipart/form-data 不需要urlencode,参见 http:stackoverflow.com/questions/6603928/should-i-url-encode-post-data
- $data .= "\r\n\r\n" . $content . "\r\n";
- }
- unset($name, $content);
- }
-
- //将上传的文件生成主体字符串
- if ($fileFields != null) {
- foreach ($fileFields as $name => $file) {
- $data .= "--" . $delimiter . "\r\n";
- $data .= 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $file['name'] . "\" \r\n";
- $data .= 'Content-Type: ' . $file['type'] . "\r\n\r\n";//多了个文档类型
-
- $data .= $file['content'] . "\r\n";
- }
- unset($name, $file);
- }
- //主体结束的分隔符
- $data .= "--" . $delimiter . "--";
-
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
- 'Content-Type: multipart/form-data; boundary=' . $delimiter,
- 'Content-Length: ' . strlen($data))
- );
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
-
- $reponse = curl_exec($ch);
- unset($data);
-
- if (curl_errno($ch)) {
- throw new \Exception(curl_error($ch), 0);
- } else {
- $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- if (200 !== $httpStatusCode) {
- throw new \Exception($reponse, $httpStatusCode);
- }
- }
- curl_close($ch);
- return $reponse;
- }
-
- /**
- * Author:Steven
- * Desc:通讯错误日志
- * @param $apiName
- * @param $requestUrl
- * @param $errorCode
- * @param $responseTxt
- */
- protected function logCommunicationError($apiName, $requestUrl, $errorCode, $responseTxt)
- {
- $localIp = isset($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_ADDR"] : "CLI";
- $logger = new TopLogger;
- $logger->conf["separator"] = "^_^";
- $logData = array(
- date("Y-m-d H:i:s"),
- $apiName,
- $this->appkey,
- $localIp,
- PHP_OS,
- $this->sdkVersion,
- $requestUrl,
- $errorCode,
- str_replace("\n", "", $responseTxt)
- );
- $logger->log($logData);
- }
-
- public function checkExpireTime()
- {
- $second1 = strtotime($this->sessionUpdateTime);
- $second2 = time();
- if ($second1 < $second2) {
- $tmp = $second2;
- $second2 = $second1;
- $second1 = $tmp;
- }
- return ($second1 - $second2) / 86400;
- }
- }
|