微信公衆平臺php開發包,細化各項接口操做,支持鏈式調用,歡迎Fork此項目
weixin developer SDK. 項目地址:https://github.com/dodgepudding/wechat-php-sdk
項目blog:http://binsee.github.io/wechat-php-sdkjavascript
使用前需先打開微信賬號的開發模式,詳細步驟請查看微信公衆平臺接口使用說明:
微信公衆平臺: http://mp.weixin.qq.com/wiki/ 微信企業平臺: http://qydev.weixin.qq.com/wiki/php
微信支付接入文檔: https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CNhtml
微信多客服:http://dkf.qq.comjava
wechat.class.php 官方API類庫
qywechat.class.php 企業號API類庫
errCode.php|qyerrCode.php 全局返回碼類
old_version/wechatpay.class.php 舊版微信支付V2接口類庫old_version/wechatext.class.php 非官方擴展API(中止維護)old_version/wechatauth.class.php 受權登錄(中止維護)old_version/wechat.js 內嵌JS(已廢棄)
爲開發框架進行適配
調用示例git
調用官方API,具備更靈活的消息分類響應方式,支持鏈式調用操做 ;github
$options = array( 'token'=>'tokenaccesskey', //填寫你設定的key 'encodingaeskey'=>'encodingaeskey', //填寫加密用的EncodingAESKey 'appid'=>'wxdk1234567890', //填寫高級調用功能的app id, 請在微信開發模式後臺查詢 'appsecret'=>'xxxxxxxxxxxxxxxxxxx' //填寫高級調用功能的密鑰 ); $weObj = new Wechat($options); //建立實例對象 //TODO:調用$weObj各實例方法
scancode_push
或scancode_waitmsg
返回數組array ('ScanType'=>'qrcode','ScanResult'=>'123123')pic_sysphoto
或pic_photo_or_album
或pic_weixin
數組結構見php文件內方法說明location_select
數組結構見php文件內方法說明////消息類型,使用實例調用getRevType()方法取得 const MSGTYPE_TEXT = 'text'; const MSGTYPE_IMAGE = 'image'; const MSGTYPE_LOCATION = 'location'; const MSGTYPE_LINK = 'link'; const MSGTYPE_EVENT = 'event'; const MSGTYPE_MUSIC = 'music'; const MSGTYPE_NEWS = 'news'; const MSGTYPE_VOICE = 'voice'; const MSGTYPE_VIDEO = 'video'; ////事件類型,使用實例調用getRevEvent()方法取得 const EVENT_SUBSCRIBE = 'subscribe'; //訂閱 const EVENT_UNSUBSCRIBE = 'unsubscribe'; //取消訂閱 const EVENT_SCAN = 'SCAN'; //掃描帶參數二維碼 const EVENT_LOCATION = 'LOCATION'; //上報地理位置 const EVENT_MENU_VIEW = 'VIEW'; //菜單 - 點擊菜單跳轉連接 const EVENT_MENU_CLICK = 'CLICK'; //菜單 - 點擊菜單拉取消息 const EVENT_MENU_SCAN_PUSH = 'scancode_push'; //菜單 - 掃碼推事件(客戶端跳URL) const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜單 - 掃碼推事件(客戶端不跳URL) const EVENT_MENU_PIC_SYS = 'pic_sysphoto'; //菜單 - 彈出系統拍照發圖 const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album'; //菜單 - 彈出拍照或者相冊發圖 const EVENT_MENU_PIC_WEIXIN = 'pic_weixin'; //菜單 - 彈出微信相冊發圖器 const EVENT_MENU_LOCATION = 'location_select'; //菜單 - 彈出地理位置選擇器 const EVENT_SEND_MASS = 'MASSSENDJOBFINISH'; //發送結果 - 高級羣發完成 const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//發送結果 - 模板消息發送結果 const EVENT_KF_SEESION_CREATE = 'kfcreatesession'; //多客服 - 接入會話 const EVENT_KF_SEESION_CLOSE = 'kfclosesession'; //多客服 - 關閉會話 const EVENT_KF_SEESION_SWITCH = 'kfswitchsession'; //多客服 - 轉接會話 const EVENT_CARD_PASS = 'card_pass_check'; //卡券 - 審覈經過 const EVENT_CARD_NOTPASS = 'card_not_pass_check'; //卡券 - 審覈未經過 const EVENT_CARD_USER_GET = 'user_get_card'; //卡券 - 用戶領取卡券 const EVENT_CARD_USER_DEL = 'user_del_card'; //卡券 - 用戶刪除卡券
getDatacube($type,$subtype,$begin_date,$end_date='') 獲取統計數據 參數需注意$type與$subtype的定義ajax
獲取統計數據方法 參數定義json
數據分類 $type值(字符串) 數據子分類 $subtype值(字符串) 時間跨度(天) 用戶分析 'user' 獲取用戶增減數據 'summary' 7 用戶分析 'user' 獲取累計用戶數據 'cumulate' 7 圖文分析 'article' 獲取圖文羣發每日數據 'summary' 1 圖文分析 'article' 獲取圖文羣發總數據 'total' 1 圖文分析 'article' 獲取圖文統計數據 'read' 3 圖文分析 'article' 獲取圖文統計分時數據 'readhour' 1 圖文分析 'article' 獲取圖文分享轉發數據 'share' 7 圖文分析 'article' 獲取圖文分享轉發分時數據 'sharehour' 1 消息分析 'upstreammsg' 獲取消息發送概況數據 'summary' 7 消息分析 'upstreammsg' 獲取消息分送分時數據 'hour' 1 消息分析 'upstreammsg' 獲取消息發送週數據 'week' 30 消息分析 'upstreammsg' 獲取消息發送月數據 'month' 30 消息分析 'upstreammsg' 獲取消息發送分佈數據 'dist' 15 消息分析 'upstreammsg' 獲取消息發送分佈週數據 'distweek' 30 消息分析 'upstreammsg' 獲取消息發送分佈月數據 'distmonth' 30 接口分析 'interface' 獲取接口分析數據 'summary' 30 接口分析 'interface' 獲取接口分析分時數據 'summaryhour' 1 須要注意
begin_date
和end_date
的差值需小於「最大時間跨度」(好比最大時間跨度爲1時,begin_date
和end_date
的差值只能爲0,才能小於1)api
此擴展類庫已經再也不更新,緣由是官方對公衆號開放了衆多接口,此類庫繼續維護的意義不大
非官方擴展API,須要配置公衆平臺帳戶和密碼,能實現對已關注用戶的點對點微信,此方式不保證長期有效。
類方法裏說起的用戶id在接口返回結構裏表述爲FakeId, 屬同一律念, 在下面wechatauth類裏則表示爲Uin, 用戶id對應的微信號必須經過getInfo()方法經過返回數組的Username值獲取, 但非關注關係用戶資料不能獲取.
調用下列方法前必須通過login()方法和checkValid()驗證方法才能得到調用權限. 有的帳戶沒法經過登錄可能由於要求提供驗證碼, 能夠手動登錄後把獲取到的cookie寫進程序存放cookie的文件解決.
程序使用了通過修改的snoopy兼容式HTTP類方法, 在相似BAE/SAE雲服務器上可能不能正常運行, 由於雲服務的curl方法是通過重寫的, 某些header參數如網站來源參數不被支持.數組
此擴展類庫已經再也不更新,緣由是官方開放平臺對網站應用開放的有受權登錄接口,更標準,更好用。請查看:微信開放平臺
經過微信二維碼登錄微信的API, 能實現第三方網站同步登錄, 首先程序分別經過get_login_code和get_code_image方法獲取受權二維碼圖片, 而後利用微信手機客戶端掃描二維碼圖片後將自動跳出受權頁面, 用戶點擊受權後便可獲取對應的用戶資料和頭像信息. 詳細驗證步驟請看test3.php例子.
此JS腳本已經廢棄再也不更新,緣由是官方在微信6.0.2版本開放了全新的JSAPI接口,更全面好用。請查看:微信公衆平臺WIKI
javascript var dataForWeixin={ appId:"", MsgImg:"消息圖片路徑", TLImg:"時間線圖路徑", url:"分享url路徑", title:"標題", desc:"描述", fakeid:"", callback:function(){} };
當調用API接口失敗時,能夠用此類來獲取失敗緣由的中文說明。
注意:微信公衆號引用errCode.php
,企業號引用qyerrCode.php
。
include "errCode.php"; //或 qyerrCode.php $ret=ErrCode::getErrText(48001); //錯誤碼能夠經過公衆號類庫的公開變量errCode獲得 if ($ret) echo $ret; else echo "未找到對應的內容";
調用官方API,具備更靈活的消息分類響應方式,支持鏈式調用操做 ;
$options = array( 'token'=>'tokenaccesskey', //填寫應用接口的Token 'encodingaeskey'=>'encodingaeskey', //填寫加密用的EncodingAESKey 'appid'=>'wxdk1234567890', //填寫高級調用功能的app id 'appsecret'=>'xxxxxxxxxxxxxxxxxxx', //填寫高級調用功能的密鑰 'agentid'=>'1', //應用的id 'debug'=>false, //調試開關 '_logcallback'=>'logg', //調試輸出方法,須要有一個string類型的參數 ); $weObj = new Wechat($options); //建立實例對象 //TODO:調用$weObj各實例方法
scancode_push
或scancode_waitmsg
返回數組array ('ScanType'=>'qrcode','ScanResult'=>'123123')pic_sysphoto
或pic_photo_or_album
或pic_weixin
數組結構見php文件內方法說明location_select
數組結構見php文件內方法說明////消息類型,使用實例調用getRevType()方法取得 const MSGTYPE_TEXT = 'text'; const MSGTYPE_IMAGE = 'image'; const MSGTYPE_LOCATION = 'location'; const MSGTYPE_LINK = 'link'; //暫不支持 const MSGTYPE_EVENT = 'event'; const MSGTYPE_MUSIC = 'music'; //暫不支持 const MSGTYPE_NEWS = 'news'; const MSGTYPE_VOICE = 'voice'; const MSGTYPE_VIDEO = 'video'; ////事件類型,使用實例調用getRevEvent()方法取得 const EVENT_SUBSCRIBE = 'subscribe'; //訂閱 const EVENT_UNSUBSCRIBE = 'unsubscribe'; //取消訂閱 const EVENT_LOCATION = 'LOCATION'; //上報地理位置 const EVENT_ENTER_AGENT = 'enter_agent'; //用戶進入應用 const EVENT_MENU_VIEW = 'VIEW'; //菜單 - 點擊菜單跳轉連接 const EVENT_MENU_CLICK = 'CLICK'; //菜單 - 點擊菜單拉取消息 const EVENT_MENU_SCAN_PUSH = 'scancode_push'; //菜單 - 掃碼推事件(客戶端跳URL) const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜單 - 掃碼推事件(客戶端不跳URL) const EVENT_MENU_PIC_SYS = 'pic_sysphoto'; //菜單 - 彈出系統拍照發圖 const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album'; //菜單 - 彈出拍照或者相冊發圖 const EVENT_MENU_PIC_WEIXIN = 'pic_weixin'; //菜單 - 彈出微信相冊發圖器 const EVENT_MENU_LOCATION = 'location_select'; //菜單 - 彈出地理位置選擇器 const EVENT_SEND_MASS = 'MASSSENDJOBFINISH'; //發送結果 - 高級羣發完成 const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//發送結果 - 模板消息發送結果
$token
舊版微信支付類庫(微信支付V2),已移動至old_version目錄下。
自2014年8月開始申請到的微信支付都是V3接口,據官方說V2的會陸續升級爲V3接口,但時間及升級渠道未確認。
$options = array( 'appid'=>'wxdk1234567890', //填寫高級調用功能的app id, 請在微信開發模式後臺查詢 'appsecret'=>'xxxxxxxxxxxxxxxxxxx', //填寫高級調用功能的密鑰 'partnerid'=>'88888888', //財付通商戶身份標識,支付權限專用,沒有可不填 'partnerkey'=>'', //財付通商戶權限密鑰Key,支付權限專用 'paysignkey'=>'' //商戶簽名密鑰Key,支付權限專用 ); $weObj = new Wechat($options); //建立實例對象 //TODO:調用$weObj各實例方法
爲不一樣的開發框架進行適配緩存操做(保存access_token、jsapi_ticket),及輸出調試日誌。
因爲微信api須要緩存access_token與jsapi_ticket,而在不一樣框架下的緩存方式不一樣,因此原先在Wechat.class.php和QYWechat.class.php中緩存代碼作了TODO標誌。 須要各位在使用不一樣框架時再進行修改,但確實很麻煩,由於對結構進行了修改。
取消了原先同步維護的Thinkphp版本,爲Wechat類增長操做緩存3個重載方法
setCache
,getCache
,removeCache
,以及修改log
方法能夠重載。 分別來實如今不一樣開發框架下的設置緩存、讀取緩存、清除緩存、日誌輸出4個功能。
在不一樣的開發框架下使用Wechat類庫,請繼承Wechat類,根據須要實現這4個方法。
可參考Thinkphp版的TPWechat.class.php
爲不一樣框架進行適配。 歡迎提交其餘框架的適配文件到項目庫來。
爲Thinkphp進行適配的示例以下:
/** * 微信公衆平臺PHP-SDK, ThinkPHP實例 * @author dodgepudding@gmail.com * @link https://github.com/dodgepudding/wechat-php-sdk * @version 1.2 * usage: * $options = array( * 'token'=>'tokenaccesskey', //填寫你設定的key * 'encodingaeskey'=>'encodingaeskey', //填寫加密用的EncodingAESKey * 'appid'=>'wxdk1234567890', //填寫高級調用功能的app id * 'appsecret'=>'xxxxxxxxxxxxxxxxxxx' //填寫高級調用功能的密鑰 * ); * $weObj = new TPWechat($options); * $weObj->valid(); * ... * */ class TPWechat extends Wechat { /** * log overwrite * @see Wechat::log() */ protected function log($log){ if ($this->debug) { if (function_exists($this->logcallback)) { if (is_array($log)) $log = print_r($log,true); return call_user_func($this->logcallback,$log); }elseif (class_exists('Log')) { Log::write('wechat:'.$log, Log::DEBUG); } } return false; } /** * 重載設置緩存 * @param string $cachename * @param mixed $value * @param int $expired * @return boolean */ protected function setCache($cachename,$value,$expired){ return S($cachename,$value,$expired); } /** * 重載獲取緩存 * @param string $cachename * @return mixed */ protected function getCache($cachename){ return S($cachename); } /** * 重載清除緩存 * @param string $cachename * @return boolean */ protected function removeCache($cachename){ return S($cachename,null); } }
//test1.php include "wechat.class.php"; $options = array( 'token'=>'tokenaccesskey', //填寫你設定的key 'encodingaeskey'=>'encodingaeskey' //填寫加密用的EncodingAESKey,如接口爲明文模式可忽略 ); $weObj = new Wechat($options); $weObj->valid();//明文或兼容模式能夠在接口驗證經過後註釋此句,但加密模式必定不能註釋,不然會驗證失敗 $type = $weObj->getRev()->getRevType(); switch($type) { case Wechat::MSGTYPE_TEXT: $weObj->text("hello, I'm wechat")->reply(); exit; break; case Wechat::MSGTYPE_EVENT: break; case Wechat::MSGTYPE_IMAGE: break; default: $weObj->text("help info")->reply(); }
可參考test目錄下的qydemo.php
include "wechat.class.php"; $options = array( 'token'=>'9Ixxxxxxx', //填寫應用接口的Token 'encodingaeskey'=>'d4o9WVg8sxxxxxxxxxxxxxxxxxxxxxx',//填寫加密用的EncodingAESKey 'appid'=>'wxa07979baxxxxxxxx', //填寫高級調用功能的appid ); $weObj = new Wechat($options); $weObj->valid(); //注意, 企業號與普通公衆號不一樣,必須打開驗證,不要註釋掉 $type = $weObj->getRev()->getRevType(); switch($type) { case Wechat::MSGTYPE_TEXT: $weObj->text("hello, I'm wechat")->reply(); exit; break; case Wechat::MSGTYPE_EVENT: break; case Wechat::MSGTYPE_IMAGE: break; default: $weObj->text("help info")->reply(); }
// old_version/test/test2.php include "wechatext.class.php"; function logdebug($text){ file_put_contents('./data/log.txt',$text."\n",FILE_APPEND); }; $options = array( 'account'=>'demo@domain.com', 'password'=>'demo', 'datapath'=>'./data/cookie_', 'debug'=>true, 'logcallback'=>'logdebug' ); $wechat = new Wechatext($options); if ($wechat->checkValid()) { // 獲取用戶信息 $data = $wechat->getInfo('3974255'); var_dump($data); // 獲取最新一條消息 $topmsg = $wechat->getTopMsg(); var_dump($topmsg); // 主動回覆消息 if ($topmsg && $topmsg['has_reply']==0) $wechat->send($topmsg['fakeid'],'hi '.$topmsg['nick_name'].',rev:'.$topmsg['content']); }
// old_version/test/test3.php include "../wechatauth.class.php"; session_start(); $sid = session_id(); $options = array( 'account'=>$sid, 'datapath'=>'../data/cookiecode_', ); $wechat = new Wechatauth($options); if (isset($_POST['code'])) { $logincode = $_POST['code']; $vres = $wechat->set_login_code($logincode)->verify_code(); if ($vres===false) { $result = array('status'=>0); } else { $result = array('status'=>$vres); if ($vres==200) { $result['info'] = $wechat->get_login_info(); $result['cookie'] = $wechat->get_login_cookie(true); } } die(json_encode($result)); } $logincode = $wechat->get_login_code(); //獲取受權碼 $qrimg = $wechat->get_code_image(); //待輸出的二維碼圖片
HTML部分請看old_version/test/test3.php, 主要是定時ajax查詢是否已經受權成功
請看test/jsapi目錄