appId = $appId; $this->appSecret = $appSecret; } public function suona($url, $pay_money, $device_id, $msg_type) { $params = json_encode([ 'device_ids' => [$device_id], 'msg_type' => $msg_type, 'param1' => $pay_money, ]); \Yii::info('云喇叭请求:'.$params); $response = $this->curl_post($params, $this->generateHeader(), $url); \Yii::info('云喇叭响应:'.json_encode($response)); return ['params' => $params, 'response' => is_array($response) ? $response : json_decode($response, true)]; } //curl header封装 public function generateHeader() { $millisecond = $this->getMillisecond();//为服务端时间前后5分钟内可以访问 $nonceStr = $this->getNonceStr(16);//10到50位字符串 return [ 'appId:' . $this->appId, 'signature:' . $this->getSignature($this->appId, $this->appSecret, $nonceStr, $millisecond), 'nonceStr:' . $nonceStr, 'timestamp:' . $millisecond, 'Content-Type:application/json', ]; } //计算请求签名值 private function getSignature($appId, $appSecret, $nonceStr, $millisecond) { $s = $appId . '_' . $appSecret . '_' . $nonceStr . '_' . $millisecond; return strtoupper(md5($s)); } //模拟发送POST请求 /** * 模拟发送POST 方式请求 * @param $url * @param $data * @param $projectId * @param $signature * @return array */ // public function http_post_data($data, $header, $url) // { // $ch = curl_init(); // curl_setopt($ch, CURLOPT_POST, 1); // curl_setopt($ch, CURLOPT_URL, $url); // curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // ob_start(); // curl_exec($ch); // $return_content = ob_get_contents(); // ob_end_clean(); // $return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // return array($return_code, $return_content); // } public function curl_post($postdata = '', $header = '', $url, $options = array()) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); if (!empty($options)) { curl_setopt_array($ch, $options); } $data = curl_exec($ch); curl_close($ch); return $data; } /** * * 产生随机字符串,不长于50位 * @param int $length * @return string */ private function getNonceStr($length = 50) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } //获取当前时间戳(毫秒级) private function getMillisecond() { list($s1, $s2) = explode(' ', microtime()); return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000); } }