|
|
<?php
|
|
|
/* PHP SDK
|
|
|
* @version 2.0.0
|
|
|
* @author connect@qq.com
|
|
|
* @copyright © 2013, Tencent Corporation. All rights reserved.
|
|
|
*/
|
|
|
require_once(QC_CLASS_PATH.'Oauth.class.php');
|
|
|
|
|
|
/*
|
|
|
* @brief QC类,api外部对象,调用接口全部依赖于此对象
|
|
|
* */
|
|
|
class QC extends Oauth{
|
|
|
private $kesArr, $APIMap;
|
|
|
|
|
|
/**
|
|
|
* _construct
|
|
|
*
|
|
|
* 构造方法
|
|
|
* @access public
|
|
|
* @since 5
|
|
|
* @param string $access_token access_token value
|
|
|
* @param string $openid openid value
|
|
|
* @return Object QC
|
|
|
*/
|
|
|
public function __construct($access_token = "", $openid = ""){
|
|
|
parent::__construct();
|
|
|
|
|
|
//如果access_token和openid为空,则从session里去取,适用于demo展示情形
|
|
|
if($access_token === "" || $openid === ""){
|
|
|
$this->keysArr = array(
|
|
|
"oauth_consumer_key" => (int)$this->recorder->readInc("appid"),
|
|
|
"access_token" => $this->recorder->read("access_token"),
|
|
|
"openid" => $this->recorder->read("openid")
|
|
|
);
|
|
|
}else{
|
|
|
$this->keysArr = array(
|
|
|
"oauth_consumer_key" => (int)$this->recorder->readInc("appid"),
|
|
|
"access_token" => $access_token,
|
|
|
"openid" => $openid
|
|
|
);
|
|
|
}
|
|
|
|
|
|
//初始化APIMap
|
|
|
/*
|
|
|
* 加#表示非必须,无则不传入url(url中不会出现该参数), "key" => "val" 表示key如果没有定义则使用默认值val
|
|
|
* 规则 array( baseUrl, argListArr, method)
|
|
|
*/
|
|
|
$this->APIMap = array(
|
|
|
|
|
|
|
|
|
/* qzone */
|
|
|
"add_blog" => array(
|
|
|
"https://graph.qq.com/blog/add_one_blog",
|
|
|
array("title", "format" => "json", "content" => null),
|
|
|
"POST"
|
|
|
),
|
|
|
"add_topic" => array(
|
|
|
"https://graph.qq.com/shuoshuo/add_topic",
|
|
|
array("richtype","richval","con","#lbs_nm","#lbs_x","#lbs_y","format" => "json", "#third_source"),
|
|
|
"POST"
|
|
|
),
|
|
|
"get_user_info" => array(
|
|
|
"https://graph.qq.com/user/get_user_info",
|
|
|
array("format" => "json"),
|
|
|
"GET"
|
|
|
),
|
|
|
"add_one_blog" => array(
|
|
|
"https://graph.qq.com/blog/add_one_blog",
|
|
|
array("title", "content", "format" => "json"),
|
|
|
"GET"
|
|
|
),
|
|
|
"add_album" => array(
|
|
|
"https://graph.qq.com/photo/add_album",
|
|
|
array("albumname", "#albumdesc", "#priv", "format" => "json"),
|
|
|
"POST"
|
|
|
),
|
|
|
"upload_pic" => array(
|
|
|
"https://graph.qq.com/photo/upload_pic",
|
|
|
array("picture", "#photodesc", "#title", "#albumid", "#mobile", "#x", "#y", "#needfeed", "#successnum", "#picnum", "format" => "json"),
|
|
|
"POST"
|
|
|
),
|
|
|
"list_album" => array(
|
|
|
"https://graph.qq.com/photo/list_album",
|
|
|
array("format" => "json")
|
|
|
),
|
|
|
"add_share" => array(
|
|
|
"https://graph.qq.com/share/add_share",
|
|
|
array("title", "url", "#comment","#summary","#images","format" => "json","#type","#playurl","#nswb","site","fromurl"),
|
|
|
"POST"
|
|
|
),
|
|
|
"check_page_fans" => array(
|
|
|
"https://graph.qq.com/user/check_page_fans",
|
|
|
array("page_id" => "314416946","format" => "json")
|
|
|
),
|
|
|
/* wblog */
|
|
|
|
|
|
"add_t" => array(
|
|
|
"https://graph.qq.com/t/add_t",
|
|
|
array("format" => "json", "content","#clientip","#longitude","#compatibleflag"),
|
|
|
"POST"
|
|
|
),
|
|
|
"add_pic_t" => array(
|
|
|
"https://graph.qq.com/t/add_pic_t",
|
|
|
array("content", "pic", "format" => "json", "#clientip", "#longitude", "#latitude", "#syncflag", "#compatiblefalg"),
|
|
|
"POST"
|
|
|
),
|
|
|
"del_t" => array(
|
|
|
"https://graph.qq.com/t/del_t",
|
|
|
array("id", "format" => "json"),
|
|
|
"POST"
|
|
|
),
|
|
|
"get_repost_list" => array(
|
|
|
"https://graph.qq.com/t/get_repost_list",
|
|
|
array("flag", "rootid", "pageflag", "pagetime", "reqnum", "twitterid", "format" => "json")
|
|
|
),
|
|
|
"get_info" => array(
|
|
|
"https://graph.qq.com/user/get_info",
|
|
|
array("format" => "json")
|
|
|
),
|
|
|
"get_other_info" => array(
|
|
|
"https://graph.qq.com/user/get_other_info",
|
|
|
array("format" => "json", "#name", "fopenid")
|
|
|
),
|
|
|
"get_fanslist" => array(
|
|
|
"https://graph.qq.com/relation/get_fanslist",
|
|
|
array("format" => "json", "reqnum", "startindex", "#mode", "#install", "#sex")
|
|
|
),
|
|
|
"get_idollist" => array(
|
|
|
"https://graph.qq.com/relation/get_idollist",
|
|
|
array("format" => "json", "reqnum", "startindex", "#mode", "#install")
|
|
|
),
|
|
|
"add_idol" => array(
|
|
|
"https://graph.qq.com/relation/add_idol",
|
|
|
array("format" => "json", "#name-1", "#fopenids-1"),
|
|
|
"POST"
|
|
|
),
|
|
|
"del_idol" => array(
|
|
|
"https://graph.qq.com/relation/del_idol",
|
|
|
array("format" => "json", "#name-1", "#fopenid-1"),
|
|
|
"POST"
|
|
|
),
|
|
|
/* pay */
|
|
|
|
|
|
"get_tenpay_addr" => array(
|
|
|
"https://graph.qq.com/cft_info/get_tenpay_addr",
|
|
|
array("ver" => 1,"limit" => 5,"offset" => 0,"format" => "json")
|
|
|
)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
//调用相应api
|
|
|
private function _applyAPI($arr, $argsList, $baseUrl, $method){
|
|
|
$pre = "#";
|
|
|
$keysArr = $this->keysArr;
|
|
|
|
|
|
$optionArgList = array();//一些多项选填参数必选一的情形
|
|
|
foreach($argsList as $key => $val){
|
|
|
$tmpKey = $key;
|
|
|
$tmpVal = $val;
|
|
|
|
|
|
if(!is_string($key)){
|
|
|
$tmpKey = $val;
|
|
|
|
|
|
if(strpos($val,$pre) === 0){
|
|
|
$tmpVal = $pre;
|
|
|
$tmpKey = substr($tmpKey,1);
|
|
|
if(preg_match("/-(\d$)/", $tmpKey, $res)){
|
|
|
$tmpKey = str_replace($res[0], "", $tmpKey);
|
|
|
$optionArgList[$res[1]][] = $tmpKey;
|
|
|
}
|
|
|
}else{
|
|
|
$tmpVal = null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//-----如果没有设置相应的参数
|
|
|
if(!isset($arr[$tmpKey]) || $arr[$tmpKey] === ""){
|
|
|
|
|
|
if($tmpVal == $pre){//则使用默认的值
|
|
|
continue;
|
|
|
}else if($tmpVal){
|
|
|
$arr[$tmpKey] = $tmpVal;
|
|
|
}else{
|
|
|
if($v = $_FILES[$tmpKey]){
|
|
|
|
|
|
$filename = dirname($v['tmp_name'])."/".$v['name'];
|
|
|
move_uploaded_file($v['tmp_name'], $filename);
|
|
|
$arr[$tmpKey] = "@$filename";
|
|
|
|
|
|
}else{
|
|
|
$this->error->showError("api调用参数错误","未传入参数$tmpKey");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$keysArr[$tmpKey] = $arr[$tmpKey];
|
|
|
}
|
|
|
//检查选填参数必填一的情形
|
|
|
foreach($optionArgList as $val){
|
|
|
$n = 0;
|
|
|
foreach($val as $v){
|
|
|
if(in_array($v, array_keys($keysArr))){
|
|
|
$n ++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(! $n){
|
|
|
$str = implode(",",$val);
|
|
|
$this->error->showError("api调用参数错误",$str."必填一个");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if($method == "POST"){
|
|
|
if($baseUrl == "https://graph.qq.com/blog/add_one_blog") $response = $this->urlUtils->post($baseUrl, $keysArr, 1);
|
|
|
else $response = $this->urlUtils->post($baseUrl, $keysArr, 0);
|
|
|
}else if($method == "GET"){
|
|
|
$response = $this->urlUtils->get($baseUrl, $keysArr);
|
|
|
}
|
|
|
|
|
|
return $response;
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* _call
|
|
|
* 魔术方法,做api调用转发
|
|
|
* @param string $name 调用的方法名称
|
|
|
* @param array $arg 参数列表数组
|
|
|
* @since 5.0
|
|
|
* @return array 返加调用结果数组
|
|
|
*/
|
|
|
public function __call($name,$arg){
|
|
|
//如果APIMap不存在相应的api
|
|
|
if(empty($this->APIMap[$name])){
|
|
|
$this->error->showError("api调用名称错误","不存在的API: <span style='color:red;'>$name</span>");
|
|
|
}
|
|
|
|
|
|
//从APIMap获取api相应参数
|
|
|
$baseUrl = $this->APIMap[$name][0];
|
|
|
$argsList = $this->APIMap[$name][1];
|
|
|
$method = isset($this->APIMap[$name][2]) ? $this->APIMap[$name][2] : "GET";
|
|
|
|
|
|
if(empty($arg)){
|
|
|
$arg[0] = null;
|
|
|
}
|
|
|
|
|
|
//对于get_tenpay_addr,特殊处理,php json_decode对\xA312此类字符支持不好
|
|
|
if($name != "get_tenpay_addr"){
|
|
|
$response = json_decode($this->_applyAPI($arg[0], $argsList, $baseUrl, $method));
|
|
|
$responseArr = $this->objToArr($response);
|
|
|
}else{
|
|
|
$responseArr = $this->simple_json_parser($this->_applyAPI($arg[0], $argsList, $baseUrl, $method));
|
|
|
}
|
|
|
|
|
|
// 根据业务需求,返回结果
|
|
|
//检查返回ret判断api是否成功调用
|
|
|
// if($responseArr['ret'] == 0){
|
|
|
// return $responseArr;
|
|
|
// }else{
|
|
|
// $this->error->showError($response->ret, $response->msg);
|
|
|
// }
|
|
|
|
|
|
return $responseArr;
|
|
|
}
|
|
|
|
|
|
//php 对象到数组转换
|
|
|
private function objToArr($obj){
|
|
|
if(!is_object($obj) && !is_array($obj)) {
|
|
|
return $obj;
|
|
|
}
|
|
|
$arr = array();
|
|
|
foreach($obj as $k => $v){
|
|
|
$arr[$k] = $this->objToArr($v);
|
|
|
}
|
|
|
return $arr;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* get_access_token
|
|
|
* 获得access_token
|
|
|
* @param void
|
|
|
* @since 5.0
|
|
|
* @return string 返加access_token
|
|
|
*/
|
|
|
public function get_access_token(){
|
|
|
return $this->recorder->read("access_token");
|
|
|
}
|
|
|
|
|
|
//简单实现json到php数组转换功能
|
|
|
private function simple_json_parser($json){
|
|
|
$json = str_replace("{","",str_replace("}","", $json));
|
|
|
$jsonValue = explode(",", $json);
|
|
|
$arr = array();
|
|
|
foreach($jsonValue as $v){
|
|
|
$jValue = explode(":", $v);
|
|
|
$arr[str_replace('"',"", $jValue[0])] = (str_replace('"', "", $jValue[1]));
|
|
|
}
|
|
|
return $arr;
|
|
|
}
|
|
|
} |
...
|
...
|
|