[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-8403":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":15,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":16,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":9,"pushedAt":9,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":15,"starSnapshotCount":15,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},8403,"wechat-php-sdk","dodgepudding\u002Fwechat-php-sdk","dodgepudding","微信公众平台php开发包, weixin developer SDK.",null,"PHP",4410,2276,630,147,0,59,false,"master",true,[],"2026-06-12 04:00:39","wechat-php-sdk\n==============\n\n微信公众平台php开发包,细化各项接口操作,支持链式调用,欢迎Fork此项目  \nweixin developer SDK.\n项目地址：**https:\u002F\u002Fgithub.com\u002Fdodgepudding\u002Fwechat-php-sdk**  \n项目blog：**http:\u002F\u002Fbinsee.github.io\u002Fwechat-php-sdk**  \n\n## 使用详解\n使用前需先打开微信帐号的开发模式，详细步骤请查看微信公众平台接口使用说明：  \n微信公众平台： http:\u002F\u002Fmp.weixin.qq.com\u002Fwiki\u002F\n微信企业平台： http:\u002F\u002Fqydev.weixin.qq.com\u002Fwiki\u002F\n\n微信支付接入文档：\nhttps:\u002F\u002Fmp.weixin.qq.com\u002Fcgi-bin\u002Freadtemplate?t=business\u002Fcourse2_tmpl&lang=zh_CN\n\n微信多客服：http:\u002F\u002Fdkf.qq.com\n\n\n## 目录 \n> **[wechat.class.php 官方API类库](#user-content-1-wechatclassphp-官方api类库)**  \n> **[qywechat.class.php 企业号API类库](#user-content-6-qywechatclassphp-企业号api类库)**  \n> **[errCode.php|qyerrCode.php 全局返回码类](#user-content-5-errcodephp-全局返回码类)**  \n> **[old_version\u002Fwechatpay.class.php 旧版微信支付V2接口类库](#user-content-7-wechatpayclassphp-旧版微信支付V2接口类库)**  \n> ~~**[old_version\u002Fwechatext.class.php 非官方扩展API(停止维护)](#user-content-2-wechatextclassphp-非官方扩展api)**~~  \n> ~~**[old_version\u002Fwechatauth.class.php 授权登陆(停止维护)](#user-content-3-wechatauthclassphp-授权登陆)**~~  \n> ~~**[old_version\u002Fwechat.js 内嵌JS(已废弃)](#user-content-4-wechatjs-内嵌js)**~~  \n> **[为开发框架进行适配](#user-content-为开发框架进行适配)**  \n> **[调用示例](#user-content-调用示例)**  \n\n----------\n\n## 1. wechat.class.php 官方API类库\n调用官方API，具有更灵活的消息分类响应方式，支持链式调用操作 ； \n\n### 主要功能 \n- 接入验证 **（初级权限）**\n- 自动回复（文本、图片、语音、视频、音乐、图文） **（初级权限）**\n- 菜单操作（查询、创建、删除） **（菜单权限）**\n- 客服消息（文本、图片、语音、视频、音乐、图文） **（认证权限）**\n- 二维码（创建临时、永久二维码，获取二维码URL） **（服务号、认证权限）**\n- 长链接转短链接接口 **（服务号、认证权限）**\n- 分组操作（查询、创建、修改、移动用户到分组） **（认证权限）**\n- 网页授权（基本授权，用户信息授权） **（服务号、认证权限）**\n- 用户信息（查询用户基本信息、获取关注者列表） **（认证权限）**\n- 多客服功能（客服管理、获取客服记录、客服会话管理） **（认证权限）**\n- 媒体文件（上传、获取） **（认证权限）**\n- 高级群发 **（认证权限）**\n- 模板消息（设置所属行业、添加模板、发送模板消息） **（服务号、认证权限）**\n- 卡券管理（创建、修改、删除、发放、门店管理等） **（认证权限）**\n- 语义理解 **（服务号、认证权限）**\n- 获取微信服务器IP列表 **（初级权限）**  \n- 微信JSAPI授权(获取ticket、获取签名) **（初级权限）**  \n- 数据统计(用户、图文、消息、接口分析数据) **（认证权限）**  \n> 备注：  \n> 初级权限：基本权限，任何正常的公众号都有此权限  \n> 菜单权限：正常的服务号、认证后的订阅号拥有此权限  \n> 认证权限：分为订阅号、服务号认证，如前缀服务号则仅认证的服务号有此权限，否则为认证后的订阅号、服务号都有此权限  \n> 支付权限：仅认证后的服务号可以申请此权限  \n\n\n### 初始化动作 \n```php\n $options = array(\n\t'token'=>'tokenaccesskey', \u002F\u002F填写你设定的key\n\t'encodingaeskey'=>'encodingaeskey', \u002F\u002F填写加密用的EncodingAESKey\n\t'appid'=>'wxdk1234567890', \u002F\u002F填写高级调用功能的app id, 请在微信开发模式后台查询\n\t'appsecret'=>'xxxxxxxxxxxxxxxxxxx' \u002F\u002F填写高级调用功能的密钥\n\t);\n $weObj = new Wechat($options); \u002F\u002F创建实例对象\n \u002F\u002FTODO：调用$weObj各实例方法\n```\n\n### 被动接口方法:   \n* valid() 验证连接，被动接口处于加密模式时必须调用\n* \n* getRev() 获取微信服务器发来信息(不返回结果)，被动接口必须调用\n* getRevData() 返回微信服务器发来的信息（数组）\n* getRevFrom()  返回消息发送者的userid\n* getRevTo()  返回消息接收者的id（即公众号id）\n* getRevType() 返回接收消息的类型\n* getRevID() 返回消息id\n* getRevCtime() 返回消息发送时间\n* getRevContent() 返回消息内容正文或语音识别结果（文本型）\n* getRevPic() 返回图片信息（图片型信息） 返回数组{'mediaid'=>'','picurl'=>''}\n* getRevLink() 接收消息链接（链接型信息） 返回数组{'url'=>'','title'=>'','description'=>''}\n* getRevGeo() 返回地理位置（位置型信息） 返回数组{'x'=>'','y'=>'','scale'=>'','label'=>''}\n* getRevEventGeo() 返回事件地理位置（事件型信息） 返回数组{'x'=>'','y'=>'','precision'=>''}\n* getRevEvent() 返回事件类型（事件型信息） 返回数组{'event'=>'','key'=>''}\n* getRevScanInfo() 获取自定义菜单的扫码推事件信息，事件类型为`scancode_push`或`scancode_waitmsg` 返回数组array ('ScanType'=>'qrcode','ScanResult'=>'123123')\n* getRevSendPicsInfo() 获取自定义菜单的图片发送事件信息,事件类型为`pic_sysphoto`或`pic_photo_or_album`或`pic_weixin` 数组结构见php文件内方法说明\n* getRevSendGeoInfo() 获取自定义菜单的地理位置选择器事件推送，事件类型为`location_select` 数组结构见php文件内方法说明\n* getRevVoice() 返回语音信息（语音型信息） 返回数组{'mediaid'=>'','format'=>''}\n* getRevVideo() 返回视频信息（视频型信息） 返回数组{'mediaid'=>'','thumbmediaid'=>''}\n* getRevTicket() 返回接收TICKET（扫描带参数二维码,关注或SCAN事件） 返回二维码的ticket值\n* getRevSceneId() 返回二维码的场景值（扫描带参数二维码的关注事件） 返回二维码的参数值\n* getRevTplMsgID() 返回主动推送的消息ID（群发或模板消息事件） 返回MsgID值\n* getRevStatus() 返回模板消息发送状态（模板消息事件） 返回文本：success(成功)|failed:user block(用户拒绝接收)|failed: system failed(发送失败（非用户拒绝）)\n* getRevResult() 返回群发或模板消息发送结果（群发或模板消息事件） 返回数组，内容依事件类型而不同，参考开发文档中群发、模板消息推送事件\n* getRevKFCreate() 返回多客服-接入会话的客服账号（多客服-接入会话事件） 返回文本型\n* getRevKFClose() 返回多客服-处理会话的客服账号（多客服-接入会话事件） 返回文本型\n* getRevKFSwitch() 返回多客服-转接会话信息（多客服-转接会话事件） 返回数组\t{'FromKfAccount' => '','ToKfAccount' => ''}\n* getRevCardPass() 返回卡券-审核通过的卡券ID（卡券-卡券审核事件） 返回文本型\n* getRevCardGet() 返回卡券-用户领取卡券的相关信息（卡券-领取卡券事件） 返回数组{'CardId' => '','IsGiveByFriend' => '','UserCardCode' => ''}\n* getRevCardDel() 返回卡券-用户删除卡券的相关信息（卡券-删除卡券事件） 返回数组{'CardId' => '','UserCardCode' => ''}\n* \n* text($text) 设置文本型消息，参数：文本内容\n* image($mediaid) 设置图片型消息，参数：图片的media_id\n* voice($mediaid) 设置语音型消息，参数：语音的media_id\n* video($mediaid='',$title,$description) 设置视频型消息，参数：视频的media_id、标题、摘要\n* music($title,$desc,$musicurl,$hgmusicurl='',$thumbmediaid='') 设置回复音乐，参数：音乐标题、音乐描述、音乐链接、高音质链接、缩略图的媒体id\n* news($newsData) 设置图文型消息，参数：数组。数组结构见php文件内方法说明\n* Message($msg = '',$append = false) 设置发送的消息（一般不需要调用这个方法）\n* transfer_customer_service($customer_account = '') 转接多客服，如不指定客服可不提供参数，参数：指定客服的账号\n* reply() 将以上已经设置好的消息，回复给微信服务器\n\n### 预定义常量列表：\n```php\n\u002F\u002F\u002F\u002F消息类型，使用实例调用getRevType()方法取得\nconst MSGTYPE_TEXT = 'text';\nconst MSGTYPE_IMAGE = 'image';\nconst MSGTYPE_LOCATION = 'location';\nconst MSGTYPE_LINK = 'link';\nconst MSGTYPE_EVENT = 'event';\nconst MSGTYPE_MUSIC = 'music';\nconst MSGTYPE_NEWS = 'news';\nconst MSGTYPE_VOICE = 'voice';\nconst MSGTYPE_VIDEO = 'video';\n\u002F\u002F\u002F\u002F事件类型，使用实例调用getRevEvent()方法取得\nconst EVENT_SUBSCRIBE = 'subscribe';       \u002F\u002F订阅\nconst EVENT_UNSUBSCRIBE = 'unsubscribe';   \u002F\u002F取消订阅\nconst EVENT_SCAN = 'SCAN';                 \u002F\u002F扫描带参数二维码\nconst EVENT_LOCATION = 'LOCATION';         \u002F\u002F上报地理位置\nconst EVENT_MENU_VIEW = 'VIEW';                     \u002F\u002F菜单 - 点击菜单跳转链接\nconst EVENT_MENU_CLICK = 'CLICK';                   \u002F\u002F菜单 - 点击菜单拉取消息\nconst EVENT_MENU_SCAN_PUSH = 'scancode_push';       \u002F\u002F菜单 - 扫码推事件(客户端跳URL)\nconst EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; \u002F\u002F菜单 - 扫码推事件(客户端不跳URL)\nconst EVENT_MENU_PIC_SYS = 'pic_sysphoto';          \u002F\u002F菜单 - 弹出系统拍照发图\nconst EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  \u002F\u002F菜单 - 弹出拍照或者相册发图\nconst EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         \u002F\u002F菜单 - 弹出微信相册发图器\nconst EVENT_MENU_LOCATION = 'location_select';      \u002F\u002F菜单 - 弹出地理位置选择器\nconst EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        \u002F\u002F发送结果 - 高级群发完成\nconst EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';\u002F\u002F发送结果 - 模板消息发送结果\nconst EVENT_KF_SEESION_CREATE = 'kfcreatesession';  \u002F\u002F多客服 - 接入会话\nconst EVENT_KF_SEESION_CLOSE = 'kfclosesession';    \u002F\u002F多客服 - 关闭会话\nconst EVENT_KF_SEESION_SWITCH = 'kfswitchsession';  \u002F\u002F多客服 - 转接会话\nconst EVENT_CARD_PASS = 'card_pass_check';          \u002F\u002F卡券 - 审核通过\nconst EVENT_CARD_NOTPASS = 'card_not_pass_check';   \u002F\u002F卡券 - 审核未通过\nconst EVENT_CARD_USER_GET = 'user_get_card';        \u002F\u002F卡券 - 用户领取卡券\nconst EVENT_CARD_USER_DEL = 'user_del_card';        \u002F\u002F卡券 - 用户删除卡券\n```\n\n### 主动接口方法:   \n *  checkAuth($appid,$appsecret,$token) 此处传入公众后台高级接口提供的appid和appsecret, 或者手动指定$token为access_token。函数将返回access_token操作令牌\n *  resetAuth($appid='') 删除验证数据\n *  resetJsTicket($appid='') 删除JSAPI授权TICKET\n *  getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET\n *  getJsSign($url, $timestamp=0, $noncestr='', $appid='') 获取JsApi使用签名信息数组，可只提供url地址 \n *  createMenu($data) 创建菜单 $data菜单结构详见 **[自定义菜单创建接口](http:\u002F\u002Fmp.weixin.qq.com\u002Fwiki\u002Findex.php?title=自定义菜单创建接口)**\n *  getServerIp() 获取微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')\n *  getMenu() 获取菜单 \n *  deleteMenu() 删除菜单 \n *  uploadMedia($data, $type) 上传临时素材，有效期为3天(注意上传大文件时可能需要先调用 set_time_limit(0) 避免超时)\n *  getMedia($media_id,$is_video=false) 获取临时素材（含接收到的音频、视频媒体文件）\n *  uploadForeverMedia($data, $type,$is_video=false,$video_info=array()) 上传永久素材，可以在公众平台官网素材管理模块中看到\n *  uploadForeverArticles($data) 上传永久图文素材\n *  updateForeverArticles($media_id,$data,$index=0) 修改永久图文素材(认证后的订阅号可用)\n *  getForeverMedia($media_id,$is_video=false) 获取永久素材\n *  delForeverMedia($media_id) 删除永久素材\n *  getForeverList($type,$offset,$count) 获取永久素材列表(认证后的订阅号可用)\n *  getForeverCount() 获取永久素材总数\n *  uploadMpVideo($data) 上传视频素材，当需要群发视频时，必须使用此方法得到的MediaID，否则无法显示\n *  uploadArticles($data) 上传图文消息素材\n *  sendMassMessage($data) 高级群发消息\n *  sendGroupMassMessage($data) 高级群发消息（全体或分组群发）\n *  deleteMassMessage($msg_id) 删除群发图文消息\n *  previewMassMessage($data) 预览群发消息\n *  queryMassMessage($msg_id) 查询群发消息发送状态\n *  getQRCode($scene_id,$type=0,$expire=1800) 获取推广二维码ticket字串 \n *  getQRUrl($ticket) 获取二维码图片地址\n *  getShortUrl($long_url) 长链接转短链接接口\n *  getUserList($next_openid) 批量获取关注用户列表 \n *  getUserInfo($openid) 获取关注者详细信息 \n *  updateUserRemark($openid,$remark) 设置用户备注名\n *  getGroup() 获取用户分组列表 \n *  getUserGroup($openid) 获取用户所在分组\n *  createGroup($name) 新增自定分组 \n *  updateGroup($groupid,$name) 更改分组名称 \n *  updateGroupMembers($groupid,$openid) 移动用户分组  \n *  batchUpdateGroupMembers($groupid,$openid_list) 批量移动用户分组 \n *  sendCustomMessage($data) 发送客服消息  \n *  getOauthRedirect($callback,$state,$scope) 获取网页授权oAuth跳转地址  \n *  getOauthAccessToken() 通过回调的code获取网页授权access_token  \n *  getOauthRefreshToken($refresh_token) 通过refresh_token对access_token续期  \n *  getOauthUserinfo($access_token,$openid) 通过网页授权的access_token获取用户资料  \n *  getOauthAuth($access_token,$openid)  检验授权凭证access_token是否有效\n *  getSignature($arrdata,'sha1') 生成签名字串  \n *  generateNonceStr($length=16) 获取随机字串  \n *  setTMIndustry($id1,$id2='') 模板消息，设置所属行业\n *  addTemplateMessage($tpl_id) 模板消息，添加消息模板\n *  sendTemplateMessage($data) 发送模板消息\n *  \n *  多客服接口：\n *  getCustomServiceMessage($data) 获取多客服会话记录\n *  transfer_customer_service($customer_account) 转发多客服消息\n *  getCustomServiceKFlist() 获取多客服客服基本信息\n *  getCustomServiceOnlineKFlist() 获取多客服在线客服接待信息\n *  createKFSession($openid,$kf_account,$text='') 创建指定多客服会话\n *  closeKFSession($openid,$kf_account,$text='') 关闭指定多客服会话\n *  getKFSession($openid) 获取用户会话状态\n *  getKFSessionlist($kf_account) 获取指定客服的会话列表\n *  getKFSessionWait() 获取未接入会话列表\n *  addKFAccount($account,$nickname,$password) 添加客服账号\n *  updateKFAccount($account,$nickname,$password) 修改客服账号信息\n *  deleteKFAccount($account) 删除客服账号\n *  setKFHeadImg($account,$imgfile) 上传客服头像\n *  \n *  querySemantic($uid,$query,$category,$latitude=0,$longitude=0,$city=\"\",$region=\"\") 语义理解接口 参数含义及返回的json内容请查看 **[微信语义理解接口](http:\u002F\u002Fmp.weixin.qq.com\u002Fwiki\u002Findex.php?title=语义理解)**\n *  getDatacube($type,$subtype,$begin_date,$end_date='') 获取统计数据 参数需注意$type与$subtype的定义\n> 获取统计数据方法 参数定义\n> \n| 数据分类 | $type值(字符串)  | 数据子分类 | $subtype值(字符串) | 时间跨度(天) |\n| --------- | :-------:  | --------- | :------: | ----: |\n| 用户分析 | 'user' | 获取用户增减数据 | 'summary' | 7 |\n| 用户分析 | 'user' | 获取累计用户数据 | 'cumulate' | 7 |\n| 图文分析 | 'article' | 获取图文群发每日数据 | 'summary' | 1 |\n| 图文分析 | 'article' | 获取图文群发总数据 | 'total' | 1 |\n| 图文分析 | 'article' | 获取图文统计数据 | 'read' | 3 |\n| 图文分析 | 'article' | 获取图文统计分时数据 | 'readhour' | 1 |\n| 图文分析 | 'article' | 获取图文分享转发数据 | 'share' | 7 |\n| 图文分析 | 'article' | 获取图文分享转发分时数据 | 'sharehour' | 1 |\n| 消息分析 | 'upstreammsg' | 获取消息发送概况数据 | 'summary' | 7 |\n| 消息分析 | 'upstreammsg' | 获取消息分送分时数据 | 'hour' | 1 |\n| 消息分析 | 'upstreammsg' | 获取消息发送周数据 | 'week' | 30 |\n| 消息分析 | 'upstreammsg' | 获取消息发送月数据 | 'month' | 30 |\n| 消息分析 | 'upstreammsg' | 获取消息发送分布数据 | 'dist' | 15 |\n| 消息分析 | 'upstreammsg' | 获取消息发送分布周数据 | 'distweek' | 30 |\n| 消息分析 | 'upstreammsg' | 获取消息发送分布月数据 | 'distmonth' | 30 |\n| 接口分析 | 'interface' | 获取接口分析数据 | 'summary' | 30 |\n| 接口分析 | 'interface' | 获取接口分析分时数据 | 'summaryhour' | 1 |\n需要注意 `begin_date`和`end_date`的差值需小于“最大时间跨度”（比如最大时间跨度为1时，`begin_date`和`end_date`的差值只能为0，才能小于1）\n\n *  \n *  卡券接口：\n *  createCard($data) 创建卡券\n *  updateCard($data) 修改卡券\n *  delCard($card_id) 删除卡券\n *  getCardInfo($card_id) 查询卡券详情\n *  getCardColors() 获取颜色列表\n *  getCardLocations() 拉取门店列表\n *  addCardLocations($data) 批量导入门店信息\n *  createCardQrcode($card_id) 生成卡券二维码\n *  consumeCardCode($code) 消耗 code\n *  decryptCardCode($encrypt_code) code 解码\n *  checkCardCode($code) 获取 code 的有效性\n *  getCardIdList($data) 批量查询卡列表\n *  updateCardCode($code,$card_id,$new_code) 更改 code\n *  unavailableCardCode($code,$card_id='') 设置卡券失效**(不可逆)**\n *  modifyCardStock($data) 库存修改\n *  activateMemberCard($data) 激活\u002F绑定会员卡，参数结构请参看卡券开发文档(6.1.1 激活\u002F绑定会员卡)章节\n *  updateMemberCard($data) 会员卡交易，参数结构请参看卡券开发文档(6.1.2 会员卡交易)章节\n *  updateLuckyMoney($code,$balance,$card_id='') 更新红包金额\n *  setCardTestWhiteList($openid=array(),$user=array()) 设置卡券测试白名单\n *  \n *  摇一摇周边接口：\n *  applyShakeAroundDevice($data) 申请设备ID\n *  updateShakeAroundDevice($data) 编辑设备的备注信息\n *  searchShakeAroundDevice($data) 查询设备列表\n *  bindLocationShakeAroundDevice($device_id,$poi_id,$uuid='',$major=0,$minor=0) 配置设备与门店的关联关系\n *  bindPageShakeAroundDevice($device_id,$page_ids=array(),$bind=1,$append=1,$uuid='',$major=0,$minor=0) 配置设备与页面的关联关系\n *  uploadShakeAroundMedia($data) 上传在摇一摇页面展示的图片素材\n *  addShakeAroundPage($title,$description,$icon_url,$page_url,$comment='') 新增摇一摇出来的页面信息\n *  updateShakeAroundPage($page_id,$title,$description,$icon_url,$page_url,$comment='') 编辑摇一摇出来的页面信息\n *  searchShakeAroundPage($page_ids=array(),$begin=0,$count=1) 查询摇一摇已有的页面\n *  deleteShakeAroundPage($page_ids=array()) 删除摇一摇已有的页面，必须是未与设备关联的页面\n *  getShakeInfoShakeAroundUser($ticket) 获取摇周边的设备及用户信息\n *  deviceShakeAroundStatistics($device_id,$begin_date,$end_date,$uuid='',$major=0,$minor=0) 以设备为维度的数据统计接口\n *  pageShakeAroundStatistics($page_id,$begin_date,$end_date) 以页面为维度的数据统计接口\n \n## ~~2. wechatext.class.php 非官方扩展API~~  \n**此扩展类库已经不再更新，原因是官方对公众号开放了众多接口，此类库继续维护的意义不大**  \n非官方扩展API，需要配置公众平台账户和密码，能实现对已关注用户的点对点微信，此方式不保证长期有效。  \n类方法里提及的用户id在接口返回结构里表述为FakeId, 属同一概念, 在下面wechatauth类里则表示为Uin, 用户id对应的微信号必须通过getInfo()方法通过返回数组的Username值获取, 但非关注关系用户资料不能获取.  \n调用下列方法前必须经过login()方法和checkValid()验证方法才能获得调用权限. 有的账户无法通过登陆可能因为要求提供验证码, 可以手动登陆后把获取到的cookie写进程序存放cookie的文件解决.  \n程序使用了经过修改的snoopy兼容式HTTP类方法, 在类似BAE\u002FSAE云服务器上可能不能正常运行, 因为云服务的curl方法是经过重写的, 某些header参数如网站来源参数不被支持.  \n\n### 类主要方法:\n *  send($id,$content) 向某用户id发送微信文字信息 \n *  sendNews($id,$msgid) 发送图文消息, 可通过getNewsList获取$msgid\n *  getUserList($page,$pagesize,$groupid) 获取用户信息\n *  getGroupList($page,$pagesize) 获取群组信息\n *  getNewsList($page,$pagesize) 获取图文信息列表 \n *  uploadFile($filepath,$type) 上传附件,包括图片\u002F音频\u002F视频\u002F缩略图\n *  getFileList($type,$page,$pagesize) 获取素材库文件列表\n *  sendImage($id,$fid) 发送图片消息\n *  sendAudio($id,$fid) 发送音频消息\n *  sendVideo($id,$fid) 发送视频消息 \n *  getInfo($id) 根据id获取用户资料,注: 非关注关系用户资料不能获取  \n *  getNewMsgNum($lastid) 获取从$lastid算起新消息的数目  \n *  getTopMsg() 获取最新一条消息的数据, 此方法获取的消息id可以作为检测新消息的$lastid依据  \n *  getMsg($lastid,$offset=0,$perpage=50,$day=0,$today=0,$star=0) 获取最新的消息列表, 列表将返回消息id, 用户id, 消息类型, 文字消息等参数  \n *  消息返回结构:  {\"id\":\"消息id\",\"type\":\"类型号(1为文字,2为图片,3为语音)\",\"fileId\":\"0\",\"hasReply\":\"0\",\"fakeId\":\"用户uid\",\"nickName\":\"昵称\",\"dateTime\":\"时间戳\",\"content\":\"文字内容\"}   \n *  getMsgImage($msgid,$mode='large') 若消息type类型为2, 调用此方法获取图片数据  \n *  getMsgVoice($msgid) 若消息type类型为3, 调用此方法获取语音数据  \n\n## ~~3. wechatauth.class.php 授权登陆~~\n**此扩展类库已经不再更新，原因是官方开放平台对网站应用开放的有授权登陆接口，更标准，更好用。请查看：[微信开放平台](http:\u002F\u002Fopen.weixin.qq.com)**  \n通过微信二维码登陆微信的API, 能实现第三方网站同步登陆, 首先程序分别通过get_login_code和get_code_image方法获取授权二维码图片, 然后利用微信手机客户端扫描二维码图片后将自动跳出授权页面, 用户点击授权后即可获取对应的用户资料和头像信息. 详细验证步骤请看test3.php例子.   \n### 类主要方法:\n *  get_login_code() 获取登陆授权码, 通过授权码才能获取二维码  \n *  get_code_image($code='') 将上面获取的授权码转换为图片二维码  \n *  verify_code() 鉴定是否登陆成功,返回200为最终授权成功.  \n *  get_login_info() 鉴定成功后调用此方法即可获取用户基本信息  \n *  get_avatar($url) 获取用户头像图片数据  \n *  logout() 注销登陆  \n\n## ~~4. wechat.js 内嵌JS~~\n**此JS脚本已经废弃不再更新，原因是官方在微信6.0.2版本开放了全新的JSAPI接口，更全面好用。请查看：[微信公众平台WIKI](http:\u002F\u002Fmp.weixin.qq.com\u002Fwiki)**\n### 微信内嵌网页特殊功能js调用：\n * WeixinJS.hideOptionMenu() 隐藏右上角按钮\n * WeixinJS.showOptionMenu() 显示右上角按钮\n * WeixinJS.hideToolbar() 隐藏工具栏\n * WeixinJS.showToolbar() 显示工具栏\n * WeixinJS.getNetworkType() 获取网络状态\n * WeixinJS.closeWindow() 关闭窗口\n * WeixinJS.scanQRCode() 扫描二维码\n * WeixinJS.openUrlByExtBrowser(url) 使用浏览器打开网址\n * WeixinJS.jumpToBizProfile(username) 跳转到指定公众账号页面\n * WeixinJS.sendEmail(title,content) 发送邮件\n * WeixinJS.openProductView(latitude,longitude,name,address,scale,infoUrl) 查看地图\n * WeixinJS.addContact(username) 添加微信账号\n * WeixinJS.imagePreview(urls,current) 调出微信内图片预览\n * WeixinJS.payCallback(appId,package,timeStamp,nonceStr,signType,paySign,callback) 微信JsApi支付接口\n * WeixinJS.editAddress(appId,addrSign,timeStamp,nonceStr,callback) 微信JsApi支付接口\n * 通过定义全局变量dataForWeixin配置触发分享的内容：\n ```javascript\n var dataForWeixin={\n\t   appId:\"\",\n\t   MsgImg:\"消息图片路径\",\n\t   TLImg:\"时间线图路径\",\n\t   url:\"分享url路径\",\n\t   title:\"标题\",\n\t   desc:\"描述\",\n\t   fakeid:\"\",\n\t   callback:function(){}\n\t};\n ```\n\n## 5. errCode.php 全局返回码类\n当调用API接口失败时，可以用此类来获取失败原因的中文说明。  \n注意：微信公众号引用`errCode.php`，企业号引用`qyerrCode.php`。\n\n### 使用方法：\n```php\ninclude \"errCode.php\";  \u002F\u002F或 qyerrCode.php\n\n$ret=ErrCode::getErrText(48001); \u002F\u002F错误码可以通过公众号类库的公开变量errCode得到\n\nif ($ret) \n\techo $ret;\nelse \n    echo \"未找到对应的内容\";\n\n```\n\n## 6. qywechat.class.php 企业号API类库 \n调用官方API，具有更灵活的消息分类响应方式，支持链式调用操作 ； \n\n### 主要功能 \n- 接入验证\n- 自动回复（文本、图片、语音、视频、音乐、图文）\n- 菜单操作（查询、创建、删除）\n- 部门管理（创建、更新、删除、获取部门列表）\n- 成员管理（创建、更新、删除、获取成员信息，获取部门成员列表）\n- 标签管理（创建、更新、删除、获取成员、添加成员、删除成员,获取标签列表）\n- 媒体文件管理（上传、获取）\n- 二次验证\n- OAuth2（生成授权url、获取成员信息）\n- 获取企业微信服务器IP列表\n- 微信JSAPI授权(获取ticket、获取签名)\n\n\n### 初始化动作 \n```php\n$options = array(\n  'token'=>'tokenaccesskey', \u002F\u002F填写应用接口的Token\n  'encodingaeskey'=>'encodingaeskey', \u002F\u002F填写加密用的EncodingAESKey\n  'appid'=>'wxdk1234567890', \u002F\u002F填写高级调用功能的app id\n  'appsecret'=>'xxxxxxxxxxxxxxxxxxx', \u002F\u002F填写高级调用功能的密钥\n  'agentid'=>'1', \u002F\u002F应用的id\n  'debug'=>false, \u002F\u002F调试开关\n  '_logcallback'=>'logg', \u002F\u002F调试输出方法，需要有一个string类型的参数\n);\n $weObj = new Wechat($options); \u002F\u002F创建实例对象\n \u002F\u002FTODO：调用$weObj各实例方法\n\n```\n\n### 被动接口方法:   \n* valid() 验证连接，被动接口必须调用\n* \n* getRev() 获取微信服务器发来信息(不返回结果)，被动接口必须调用\n* getRevData() 返回微信服务器发来的信息（数组）\n* getRevPostXml() 返回微信服务器发来的原始加密xml信息\n* getRevFrom()  返回消息发送者的userid\n* getRevTo()  返回消息接收者的id（即公众号id，一般与等同appid一致）\n* getRevAgentID() 返回接收消息的应用id\n* getRevType() 返回接收消息的类型\n* getRevID() 返回消息id\n* getRevCtime() 返回消息发送事件\n* getRevContent() 返回消息内容正文（文本型消息）\n* getRevPic() 返回图片信息（图片型信息） 返回数组{'mediaid'=>'','picurl'=>''}\n* getRevGeo() 返回地理位置（位置型信息） 返回数组{'x'=>'','y'=>'','scale'=>'','label'=>''}\n* getRevEventGeo() 返回事件地理位置（事件型信息） 返回数组{'x'=>'','y'=>'','precision'=>''}\n* getRevEvent() 返回事件类型（事件型信息） 返回数组{'event'=>'','key'=>''}\n* getRevScanInfo() 获取自定义菜单的扫码推事件信息，事件类型为`scancode_push`或`scancode_waitmsg` 返回数组array ('ScanType'=>'qrcode','ScanResult'=>'123123')\n* getRevSendPicsInfo() 获取自定义菜单的图片发送事件信息,事件类型为`pic_sysphoto`或`pic_photo_or_album`或`pic_weixin` 数组结构见php文件内方法说明\n* getRevSendGeoInfo() 获取自定义菜单的地理位置选择器事件推送，事件类型为`location_select` 数组结构见php文件内方法说明\n* getRevVoice() 返回语音信息（语音型信息） 返回数组{'mediaid'=>'','format'=>''}\n* getRevVideo() 返回视频信息（视频型信息） 返回数组{'mediaid'=>'','thumbmediaid'=>''}\n* \n* text($text) 设置文本型消息，参数：文本内容\n* image($mediaid) 设置图片型消息，参数：图片的media_id\n* voice($mediaid) 设置语音型消息，参数：语音的media_id\n* video($mediaid='',$title,$description) 设置视频型消息，参数：视频的media_id、标题、摘要\n* news($newsData) 设置图文型消息，参数：数组。数组结构见php文件内方法说明\n* image($mediaid) 设置图片型消息，参数：图片的media_id\n* Message($msg = '',$append = false) 设置发送的消息（一般不需要调用这个方法）\n* reply() 将已经设置好的消息，回复给微信服务器\n  \n### 预定义常量列表：\n```php\n\u002F\u002F\u002F\u002F消息类型，使用实例调用getRevType()方法取得\n    const MSGTYPE_TEXT = 'text';\n    const MSGTYPE_IMAGE = 'image';\n    const MSGTYPE_LOCATION = 'location';\n    const MSGTYPE_LINK = 'link';    \u002F\u002F暂不支持\n    const MSGTYPE_EVENT = 'event';\n    const MSGTYPE_MUSIC = 'music';    \u002F\u002F暂不支持\n    const MSGTYPE_NEWS = 'news';\n    const MSGTYPE_VOICE = 'voice';\n    const MSGTYPE_VIDEO = 'video';\n\u002F\u002F\u002F\u002F事件类型，使用实例调用getRevEvent()方法取得\n    const EVENT_SUBSCRIBE = 'subscribe';       \u002F\u002F订阅\n    const EVENT_UNSUBSCRIBE = 'unsubscribe';   \u002F\u002F取消订阅\n    const EVENT_LOCATION = 'LOCATION';         \u002F\u002F上报地理位置\n    const EVENT_ENTER_AGENT = 'enter_agent';   \u002F\u002F用户进入应用\n    const EVENT_MENU_VIEW = 'VIEW';                     \u002F\u002F菜单 - 点击菜单跳转链接\n    const EVENT_MENU_CLICK = 'CLICK';                   \u002F\u002F菜单 - 点击菜单拉取消息\n    const EVENT_MENU_SCAN_PUSH = 'scancode_push';       \u002F\u002F菜单 - 扫码推事件(客户端跳URL)\n    const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; \u002F\u002F菜单 - 扫码推事件(客户端不跳URL)\n    const EVENT_MENU_PIC_SYS = 'pic_sysphoto';          \u002F\u002F菜单 - 弹出系统拍照发图\n    const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  \u002F\u002F菜单 - 弹出拍照或者相册发图\n    const EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         \u002F\u002F菜单 - 弹出微信相册发图器\n    const EVENT_MENU_LOCATION = 'location_select';      \u002F\u002F菜单 - 弹出地理位置选择器\n    const EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        \u002F\u002F发送结果 - 高级群发完成\n    const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';\u002F\u002F发送结果 - 模板消息发送结果\n```\n\n### 主动接口方法：\n* checkAuth($appid='',$appsecret='',$token='') 通用auth验证方法,也用来换取ACCESS_TOKEN 。仅在需要手动指定access_token时才用`$token`\n* resetAuth($appid='') 清除记录的ACCESS_TOKEN\n* resetJsTicket($appid='') 删除JSAPI授权TICKET\n* getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET\n* getJsSign($url, $timestamp=0, $noncestr='', $appid='') 获取JsApi使用签名信息数组，可只提供url地址 \n* getSignature($arrdata,'sha1') 生成签名字串  \n* generateNonceStr($length=16) 获取随机字串  \n* createMenu($data,$agentid='') 创建菜单,参数:菜单内容数组,要创建菜单应用id\n* getMenu($agentid='') 获取菜单内容,参数:要获取菜单内容的应用id\n* deleteMenu($agentid='') 删除菜单,参数:要删除菜单的应用id\n* uploadMedia($data, $type) 上传媒体文件,参数请看php文件内方法说明(注意上传大文件时可能需要先调用 set_time_limit(0) 避免超时)\n* getMedia($media_id) 根据媒体文件ID获取媒体文件,参数:媒体id\n* getServerIp() 获取企业微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')\n* createDepartment($data) 创建部门,参数: array(\"name\"=>\"邮箱产品组\",\"parentid\"=>\"1\",\"order\" =>  \"1\")\n* updateDepartment($data) 更新部门,参数: array(\"id\"=>\"1\"，\"name\"=>\"邮箱产品组\",\"parentid\"=>\"1\",\"order\" =>  \"1\")\n* deleteDepartment($id) 删除部门,参数：要删除的部门id\n* moveDepartment($data) 移动部门,参数：array(\"department_id\" => \"5\",\"to_parentid\" => \"2\",\"to_position\" => \"1\")\n* getDepartment() 获取部门列表，返回部门数组。其中department部门列表数据。以部门的order字段从小到大排列\n* createUser($data) 创建成员，参数请看php文件内方法说明\n* updateUser($data) 更新成员，参数请看php文件内方法说明\n* deleteUser($userid) 删除成员，参数：员工UserID\n* deleteUsers($userids) 批量删除成员，参数：员工UserID数组\n* getUserInfo($userid) 获取成员信息，参数：员工UserID\n* getUserList($department_id,$fetch_child=0,$status=0) 获取部门成员，参数：部门id，是否递归获取子部门，获取类型。\n> 0获取全部员工，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加\n* getUserListInfo($department_id,$fetch_child=0,$status=0) 获取部门成员详情，参数同上\n* getUserId($code,$agentid) 根据code获取员工UserID与手机设备号，参数：Oauth2.0或者二次验证返回的code值，跳转链接时所在的企业应用ID\n* sendInvite($userid,$invite_tips='') 邀请成员关注\n* createTag($data) 创建标签，参数：array(\"tagname\" => \"UI\")\n* updateTag($data) 更新标签，参数：array(\"tagid\" => \"1\",\"tagname\" => \"UI\")\n* deleteTag($tagid) 删除标签，参数：标签TagID\n* getTag($tagid) 获取标签成员，参数：标签TagID\n* addTagUser($data) 增加标签成员，参数请看php文件内方法说明\n* delTagUser($data) 删除标签成员，参数请看php文件内方法说明\n* getTagList() 获取标签列表，返回标签数组\n* sendMessage($data) 主动发送信息接口，参数请看php文件内方法说明\n* authSucc($userid) 二次验证，参数： 员工UserID\n* getOauthRedirect($callback,$state='STATE',$scope='snsapi_base') 组合授权跳转接口url\n\n\n## 7. wechatpay.class.php 旧版微信支付V2接口类库\n旧版微信支付类库(微信支付V2)，已移动至old_version目录下。  \n自2014年8月开始申请到的微信支付都是V3接口，据官方说V2的会陆续升级为V3接口，但时间及升级渠道未确认。\n\n### 主要功能 \n- 获取access_token **（初级权限）**\n- 调用地址组件 **（支付权限）**\n- 生成订单签名数据 **（支付权限）**\n- 订单成功回调 **（支付权限）**\n- 发货通知 **（支付权限）**\n- 支付订单查询 **（支付权限）**  \n> 备注：  \n> 初级权限：基本权限，任何正常的公众号都有此权限  \n> 菜单权限：正常的服务号、认证后的订阅号拥有此权限  \n> 认证权限：分为订阅号、服务号认证，如前缀服务号则仅认证的服务号有此权限，否则为认证后的订阅号、服务号都有此权限  \n> 支付权限：仅认证后的服务号可以申请此权限  \n\n\n### 初始化动作 \n```php\n $options = array(\n\t'appid'=>'wxdk1234567890', \u002F\u002F填写高级调用功能的app id, 请在微信开发模式后台查询\n\t'appsecret'=>'xxxxxxxxxxxxxxxxxxx', \u002F\u002F填写高级调用功能的密钥\n\t'partnerid'=>'88888888', \u002F\u002F财付通商户身份标识，支付权限专用，没有可不填\n\t'partnerkey'=>'', \u002F\u002F财付通商户权限密钥Key，支付权限专用\n\t'paysignkey'=>'' \u002F\u002F商户签名密钥Key，支付权限专用\n\t);\n $weObj = new Wechat($options); \u002F\u002F创建实例对象\n \u002F\u002FTODO：调用$weObj各实例方法\n```\n\n### 主动接口方法:   \n *  checkAuth($appid='',$appsecret='',$token='') 获取access_token。可根据appid和appsecret获取，或手动指定access_token\n *  resetAuth($appid='') 删除验证数据\n *  getSignature($arrdata,'sha1') 生成签名字串  \n *  generateNonceStr($length=16) 获取随机字串  \n *  createNativeUrl($productid) 生成原生支付url\n *  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字符串  \n *  getPaySign($package, $timeStamp, $nonceStr) 支付签名(paySign)生成方法  \n *  checkOrderSignature($orderxml='') 回调通知签名验证  \n *  sendPayDeliverNotify($openid,$transid,$out_trade_no,$status=1,$msg='ok') 发货通知  \n *  getPayOrder($out_trade_no) 查询订单信息  \n *  setUserToken($user_token) 设置用户授权密钥\n *  getAddrSign($url, $timeStamp, $nonceStr, $user_token='') 获取收货地址JS的签名\n\n\n## 为开发框架进行适配\n为不同的开发框架进行适配缓存操作(保存access_token、jsapi_ticket)，及输出调试日志。\n\n由于微信api需要缓存access_token与jsapi_ticket，而在不同框架下的缓存方式不同，所以原先在Wechat.class.php和QYWechat.class.php中缓存代码做了TODO标志。\n需要各位在使用不同框架时再进行修改，但确实很麻烦，因为对结构进行了修改。\n\n>取消了原先同步维护的Thinkphp版本，为Wechat类增加操作缓存3个重载方法`setCache`, `getCache`, `removeCache`，以及修改`log`方法可以重载。\n>分别来实现在不同开发框架下的设置缓存、读取缓存、清除缓存、日志输出4个功能。  \n\n在不同的开发框架下使用Wechat类库，请继承Wechat类，根据需要实现这4个方法。  \n可参考Thinkphp版的`TPWechat.class.php`为不同框架进行适配。\n欢迎提交其他框架的适配文件到项目库来。  \n\n为Thinkphp进行适配的示例如下：\n```php\n\u002F**\n *\t微信公众平台PHP-SDK, ThinkPHP实例\n *  @author dodgepudding@gmail.com\n *  @link https:\u002F\u002Fgithub.com\u002Fdodgepudding\u002Fwechat-php-sdk\n *  @version 1.2\n *  usage:\n *   $options = array(\n *\t\t\t'token'=>'tokenaccesskey', \u002F\u002F填写你设定的key\n *\t\t\t'encodingaeskey'=>'encodingaeskey', \u002F\u002F填写加密用的EncodingAESKey\n *\t\t\t'appid'=>'wxdk1234567890', \u002F\u002F填写高级调用功能的app id\n *\t\t\t'appsecret'=>'xxxxxxxxxxxxxxxxxxx' \u002F\u002F填写高级调用功能的密钥\n *\t\t);\n *\t $weObj = new TPWechat($options);\n *   $weObj->valid();\n *   ...\n *  \n *\u002F\nclass TPWechat extends Wechat\n{\n\t\u002F**\n\t * log overwrite\n\t * @see Wechat::log()\n\t *\u002F\n\tprotected function log($log){\n\t\tif ($this->debug) {\n\t\t\tif (function_exists($this->logcallback)) {\n\t\t\t\tif (is_array($log)) $log = print_r($log,true);\n\t\t\t\treturn call_user_func($this->logcallback,$log);\n\t\t\t}elseif (class_exists('Log')) {\n\t\t\t\tLog::write('wechat：'.$log, Log::DEBUG);\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t\u002F**\n\t * 重载设置缓存\n\t * @param string $cachename\n\t * @param mixed $value\n\t * @param int $expired\n\t * @return boolean\n\t *\u002F\n\tprotected function setCache($cachename,$value,$expired){\n\t\treturn S($cachename,$value,$expired);\n\t}\n\t\n\t\u002F**\n\t * 重载获取缓存\n\t * @param string $cachename\n\t * @return mixed\n\t *\u002F\n\tprotected function getCache($cachename){\n\t\treturn S($cachename);\n\t}\n\t\n\t\u002F**\n\t * 重载清除缓存\n\t * @param string $cachename\n\t * @return boolean\n\t *\u002F\n\tprotected function removeCache($cachename){\n\t\treturn S($cachename,null);\n\t}\n}\n```\n\n\n\n# 调用示例\n----------\n\n## 官方Wechat调用示例：\n```php\n\u002F\u002Ftest1.php\ninclude \"wechat.class.php\";\n$options = array(\n\t\t'token'=>'tokenaccesskey', \u002F\u002F填写你设定的key\n        'encodingaeskey'=>'encodingaeskey' \u002F\u002F填写加密用的EncodingAESKey，如接口为明文模式可忽略\n\t);\n$weObj = new Wechat($options);\n$weObj->valid();\u002F\u002F明文或兼容模式可以在接口验证通过后注释此句，但加密模式一定不能注释，否则会验证失败\n$type = $weObj->getRev()->getRevType();\nswitch($type) {\n\tcase Wechat::MSGTYPE_TEXT:\n\t\t\t$weObj->text(\"hello, I'm wechat\")->reply();\n\t\t\texit;\n\t\t\tbreak;\n\tcase Wechat::MSGTYPE_EVENT:\n\t\t\tbreak;\n\tcase Wechat::MSGTYPE_IMAGE:\n\t\t\tbreak;\n\tdefault:\n\t\t\t$weObj->text(\"help info\")->reply();\n}\n```\n\n## 企业号API类库调用示例：\n可参考**test**目录下的**qydemo.php**\n```php\ninclude \"wechat.class.php\";\n$options = array(\n        'token'=>'9Ixxxxxxx',\t\u002F\u002F填写应用接口的Token\n        'encodingaeskey'=>'d4o9WVg8sxxxxxxxxxxxxxxxxxxxxxx',\u002F\u002F填写加密用的EncodingAESKey\n        'appid'=>'wxa07979baxxxxxxxx',\t\u002F\u002F填写高级调用功能的appid\n);\n$weObj = new Wechat($options);\n$weObj->valid(); \u002F\u002F注意, 企业号与普通公众号不同，必须打开验证，不要注释掉\n$type = $weObj->getRev()->getRevType();\nswitch($type) {\n\tcase Wechat::MSGTYPE_TEXT:\n\t\t\t$weObj->text(\"hello, I'm wechat\")->reply();\n\t\t\texit;\n\t\t\tbreak;\n\tcase Wechat::MSGTYPE_EVENT:\n\t\t\tbreak;\n\tcase Wechat::MSGTYPE_IMAGE:\n\t\t\tbreak;\n\tdefault:\n\t\t\t$weObj->text(\"help info\")->reply();\n}\n```\n\n## 扩展包Wechatext调用示例: \n```php\n\u002F\u002F old_version\u002Ftest\u002Ftest2.php \n\tinclude \"wechatext.class.php\";\n\t\n\tfunction logdebug($text){\n\t\tfile_put_contents('.\u002Fdata\u002Flog.txt',$text.\"\\n\",FILE_APPEND);\t\t\n\t};\n\t\n\t$options = array(\n\t\t'account'=>'demo@domain.com',\n\t\t'password'=>'demo',\n\t\t'datapath'=>'.\u002Fdata\u002Fcookie_',\n\t\t\t'debug'=>true,\n\t\t\t'logcallback'=>'logdebug'\t\n\t); \n\t$wechat = new Wechatext($options);\n\tif ($wechat->checkValid()) {\n\t\t\u002F\u002F 获取用户信息\n\t\t$data = $wechat->getInfo('3974255');\n\t\tvar_dump($data);\n\t\t\u002F\u002F 获取最新一条消息\n\t\t$topmsg = $wechat->getTopMsg();\n\t\tvar_dump($topmsg);\n\t\t\u002F\u002F 主动回复消息\n\t\tif ($topmsg && $topmsg['has_reply']==0)\n\t\t$wechat->send($topmsg['fakeid'],'hi '.$topmsg['nick_name'].',rev:'.$topmsg['content']);\t\n\t}\n```\n\n## 微信二维码Wechatauth登陆示例: \n```php\n\u002F\u002F old_version\u002Ftest\u002Ftest3.php\n\tinclude \"..\u002Fwechatauth.class.php\";\n\tsession_start();\n\t$sid  = session_id();\n\t$options = array(\n\t\t'account'=>$sid,\n\t\t'datapath'=>'..\u002Fdata\u002Fcookiecode_',\n\t); \n\t$wechat = new Wechatauth($options);\n\t\n\tif (isset($_POST['code'])) {\n\t\t$logincode = $_POST['code'];\n\t\t$vres = $wechat->set_login_code($logincode)->verify_code();\n\t\tif ($vres===false) {\n\t\t\t$result = array('status'=>0);\n\t\t} else {\n\t\t\t$result = array('status'=>$vres);\n\t\t\tif ($vres==200) {\n\t\t\t\t$result['info'] = $wechat->get_login_info();\n\t\t\t\t$result['cookie'] = $wechat->get_login_cookie(true);\n\t\t\t}\n\t\t}\n\t\t\n\t\tdie(json_encode($result));\t\n\t}\n\t$logincode =  $wechat->get_login_code(); \u002F\u002F获取授权码\n\t$qrimg = $wechat->get_code_image(); \u002F\u002F待输出的二维码图片\n```\nHTML部分请看old_version\u002Ftest\u002Ftest3.php, 主要是定时ajax查询是否已经授权成功\n\n## 新版微信JSAPI调用DEMO: \n请看test\u002Fjsapi目录\n\nLicense\n-------\nThis is licensed under the GNU LGPL, version 2.1 or later.   \nFor details, see: http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002FLGPL\u002F2.1\u002F\n","wechat-php-sdk 是一个用于微信公众平台的 PHP 开发包，旨在简化微信接口的操作。该项目提供了丰富的功能支持，包括但不限于消息自动回复、菜单管理、客服消息处理、二维码生成与解析、网页授权等，并且支持链式调用以提高代码编写效率。此外，它还涵盖了微信支付、用户信息获取、模板消息发送等功能，全面覆盖了微信公众号开发中常见的需求。适用于需要在自己的PHP项目中集成微信公众号功能的各种场景，如企业服务号、订阅号的后台管理系统开发或基于微信生态的应用程序构建。",2,"2026-06-11 03:17:46","top_language"]