使用 Zephir 開發的微信集合框架,可以輕鬆的集成到你的 PHP 中。通過了簡單的測試。php
固然還有不少功能沒有完善和實現,以及文檔的欠缺,我會抽取時間一點一點的完善。mysql
安裝環境依賴git
#Ubuntu sudo apt-get install php5-dev php5-mysql gcc libpcre3-dev #Fedora sudo yum install php-devel php-mysqlnd gcc libtool #RHEL sudo yum install php-devel php-mysql gcc libtool #Suse yast2 -i php5-pear php5-devel php5-mysql gcc
安裝github
git clone https://git.coding.net/widuu/wechat.git cd wechat/ext && ./install
如今直編譯了php5.6和php5.5版本,能夠點擊下邊的地址下載。sql
git checkout -b my-new-feature
)git commit -am 'Added some feature'
)git push origin my-new-feature
)my-new-feature
分支下發起 Pull RequestEmail: admin#widuu.com <#換成@>
Blog:http://www.widuu.com
WeiBo:http://weibo.com/widuujson
wechat.zepapi
namespace Wechat; class Wechat extends Wechatabstract{ /** * 發送者id */ protected _tousername { get,set }; /** * wechat id */ protected _fromusername { get,set }; /** * 事件類型 */ protected _msgtype { get,set }; /** * 事件 */ protected _event { get,set }; /** * 建立時間 */ protected _createtime { get,set }; /** * 文本消息內容 */ protected _content { get,set }; /** * 消息id */ protected _msgid { get,set }; /** * 圖片連接 */ protected _picurl { get,set }; /** * 媒體id */ protected _mediaid { get,set }; /** * 語音格式 */ protected _format { get,set }; /** * 縮略圖的媒體id */ protected _thumbmediaid { get,set }; /** * 地理位置維度 */ protected _location_x { get,set }; /** * 地理位置經度 */ protected _location_y { get,set }; /** * 地圖縮放大小 */ protected _scale { get,set }; /** * 地理位置信息 */ protected _label { get,set }; /** * 消息標題 */ protected _title { get,set }; /** * 消息描述 */ protected _description { get,set }; /** * 消息連接 */ protected _url { get,set }; /** * TOKEN URL */ const TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?"; /** * User URL */ const USER_URL = "https://api.weixin.qq.com/cgi-bin/user/"; /** * Menu URL */ const MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/"; /** * 接收 POST 信息 * @author widuu <admin@widuu.com> */ public function getRequest(){ if this->isPost() { var key,value; let this->_request_data = this->getInfo(true); if this->_debug { if empty this->_request_data{ this->log("[ERROR".date("Y-m-d H:i:s",time())."] Request Data NULL\r\n"); } }; if !empty this->_request_data{ for key,value in this->_request_data { let key = "_".strtolower(key); if isset this->{key} { let this->{key} = value; } } return this->_request_data; } }else{ return false; } } /** * 返回消息方法 * @param string type * @param (array|string) type * @return boolean * @author widuu <admin@widuu.com> */ public function response(string! type=null,info){ if empty this->_request_data { return false; } var tpl; let tpl = this->getTpl(type,info); if this->_debug { if empty tpl{ this->log("[ERROR".date("Y-m-d H:i:s",time())."] Get Response XML Type Error\r\n"); } }; echo tpl; } /** * 訂閱事件 * @author widuu <admin@widuu.com> */ public function subscribe(string! type="text", info){ if empty this->_request_data { return false; } if(this->_event == "subscribe"){ this->response(type,info); return; } } /** * 獲取Token * @param string appid * @param string secret * @return array * @author widuu <admin@widuu.com> */ public function getToken(string! appid="",string! secret=""){ if (empty appid || empty secret) { throw new Exception("getToken Method Parameter does not allow nulls",4001); }; var tokenUrl,urlQurey,result; let urlQurey = ["grant_type":"client_credential","appid":appid,"secret":secret]; let tokenUrl = Wechat::TOKEN_URL.http_build_query(urlQurey); let result = this->httpGet(tokenUrl); return json_decode(result,true); } /** * 獲取用戶信息 * @param string type * @param string token * @param string openid * @return array * @author widuu <admin@widuu.com> */ public function getUser(string! type=null,string! token="",string openid=""){ if empty token || empty type { throw new Exception("Parameter does not allow nulls",4002); } var url,param,result; switch(type){ case "userinfo" : let param = ["access_token":token,"openid":openid,"lang":"zh_CN"]; let url = Wechat::USER_URL."info?".http_build_query(param); let result = this->httpGet(url); break; case "userlist" : let param = ["access_token":token,"next_openid":openid]; let url = Wechat::USER_URL."get?".http_build_query(param); let result = this->httpGet(url); break; default: return false; } return json_decode(result,true); } /** * 設置用戶備註 * @param string token * @param string openid * @param string remarke * @return array * @author widuu <admin@widuu.com> */ public function setRemark(string! token=null,string! openid=null,string! remarke=null)->boolean{ var remarkUrl,postInfo,result; let remarkUrl = Wechat::USER_URL."info/updateremark?access_token=".token; let postInfo = ["openid":openid,"remark":remarke]; let result = this->httpPost(remarkUrl,postInfo); if !result { return false; } return json_decode(result,true); } /** * 獲取自定義菜單 * @author widuu <admin@widuu.com> */ public function Menu(string!type = null,string! token =null,array info = null){ var menu_url,result; switch(type){ case "get": let menu_url = Wechat::MENU_URL."get?access_token=".token; let result = this->httpGet(menu_url); break; case "delete": let menu_url = Wechat::MENU_URL."delete?access_token=".token; let result = this->httpGet(menu_url); break; case "create": if typeof info != "array" || empty info { throw new Exception("create param error",4005); } let menu_url = Wechat::MENU_URL."create?access_token=".token; let result = this->httpPost(menu_url,info); default : return false; } if !empty result{ return json_decode(result,true); }else{ throw new Exception("Response Error",4003); } } /** * 獲取變量的方法 * @param string name * @return boolean | string * @author widuu <admin@widuu.com> */ public function _get(string! name){ let name = "_".name; if isset this->{name} { return this->{name}; } return false; } /** * 設置變量的方法 * @param string name * @param value * @return boolean * @author widuu <admin@widuu.com> */ public function _set(string! name,value) ->boolean{ let name = "_".name; if isset this->{name} { let this->{name} = value; return true; } return false; } /** * 設置變量的方法 * @param string name * @param value * @return boolean * @author widuu <admin@widuu.com> */ protected function getTpl(string! type=null,info){ //組織 xml var tpl; let tpl = "<xml><ToUserName><![CDATA[".this->_fromusername."]]></ToUserName><FromUserName><![CDATA[".this->_tousername."]]></FromUserName><CreateTime>".time()."</CreateTime><MsgType><![CDATA[".type."]]></MsgType>"; switch (type){ case "text": let tpl .= "<Content><![CDATA[".info."]]></Content>"; break; case "image": let tpl .= "<Image><MediaId><![CDATA[".info."]]></MediaId></Image>"; break; case "voice": let tpl .= "<Voice><MediaId><![CDATA[".info."]]></MediaId></Voice>"; break; case "video": let tpl .= "<Video><MediaId><![CDATA[".info."]]></MediaId><Title><![CDATA[title]]></Title><Description><![CDATA[description]]></Description></Video> "; break; case "music": if typeof info != "array"{ return false; } let tpl .= "<Music><Title><![CDATA[".info["title"]."]]></Title><Description><![CDATA[".info["description"]."]]></Description><MusicUrl><![CDATA[".info["musicurl"]."]]></MusicUrl><HQMusicUrl><![CDATA[".info["hqmusicurl"]."]]></HQMusicUrl><ThumbMediaId><![CDATA[".info["mediaid"]."]]></ThumbMediaId></Music>"; break; case "news" : if typeof info != "array"{ return false; } var num; if isset info["title"] { let num = 1; }else{ let num = count(info); } let tpl .= "<ArticleCount>".num."</ArticleCount><Articles>".this->getNews(info)."</Articles>"; break; default : return false; } let tpl.= "</xml>"; return tpl; } /** * 判斷請求方法 * @author widuu <admin@widuu.com> */ private function isPost() -> boolean { if strtolower(_SERVER["REQUEST_METHOD"]) == "post" { return true; } return false; } /** * 獲取新聞 * @author widuu <admin@widuu.com> */ private function getNews(array! info){ var value,tpl = ""; if isset info["title"] { let tpl.="<item><Title><![CDATA[".info["title"]."]]></Title><Description><![CDATA[".info["description"]."]]></Description><PicUrl><![CDATA[".info["picurl"]."]]></PicUrl><Url><![CDATA[".info["url"]."]]></Url></item>"; }else{ for _,value in info { let tpl.="<item><Title><![CDATA[".value["title"]."]]></Title><Description><![CDATA[".value["description"]."]]></Description><PicUrl><![CDATA[".value["picurl"]."]]></PicUrl><Url><![CDATA[".value["url"]."]]></Url></item>"; } } return tpl; } /** * 微信驗證 * @author widuu <admin@widuu.com> */ static public function valid(string! token = null){ var signature,timestamp,nonce,tmpArr,tmpStr,echoStr; let signature = _GET["signature"]; let timestamp = _GET["timestamp"]; let nonce = _GET["nonce"]; let echoStr = _GET["echostr"]; let tmpArr = [ token, timestamp, nonce ]; sort(tmpArr, SORT_STRING); let tmpStr = implode( "", tmpArr ); let tmpStr = sha1( tmpStr ); if tmpStr == signature { echo echoStr; }else{ return false; } } /** * 設置URL過時時間 * @author widuu <admin@widuu.com> */ public static function setTimeout(int! timeout = 1){ globals_set("curl_timeout", timeout); return true; } /** * HTTP GET 方法 * @param string url * @author widuu <admin@widuu.com> */ protected function httpGet(string! url="") { var curlHandle, content,timeout ; let timeout = globals_get("curl_timeout"); let curlHandle = curl_init(); curl_setopt( curlHandle , CURLOPT_URL, url ); curl_setopt( curlHandle , CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( curlHandle , CURLOPT_SSL_VERIFYPEER, false); curl_setopt( curlHandle , CURLOPT_SSL_VERIFYHOST, false); curl_setopt( curlHandle , CURLOPT_TIMEOUT, timeout ); let content = curl_exec( curlHandle ); curl_close( curlHandle ); return content; } /** * HTTP POST 方法 * @param string url * @param array info * @author widuu <admin@widuu.com> */ protected function httpPost(string! url=null ,array info){ var curlHandle, content,timeout ; if typeof info != "array"{ throw new Exception("infomation must be type array",4004); } let timeout = globals_get("curl_timeout"); let curlHandle = curl_init( url ); curl_setopt(curlHandle, CURLOPT_HEADER, 0); curl_setopt(curlHandle, CURLOPT_RETURNTRANSFER, 1); curl_setopt(curlHandle, CURLOPT_POST, 1); curl_setopt(curlHandle, CURLOPT_POSTFIELDS, json_encode(info,JSON_UNESCAPED_UNICODE)); curl_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, false); curl_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, false); curl_setopt(curlHandle ,CURLOPT_TIMEOUT, timeout ); let content = curl_exec( curlHandle ); curl_close( curlHandle ); return content; }