***wechat-php-sdk微信公眾平臺php開發包

suboysugar發表於2016-12-20

wechat-php-sdk

微信公眾平臺php開發包,細化各項介面操作,支援鏈式呼叫,歡迎Fork此專案
weixin developer SDK. 專案地址:https://github.com/dodgepudding/wechat-php-sdk
專案blog:http://binsee.github.io/wechat-php-sdk

使用詳解

使用前需先開啟微信帳號的開發模式,詳細步驟請檢視微信公眾平臺介面使用說明:
微信公眾平臺: http://mp.weixin.qq.com/wiki/ 微信企業平臺: http://qydev.weixin.qq.com/wiki/

微信支付接入文件: https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN

微信多客服:http://dkf.qq.com

目錄

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(已廢棄)
為開發框架進行適配
呼叫示例


1. wechat.class.php 官方API類庫

呼叫官方API,具有更靈活的訊息分類響應方式,支援鏈式呼叫操作 ;

主要功能

  • 接入驗證 (初級許可權)
  • 自動回覆(文字、圖片、語音、視訊、音樂、圖文) (初級許可權)
  • 選單操作(查詢、建立、刪除) (選單許可權)
  • 客服訊息(文字、圖片、語音、視訊、音樂、圖文) (認證許可權)
  • 二維碼(建立臨時、永久二維碼,獲取二維碼URL) (服務號、認證許可權)
  • 長連結轉短連結介面 (服務號、認證許可權)
  • 分組操作(查詢、建立、修改、移動使用者到分組) (認證許可權)
  • 網頁授權(基本授權,使用者資訊授權) (服務號、認證許可權)
  • 使用者資訊(查詢使用者基本資訊、獲取關注者列表) (認證許可權)
  • 多客服功能(客服管理、獲取客服記錄、客服會話管理) (認證許可權)
  • 媒體檔案(上傳、獲取) (認證許可權)
  • 高階群發 (認證許可權)
  • 模板訊息(設定所屬行業、新增模板、傳送模板訊息) (服務號、認證許可權)
  • 卡券管理(建立、修改、刪除、發放、門店管理等) (認證許可權)
  • 語義理解 (服務號、認證許可權)
  • 獲取微信伺服器IP列表 (初級許可權)
  • 微信JSAPI授權(獲取ticket、獲取簽名) (初級許可權)
  • 資料統計(使用者、圖文、訊息、介面分析資料) (認證許可權)
    > 備註:
    > 初級許可權:基本許可權,任何正常的公眾號都有此許可權
    > 選單許可權:正常的服務號、認證後的訂閱號擁有此許可權
    > 認證許可權:分為訂閱號、服務號認證,如字首服務號則僅認證的服務號有此許可權,否則為認證後的訂閱號、服務號都有此許可權
    > 支付許可權:僅認證後的服務號可以申請此許可權

初始化動作

 $options = array(
    `token`=>`tokenaccesskey`, //填寫你設定的key
    `encodingaeskey`=>`encodingaeskey`, //填寫加密用的EncodingAESKey
    `appid`=>`wxdk1234567890`, //填寫高階呼叫功能的app id, 請在微信開發模式後臺查詢
    `appsecret`=>`xxxxxxxxxxxxxxxxxxx` //填寫高階呼叫功能的金鑰
    );
 $weObj = new Wechat($options); //建立例項物件
 //TODO:呼叫$weObj各例項方法

被動介面方法:

  • valid() 驗證連線,被動介面處於加密模式時必須呼叫
  • getRev() 獲取微信伺服器發來資訊(不返回結果),被動介面必須呼叫
  • getRevData() 返回微信伺服器發來的資訊(陣列)
  • getRevFrom() 返回訊息傳送者的userid
  • getRevTo() 返回訊息接收者的id(即公眾號id)
  • getRevType() 返回接收訊息的型別
  • getRevID() 返回訊息id
  • getRevCtime() 返回訊息傳送時間
  • getRevContent() 返回訊息內容正文或語音識別結果(文字型)
  • getRevPic() 返回圖片資訊(圖片型資訊) 返回陣列{`mediaid`=>“,`picurl`=>“}
  • getRevLink() 接收訊息連結(連結型資訊) 返回陣列{`url`=>“,`title`=>“,`description`=>“}
  • getRevGeo() 返回地理位置(位置型資訊) 返回陣列{`x`=>“,`y`=>“,`scale`=>“,`label`=>“}
  • getRevEventGeo() 返回事件地理位置(事件型資訊) 返回陣列{`x`=>“,`y`=>“,`precision`=>“}
  • getRevEvent() 返回事件型別(事件型資訊) 返回陣列{`event`=>“,`key`=>“}
  • getRevScanInfo() 獲取自定義選單的掃碼推事件資訊,事件型別為scancode_pushscancode_waitmsg 返回陣列array (`ScanType`=>`qrcode`,`ScanResult`=>`123123`)
  • getRevSendPicsInfo() 獲取自定義選單的圖片傳送事件資訊,事件型別為pic_sysphotopic_photo_or_albumpic_weixin陣列結構見php檔案內方法說明
  • getRevSendGeoInfo() 獲取自定義選單的地理位置選擇器事件推送,事件型別為location_select 陣列結構見php檔案內方法說明
  • getRevVoice() 返回語音資訊(語音型資訊) 返回陣列{`mediaid`=>“,`format`=>“}
  • getRevVideo() 返回視訊資訊(視訊型資訊) 返回陣列{`mediaid`=>“,`thumbmediaid`=>“}
  • getRevTicket() 返回接收TICKET(掃描帶引數二維碼,關注或SCAN事件) 返回二維碼的ticket值
  • getRevSceneId() 返回二維碼的場景值(掃描帶引數二維碼的關注事件) 返回二維碼的引數值
  • getRevTplMsgID() 返回主動推送的訊息ID(群發或模板訊息事件) 返回MsgID值
  • getRevStatus() 返回模板訊息傳送狀態(模板訊息事件) 返回文字:success(成功)|failed:user block(使用者拒絕接收)|failed: system failed(傳送失敗(非使用者拒絕))
  • getRevResult() 返回群發或模板訊息傳送結果(群發或模板訊息事件) 返回陣列,內容依事件型別而不同,參考開發文件中群發、模板訊息推送事件
  • getRevKFCreate() 返回多客服-接入會話的客服賬號(多客服-接入會話事件) 返回文字型
  • getRevKFClose() 返回多客服-處理會話的客服賬號(多客服-接入會話事件) 返回文字型
  • getRevKFSwitch() 返回多客服-轉接會話資訊(多客服-轉接會話事件) 返回陣列 {`FromKfAccount` => “,`ToKfAccount` => “}
  • getRevCardPass() 返回卡券-稽核通過的卡券ID(卡券-卡券稽核事件) 返回文字型
  • getRevCardGet() 返回卡券-使用者領取卡券的相關資訊(卡券-領取卡券事件) 返回陣列{`CardId` => “,`IsGiveByFriend` => “,`UserCardCode` => “}
  • getRevCardDel() 返回卡券-使用者刪除卡券的相關資訊(卡券-刪除卡券事件) 返回陣列{`CardId` => “,`UserCardCode` => “}
  • text($text) 設定文字型訊息,引數:文字內容
  • image($mediaid) 設定圖片型訊息,引數:圖片的media_id
  • voice($mediaid) 設定語音型訊息,引數:語音的media_id
  • video($mediaid=“,$title,$description) 設定視訊型訊息,引數:視訊的media_id、標題、摘要
  • music($title,$desc,$musicurl,$hgmusicurl=“,$thumbmediaid=“) 設定回覆音樂,引數:音樂標題、音樂描述、音樂連結、高音質連結、縮圖的媒體id
  • news($newsData) 設定圖文型訊息,引數:陣列。陣列結構見php檔案內方法說明
  • Message($msg = “,$append = false) 設定傳送的訊息(一般不需要呼叫這個方法)
  • transfer_customer_service($customer_account = “) 轉接多客服,如不指定客服可不提供引數,引數:指定客服的賬號
  • reply() 將以上已經設定好的訊息,回覆給微信伺服器

預定義常量列表:

////訊息型別,使用例項呼叫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`;        //卡券 - 使用者刪除卡券

主動介面方法:

  • checkAuth($appid,$appsecret,$token) 此處傳入公眾後臺高階介面提供的appid和appsecret, 或者手動指定$token為access_token。函式將返回access_token操作令牌
  • resetAuth($appid=“) 刪除驗證資料
  • resetJsTicket($appid=“) 刪除JSAPI授權TICKET
  • getJsTicket($appid=“,$jsapi_ticket=“) 獲取JSAPI授權TICKET
  • getJsSign($url, $timestamp=0, $noncestr=“, $appid=“) 獲取JsApi使用簽名資訊陣列,可只提供url地址
  • createMenu($data) 建立選單 $data選單結構詳見 自定義選單建立介面
  • getServerIp() 獲取微信伺服器IP地址列表 返回陣列array(`127.0.0.1`,`127.0.0.1`)
  • getMenu() 獲取選單
  • deleteMenu() 刪除選單
  • uploadMedia($data, $type) 上傳臨時素材,有效期為3天(注意上傳大檔案時可能需要先呼叫 set_time_limit(0) 避免超時)
  • getMedia($media_id,$is_video=false) 獲取臨時素材(含接收到的音訊、視訊媒體檔案)
  • uploadForeverMedia($data, $type,$is_video=false,$video_info=array()) 上傳永久素材,可以在公眾平臺官網素材管理模組中看到
  • uploadForeverArticles($data) 上傳永久圖文素材
  • updateForeverArticles($media_id,$data,$index=0) 修改永久圖文素材(認證後的訂閱號可用)
  • getForeverMedia($media_id,$is_video=false) 獲取永久素材
  • delForeverMedia($media_id) 刪除永久素材
  • getForeverList($type,$offset,$count) 獲取永久素材列表(認證後的訂閱號可用)
  • getForeverCount() 獲取永久素材總數
  • uploadMpVideo($data) 上傳視訊素材,當需要群發視訊時,必須使用此方法得到的MediaID,否則無法顯示
  • uploadArticles($data) 上傳圖文訊息素材
  • sendMassMessage($data) 高階群發訊息
  • sendGroupMassMessage($data) 高階群發訊息(全體或分組群發)
  • deleteMassMessage($msg_id) 刪除群發圖文訊息
  • previewMassMessage($data) 預覽群發訊息
  • queryMassMessage($msg_id) 查詢群發訊息傳送狀態
  • getQRCode($scene_id,$type=0,$expire=1800) 獲取推廣二維碼ticket字串
  • getQRUrl($ticket) 獲取二維碼圖片地址
  • getShortUrl($long_url) 長連結轉短連結介面
  • getUserList($next_openid) 批量獲取關注使用者列表
  • getUserInfo($openid) 獲取關注者詳細資訊
  • updateUserRemark($openid,$remark) 設定使用者備註名
  • getGroup() 獲取使用者分組列表
  • getUserGroup($openid) 獲取使用者所在分組
  • createGroup($name) 新增自定分組
  • updateGroup($groupid,$name) 更改分組名稱
  • updateGroupMembers($groupid,$openid) 移動使用者分組
  • batchUpdateGroupMembers($groupid,$openid_list) 批量移動使用者分組
  • sendCustomMessage($data) 傳送客服訊息
  • getOauthRedirect($callback,$state,$scope) 獲取網頁授權oAuth跳轉地址
  • getOauthAccessToken() 通過回撥的code獲取網頁授權access_token
  • getOauthRefreshToken($refresh_token) 通過refresh_token對access_token續期
  • getOauthUserinfo($access_token,$openid) 通過網頁授權的access_token獲取使用者資料
  • getOauthAuth($access_token,$openid) 檢驗授權憑證access_token是否有效
  • getSignature($arrdata,`sha1`) 生成簽名字串
  • generateNonceStr($length=16) 獲取隨機字串
  • setTMIndustry($id1,$id2=“) 模板訊息,設定所屬行業
  • addTemplateMessage($tpl_id) 模板訊息,新增訊息模板
  • sendTemplateMessage($data) 傳送模板訊息
  • 多客服介面:
  • getCustomServiceMessage($data) 獲取多客服會話記錄
  • transfer_customer_service($customer_account) 轉發多客服訊息
  • getCustomServiceKFlist() 獲取多客服客服基本資訊
  • getCustomServiceOnlineKFlist() 獲取多客服線上客服接待資訊
  • createKFSession($openid,$kf_account,$text=“) 建立指定多客服會話
  • closeKFSession($openid,$kf_account,$text=“) 關閉指定多客服會話
  • getKFSession($openid) 獲取使用者會話狀態
  • getKFSessionlist($kf_account) 獲取指定客服的會話列表
  • getKFSessionWait() 獲取未接入會話列表
  • addKFAccount($account,$nickname,$password) 新增客服賬號
  • updateKFAccount($account,$nickname,$password) 修改客服賬號資訊
  • deleteKFAccount($account) 刪除客服賬號
  • setKFHeadImg($account,$imgfile) 上傳客服頭像
  • querySemantic($uid,$query,$category,$latitude=0,$longitude=0,$city=””,$region=””) 語義理解介面 引數含義及返回的json內容請檢視 微信語義理解介面
  • getDatacube($type,$subtype,$begin_date,$end_date=“) 獲取統計資料 引數需注意$type與$subtype的定義

    獲取統計資料方法 引數定義

    資料分類 $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_dateend_date的差值需小於“最大時間跨度”(比如最大時間跨度為1時,begin_dateend_date的差值只能為0,才能小於1)

  • 卡券介面:
  • createCard($data) 建立卡券
  • updateCard($data) 修改卡券
  • delCard($card_id) 刪除卡券
  • getCardInfo($card_id) 查詢卡券詳情
  • getCardColors() 獲取顏色列表
  • getCardLocations() 拉取門店列表
  • addCardLocations($data) 批量匯入門店資訊
  • createCardQrcode($card_id) 生成卡券二維碼
  • consumeCardCode($code) 消耗 code
  • decryptCardCode($encrypt_code) code 解碼
  • checkCardCode($code) 獲取 code 的有效性
  • getCardIdList($data) 批量查詢卡列表
  • updateCardCode($code,$card_id,$new_code) 更改 code
  • unavailableCardCode($code,$card_id=“) 設定卡券失效(不可逆)
  • modifyCardStock($data) 庫存修改
  • activateMemberCard($data) 啟用/繫結會員卡,引數結構請參看卡券開發文件(6.1.1 啟用/繫結會員卡)章節
  • updateMemberCard($data) 會員卡交易,引數結構請參看卡券開發文件(6.1.2 會員卡交易)章節
  • updateLuckyMoney($code,$balance,$card_id=“) 更新紅包金額
  • setCardTestWhiteList($openid=array(),$user=array()) 設定卡券測試白名單
  • 搖一搖周邊介面:
  • applyShakeAroundDevice($data) 申請裝置ID
  • updateShakeAroundDevice($data) 編輯裝置的備註資訊
  • searchShakeAroundDevice($data) 查詢裝置列表
  • bindLocationShakeAroundDevice($device_id,$poi_id,$uuid=“,$major=0,$minor=0) 配置裝置與門店的關聯關係
  • bindPageShakeAroundDevice($device_id,$page_ids=array(),$bind=1,$append=1,$uuid=“,$major=0,$minor=0) 配置裝置與頁面的關聯關係
  • uploadShakeAroundMedia($data) 上傳在搖一搖頁面展示的圖片素材
  • addShakeAroundPage($title,$description,$icon_url,$page_url,$comment=“) 新增搖一搖出來的頁面資訊
  • updateShakeAroundPage($page_id,$title,$description,$icon_url,$page_url,$comment=“) 編輯搖一搖出來的頁面資訊
  • searchShakeAroundPage($page_ids=array(),$begin=0,$count=1) 查詢搖一搖已有的頁面
  • deleteShakeAroundPage($page_ids=array()) 刪除搖一搖已有的頁面,必須是未與裝置關聯的頁面
  • getShakeInfoShakeAroundUser($ticket) 獲取搖周邊的裝置及使用者資訊
  • deviceShakeAroundStatistics($device_id,$begin_date,$end_date,$uuid=“,$major=0,$minor=0) 以裝置為維度的資料統計介面
  • pageShakeAroundStatistics($page_id,$begin_date,$end_date) 以頁面為維度的資料統計介面

2. wechatext.class.php 非官方擴充套件API

此擴充套件類庫已經不再更新,原因是官方對公眾號開放了眾多介面,此類庫繼續維護的意義不大
非官方擴充套件API,需要配置公眾平臺賬戶和密碼,能實現對已關注使用者的點對點微信,此方式不保證長期有效。
類方法裡提及的使用者id在介面返回結構裡表述為FakeId, 屬同一概念, 在下面wechatauth類裡則表示為Uin, 使用者id對應的微訊號必須通過getInfo()方法通過返回陣列的Username值獲取, 但非關注關係使用者資料不能獲取.
呼叫下列方法前必須經過login()方法和checkValid()驗證方法才能獲得呼叫許可權. 有的賬戶無法通過登陸可能因為要求提供驗證碼, 可以手動登陸後把獲取到的cookie寫程式序存放cookie的檔案解決.
程式使用了經過修改的snoopy相容式HTTP類方法, 在類似BAE/SAE雲伺服器上可能不能正常執行, 因為雲服務的curl方法是經過重寫的, 某些header引數如網站來源引數不被支援.

類主要方法:

  • send($id,$content) 向某使用者id傳送微信文字資訊
  • sendNews($id,$msgid) 傳送圖文訊息, 可通過getNewsList獲取$msgid
  • getUserList($page,$pagesize,$groupid) 獲取使用者資訊
  • getGroupList($page,$pagesize) 獲取群組資訊
  • getNewsList($page,$pagesize) 獲取圖文資訊列表
  • uploadFile($filepath,$type) 上傳附件,包括圖片/音訊/視訊/縮圖
  • getFileList($type,$page,$pagesize) 獲取素材庫檔案列表
  • sendImage($id,$fid) 傳送圖片訊息
  • sendAudio($id,$fid) 傳送音訊訊息
  • sendVideo($id,$fid) 傳送視訊訊息
  • getInfo($id) 根據id獲取使用者資料,注: 非關注關係使用者資料不能獲取
  • getNewMsgNum($lastid) 獲取從$lastid算起新訊息的數目
  • getTopMsg() 獲取最新一條訊息的資料, 此方法獲取的訊息id可以作為檢測新訊息的$lastid依據
  • getMsg($lastid,$offset=0,$perpage=50,$day=0,$today=0,$star=0) 獲取最新的訊息列表, 列表將返回訊息id, 使用者id, 訊息型別, 文字訊息等引數
  • 訊息返回結構: {“id”:”訊息id”,”type”:”型別號(1為文字,2為圖片,3為語音)”,”fileId”:”0″,”hasReply”:”0″,”fakeId”:”使用者uid”,”nickName”:”暱稱”,”dateTime”:”時間戳”,”content”:”文字內容”}
  • getMsgImage($msgid,$mode=`large`) 若訊息type型別為2, 呼叫此方法獲取圖片資料
  • getMsgVoice($msgid) 若訊息type型別為3, 呼叫此方法獲取語音資料

3. wechatauth.class.php 授權登陸

此擴充套件類庫已經不再更新,原因是官方開放平臺對網站應用開放的有授權登陸介面,更標準,更好用。請檢視:微信開放平臺
通過微信二維碼登陸微信的API, 能實現第三方網站同步登陸, 首先程式分別通過get_login_code和get_code_image方法獲取授權二維碼圖片, 然後利用微信手機客戶端掃描二維碼圖片後將自動跳出授權頁面, 使用者點選授權後即可獲取對應的使用者資料和頭像資訊. 詳細驗證步驟請看test3.php例子.

類主要方法:

  • get_login_code() 獲取登陸授權碼, 通過授權碼才能獲取二維碼
  • get_code_image($code=“) 將上面獲取的授權碼轉換為圖片二維碼
  • verify_code() 鑑定是否登陸成功,返回200為最終授權成功.
  • get_login_info() 鑑定成功後呼叫此方法即可獲取使用者基本資訊
  • get_avatar($url) 獲取使用者頭像圖片資料
  • logout() 登出登陸

4. wechat.js 內嵌JS

此JS指令碼已經廢棄不再更新,原因是官方在微信6.0.2版本開放了全新的JSAPI介面,更全面好用。請檢視:微信公眾平臺WIKI

微信內嵌網頁特殊功能js呼叫:

  • WeixinJS.hideOptionMenu() 隱藏右上角按鈕
  • WeixinJS.showOptionMenu() 顯示右上角按鈕
  • WeixinJS.hideToolbar() 隱藏工具欄
  • WeixinJS.showToolbar() 顯示工具欄
  • WeixinJS.getNetworkType() 獲取網路狀態
  • WeixinJS.closeWindow() 關閉視窗
  • WeixinJS.scanQRCode() 掃描二維碼
  • WeixinJS.openUrlByExtBrowser(url) 使用瀏覽器開啟網址
  • WeixinJS.jumpToBizProfile(username) 跳轉到指定公眾賬號頁面
  • WeixinJS.sendEmail(title,content) 傳送郵件
  • WeixinJS.openProductView(latitude,longitude,name,address,scale,infoUrl) 檢視地圖
  • WeixinJS.addContact(username) 新增微信賬號
  • WeixinJS.imagePreview(urls,current) 調出微信內圖片預覽
  • WeixinJS.payCallback(appId,package,timeStamp,nonceStr,signType,paySign,callback) 微信JsApi支付介面
  • WeixinJS.editAddress(appId,addrSign,timeStamp,nonceStr,callback) 微信JsApi支付介面
  • 通過定義全域性變數dataForWeixin配置觸發分享的內容: javascript var dataForWeixin={ appId:"", MsgImg:"訊息圖片路徑", TLImg:"時間線圖路徑", url:"分享url路徑", title:"標題", desc:"描述", fakeid:"", callback:function(){} }; 

5. errCode.php 全域性返回碼類

當呼叫API介面失敗時,可以用此類來獲取失敗原因的中文說明。
注意:微信公眾號引用errCode.php,企業號引用qyerrCode.php

使用方法:

include "errCode.php";  //或 qyerrCode.php

$ret=ErrCode::getErrText(48001); //錯誤碼可以通過公眾號類庫的公開變數errCode得到

if ($ret) 
    echo $ret;
else 
    echo "未找到對應的內容";

6. qywechat.class.php 企業號API類庫

呼叫官方API,具有更靈活的訊息分類響應方式,支援鏈式呼叫操作 ;

主要功能

  • 接入驗證
  • 自動回覆(文字、圖片、語音、視訊、音樂、圖文)
  • 選單操作(查詢、建立、刪除)
  • 部門管理(建立、更新、刪除、獲取部門列表)
  • 成員管理(建立、更新、刪除、獲取成員資訊,獲取部門成員列表)
  • 標籤管理(建立、更新、刪除、獲取成員、新增成員、刪除成員,獲取標籤列表)
  • 媒體檔案管理(上傳、獲取)
  • 二次驗證
  • OAuth2(生成授權url、獲取成員資訊)
  • 獲取企業微信伺服器IP列表
  • 微信JSAPI授權(獲取ticket、獲取簽名)

初始化動作

$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各例項方法

被動介面方法:

  • valid() 驗證連線,被動介面必須呼叫
  • getRev() 獲取微信伺服器發來資訊(不返回結果),被動介面必須呼叫
  • getRevData() 返回微信伺服器發來的資訊(陣列)
  • getRevPostXml() 返回微信伺服器發來的原始加密xml資訊
  • getRevFrom() 返回訊息傳送者的userid
  • getRevTo() 返回訊息接收者的id(即公眾號id,一般與等同appid一致)
  • getRevAgentID() 返回接收訊息的應用id
  • getRevType() 返回接收訊息的型別
  • getRevID() 返回訊息id
  • getRevCtime() 返回訊息傳送事件
  • getRevContent() 返回訊息內容正文(文字型訊息)
  • getRevPic() 返回圖片資訊(圖片型資訊) 返回陣列{`mediaid`=>“,`picurl`=>“}
  • getRevGeo() 返回地理位置(位置型資訊) 返回陣列{`x`=>“,`y`=>“,`scale`=>“,`label`=>“}
  • getRevEventGeo() 返回事件地理位置(事件型資訊) 返回陣列{`x`=>“,`y`=>“,`precision`=>“}
  • getRevEvent() 返回事件型別(事件型資訊) 返回陣列{`event`=>“,`key`=>“}
  • getRevScanInfo() 獲取自定義選單的掃碼推事件資訊,事件型別為scancode_pushscancode_waitmsg 返回陣列array (`ScanType`=>`qrcode`,`ScanResult`=>`123123`)
  • getRevSendPicsInfo() 獲取自定義選單的圖片傳送事件資訊,事件型別為pic_sysphotopic_photo_or_albumpic_weixin陣列結構見php檔案內方法說明
  • getRevSendGeoInfo() 獲取自定義選單的地理位置選擇器事件推送,事件型別為location_select 陣列結構見php檔案內方法說明
  • getRevVoice() 返回語音資訊(語音型資訊) 返回陣列{`mediaid`=>“,`format`=>“}
  • getRevVideo() 返回視訊資訊(視訊型資訊) 返回陣列{`mediaid`=>“,`thumbmediaid`=>“}
  • text($text) 設定文字型訊息,引數:文字內容
  • image($mediaid) 設定圖片型訊息,引數:圖片的media_id
  • voice($mediaid) 設定語音型訊息,引數:語音的media_id
  • video($mediaid=“,$title,$description) 設定視訊型訊息,引數:視訊的media_id、標題、摘要
  • news($newsData) 設定圖文型訊息,引數:陣列。陣列結構見php檔案內方法說明
  • image($mediaid) 設定圖片型訊息,引數:圖片的media_id
  • Message($msg = “,$append = false) 設定傳送的訊息(一般不需要呼叫這個方法)
  • reply() 將已經設定好的訊息,回覆給微信伺服器

預定義常量列表:

////訊息型別,使用例項呼叫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`;//傳送結果 - 模板訊息傳送結果

主動介面方法:

  • checkAuth($appid=“,$appsecret=“,$token=“) 通用auth驗證方法,也用來換取ACCESS_TOKEN 。僅在需要手動指定access_token時才用$token
  • resetAuth($appid=“) 清除記錄的ACCESS_TOKEN
  • resetJsTicket($appid=“) 刪除JSAPI授權TICKET
  • getJsTicket($appid=“,$jsapi_ticket=“) 獲取JSAPI授權TICKET
  • getJsSign($url, $timestamp=0, $noncestr=“, $appid=“) 獲取JsApi使用簽名資訊陣列,可只提供url地址
  • getSignature($arrdata,`sha1`) 生成簽名字串
  • generateNonceStr($length=16) 獲取隨機字串
  • createMenu($data,$agentid=“) 建立選單,引數:選單內容陣列,要建立選單應用id
  • getMenu($agentid=“) 獲取選單內容,引數:要獲取選單內容的應用id
  • deleteMenu($agentid=“) 刪除選單,引數:要刪除選單的應用id
  • uploadMedia($data, $type) 上傳媒體檔案,引數請看php檔案內方法說明(注意上傳大檔案時可能需要先呼叫 set_time_limit(0) 避免超時)
  • getMedia($media_id) 根據媒體檔案ID獲取媒體檔案,引數:媒體id
  • getServerIp() 獲取企業微信伺服器IP地址列表 返回陣列array(`127.0.0.1`,`127.0.0.1`)
  • createDepartment($data) 建立部門,引數: array(“name”=>”郵箱產品組”,”parentid”=>”1″,”order” => “1”)
  • updateDepartment($data) 更新部門,引數: array(“id”=>”1″,”name”=>”郵箱產品組”,”parentid”=>”1″,”order” => “1”)
  • deleteDepartment($id) 刪除部門,引數:要刪除的部門id
  • moveDepartment($data) 移動部門,引數:array(“department_id” => “5”,”to_parentid” => “2”,”to_position” => “1”)
  • getDepartment() 獲取部門列表,返回部門陣列。其中department部門列表資料。以部門的order欄位從小到大排列
  • createUser($data) 建立成員,引數請看php檔案內方法說明
  • updateUser($data) 更新成員,引數請看php檔案內方法說明
  • deleteUser($userid) 刪除成員,引數:員工UserID
  • deleteUsers($userids) 批量刪除成員,引數:員工UserID陣列
  • getUserInfo($userid) 獲取成員資訊,引數:員工UserID
  • getUserList($department_id,$fetch_child=0,$status=0) 獲取部門成員,引數:部門id,是否遞迴獲取子部門,獲取型別。 > 0獲取全部員工,1獲取已關注成員列表,2獲取禁用成員列表,4獲取未關注成員列表。status可疊加
  • getUserListInfo($department_id,$fetch_child=0,$status=0) 獲取部門成員詳情,引數同上
  • getUserId($code,$agentid) 根據code獲取員工UserID與手機裝置號,引數:Oauth2.0或者二次驗證返回的code值,跳轉連結時所在的企業應用ID
  • sendInvite($userid,$invite_tips=“) 邀請成員關注
  • createTag($data) 建立標籤,引數:array(“tagname” => “UI”)
  • updateTag($data) 更新標籤,引數:array(“tagid” => “1”,”tagname” => “UI”)
  • deleteTag($tagid) 刪除標籤,引數:標籤TagID
  • getTag($tagid) 獲取標籤成員,引數:標籤TagID
  • addTagUser($data) 增加標籤成員,引數請看php檔案內方法說明
  • delTagUser($data) 刪除標籤成員,引數請看php檔案內方法說明
  • getTagList() 獲取標籤列表,返回標籤陣列
  • sendMessage($data) 主動傳送資訊介面,引數請看php檔案內方法說明
  • authSucc($userid) 二次驗證,引數: 員工UserID
  • getOauthRedirect($callback,$state=`STATE`,$scope=`snsapi_base`) 組合授權跳轉介面url

7. wechatpay.class.php 舊版微信支付V2介面類庫

舊版微信支付類庫(微信支付V2),已移動至old_version目錄下。
自2014年8月開始申請到的微信支付都是V3介面,據官方說V2的會陸續升級為V3介面,但時間及升級渠道未確認。

主要功能

  • 獲取access_token (初級許可權)
  • 呼叫地址元件 (支付許可權)
  • 生成訂單簽名資料 (支付許可權)
  • 訂單成功回撥 (支付許可權)
  • 發貨通知 (支付許可權)
  • 支付訂單查詢 (支付許可權)
    > 備註:
    > 初級許可權:基本許可權,任何正常的公眾號都有此許可權
    > 選單許可權:正常的服務號、認證後的訂閱號擁有此許可權
    > 認證許可權:分為訂閱號、服務號認證,如字首服務號則僅認證的服務號有此許可權,否則為認證後的訂閱號、服務號都有此許可權
    > 支付許可權:僅認證後的服務號可以申請此許可權

初始化動作

 $options = array(
    `appid`=>`wxdk1234567890`, //填寫高階呼叫功能的app id, 請在微信開發模式後臺查詢
    `appsecret`=>`xxxxxxxxxxxxxxxxxxx`, //填寫高階呼叫功能的金鑰
    `partnerid`=>`88888888`, //財付通商戶身份標識,支付許可權專用,沒有可不填
    `partnerkey`=>``, //財付通商戶許可權金鑰Key,支付許可權專用
    `paysignkey`=>`` //商戶簽名金鑰Key,支付許可權專用
    );
 $weObj = new Wechat($options); //建立例項物件
 //TODO:呼叫$weObj各例項方法

主動介面方法:

  • checkAuth($appid=“,$appsecret=“,$token=“) 獲取access_token。可根據appid和appsecret獲取,或手動指定access_token
  • resetAuth($appid=“) 刪除驗證資料
  • getSignature($arrdata,`sha1`) 生成簽名字串
  • generateNonceStr($length=16) 獲取隨機字串
  • createNativeUrl($productid) 生成原生支付url
  • createPackage($out_trade_no,$body,$total_fee,$notify_url,$spbill_create_ip,$fee_type=1,$bank_type=”WX”,$input_charset=”UTF-8″,$time_start=””,$time_expire=””,$transport_fee=””,$product_fee=””,$goods_tag=””,$attach=””) 生成訂單package字串
  • getPaySign($package, $timeStamp, $nonceStr) 支付簽名(paySign)生成方法
  • checkOrderSignature($orderxml=“) 回撥通知簽名驗證
  • sendPayDeliverNotify($openid,$transid,$out_trade_no,$status=1,$msg=`ok`) 發貨通知
  • getPayOrder($out_trade_no) 查詢訂單資訊
  • setUserToken($user_token) 設定使用者授權金鑰
  • getAddrSign($url, $timeStamp, $nonceStr, $user_token=“) 獲取收貨地址JS的簽名

為開發框架進行適配

為不同的開發框架進行適配快取操作(儲存access_token、jsapi_ticket),及輸出除錯日誌。

由於微信api需要快取access_token與jsapi_ticket,而在不同框架下的快取方式不同,所以原先在Wechat.class.php和QYWechat.class.php中快取程式碼做了TODO標誌。 需要各位在使用不同框架時再進行修改,但確實很麻煩,因為對結構進行了修改。

取消了原先同步維護的Thinkphp版本,為Wechat類增加操作快取3個過載方法setCachegetCacheremoveCache,以及修改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);
    }
}

呼叫示例


官方Wechat呼叫示例:

//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();
}

企業號API類庫呼叫示例:

可參考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();
}

擴充套件包Wechatext呼叫示例:

// old_version/test/test2.php 
    include "wechatext.class.php";

    function logdebug($text){
        file_put_contents(`./data/log.txt`,$text."
",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`]); 
    }

微信二維碼Wechatauth登陸示例:

// 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查詢是否已經授權成功

新版微信JSAPI呼叫DEMO:

請看test/jsapi目錄

如何聯絡我:【萬里虎】www.bravetiger.cn
【QQ】3396726884 (諮詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/


相關文章