dodge c18ee01763 Merge pull request #371 from hetao29/master | 1 year ago | |
---|---|---|
Codeigniter | 8 years ago | |
Thinkphp | 9 years ago | |
old_version | 10 years ago | |
test | 8 years ago | |
wiki | 9 years ago | |
.gitignore | 10 years ago | |
README.md | 9 years ago | |
composer.json | 9 years ago | |
demo.php | 10 years ago | |
errCode.php | 9 years ago | |
qyerrCode.php | 9 years ago | |
qywechat.class.php | 8 years ago | |
wechat.class.php | 2 years ago |
微信公众平台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(已废弃)
为开发框架进行适配
调用示例
调用官方API,具有更灵活的消息分类响应方式,支持链式调用操作 ;
$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的定义
获取统计数据方法 参数定义
数据分类 $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)
卡券接口:
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) 以页面为维度的数据统计接口
此扩展类库已经不再更新,原因是官方对公众号开放了众多接口,此类库继续维护的意义不大
非官方扩展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目录
This is licensed under the GNU LGPL, version 2.1 or later.
For details, see: http://creativecommons.org/licenses/LGPL/2.1/