appid = $appid; $this->appkey = $appkey; } public function setServerName($server_name) { $this->server_name = $server_name; } public function setStatUrl($stat_url) { $this->stat_url = $stat_url; } public function setIsStat($is_stat) { $this->is_stat = $is_stat; } /** * 执行API调用,返回结果数组 * * @param array $script_name 调用的API方法 参考 http://wiki.open.qq.com/wiki/API_V3.0%E6%96%87%E6%A1%A3 * @param array $params 调用API时带的参数 * @param string $method 请求方法 post / get * @param string $protocol 协议类型 http / https * @return array 结果数组 */ public function api($script_name, $params, $method='post', $protocol='http') { // 检查 openid 是否为空 if (!isset($params['openid']) || empty($params['openid'])) { return array( 'ret' => OPENAPI_ERROR_REQUIRED_PARAMETER_EMPTY, 'msg' => 'openid is empty'); } // 检查 openkey 是否为空 if (!isset($params['openkey']) || empty($params['openkey'])) { return array( 'ret' => OPENAPI_ERROR_REQUIRED_PARAMETER_EMPTY, 'msg' => 'openkey is empty'); } // 检查 openid 是否合法 if (!self::isOpenId($params['openid'])) { return array( 'ret' => OPENAPI_ERROR_REQUIRED_PARAMETER_INVALID, 'msg' => 'openid is invalid'); } // 无需传sig, 会自动生成 unset($params['sig']); // 添加一些参数 $params['appid'] = $this->appid; $params['format'] = $this->format; // 生成签名 $secret = $this->appkey . '&'; $sig = SnsSigCheck::makeSig( $method, $script_name, $params, $secret); $params['sig'] = $sig; $url = $protocol . '://' . $this->server_name . $script_name; $cookie = array(); //记录接口调用开始时间 $start_time = SnsStat::getTime(); // 发起请求 $ret = SnsNetwork::makeRequest($url, $params, $cookie, $method, $protocol); if (false === $ret['result']) { $result_array = array( 'ret' => OPENAPI_ERROR_CURL + $ret['errno'], 'msg' => $ret['msg'], ); } $result_array = json_decode($ret['msg'], true); // 远程返回的不是 json 格式, 说明返回包有问题 if (is_null($result_array)) { $result_array = array( 'ret' => OPENAPI_ERROR_RESPONSE_DATA_INVALID, 'msg' => $ret['msg'] ); } // 统计上报 if ($this->is_stat) { $stat_params = array( 'appid' => $this->appid, 'pf' => $params['pf'], 'rc' => $result_array['ret'], 'svr_name' => $this->server_name, 'interface' => $script_name, 'protocol' => $protocol, 'method' => $method, ); SnsStat::statReport($this->stat_url, $start_time, $stat_params); } return $result_array; } /** * 检查 openid 的格式 * * @param string $openid openid * @return bool (true|false) */ private static function isOpenId($openid) { return (0 == preg_match('/^[0-9a-fA-F]{32}$/', $openid)) ? false : true; } } // end of script