微信公众平台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)
此扩展类库已经不再更新,原因是官方对公众号开放了众多接口,此类库继续维护的意义不大
非官方扩展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 [email protected]
* @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'=>'[email protected]',
'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/
文章来源:https://github.com/dodgepudding/wechat-php-sdk
文章浏览阅读4.9w次,点赞23次,收藏64次。虽然说520已经过去好几天了,但是并不能影响我们学习的心,今天也是心血来潮写一个html5的表白小程序。一颗砰砰跳动的表白之心! !话不多说,直接来看效果图吧是不是看起来很酷呢,下面也是给出代码。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-..._mt管理器表白代码
文章浏览阅读1.7k次。1.http://sgt.irobotbox.com/Api/API_Irobotbox_Orders.asmx 赛盒api文档的的详细说明2.你需要发送post请求(添加相应的参数),文档使用功能的是xml。这里我使用的Python对接。以下内容来至于对大佬的借鉴:https://www.cnblogs.com/insane-Mr-Li/p/9145152.html进入正题,我想获取相..._赛盒api
文章浏览阅读1.8k次。目前发生这种情况的主要有两种手机1.华为,2.小米1.华为适配 /** * 判断底部navigator是否已经显示 适配华为 * @param windowManager * @return */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private boolean has..._小米手机底部导航条适配
文章浏览阅读6.1k次,点赞4次,收藏28次。一、Yarn的作用在大数据生态环境中,yarn主要有两个作用:资源管理和程序调度。二、Yarn的组成主要由ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成。三、Yarn的基础架构(1)ResourceManager作用:1)处理客户端请求;2)监控NodeManager,对各个NodeManager上的资源进行统一管理和调度;3)给ApplicationMaster分配空闲的Container运行并监控其运行状态; _yarn的主要功能是什么
文章浏览阅读511次。之前就记录了在自己电脑上怎么安装Maven仓库的,以及安装后的仓库配置,(Maven的下载、安装),本章节主要记录的是Maven的几种种类以及如何将jar包文件夹(里面有着各种jar文件)配置到Maven仓库中,只有将jar包文件夹在Maven中配置后才能被项目所使用;详细如下:Maven的分类及其本地仓库配置到Macen中1、Maven的分类2、本地仓库在Maven中的配置《END》1、..._的清风设置 他
文章浏览阅读5.9k次,点赞2次,收藏29次。一:题目给定含有n个元素的多重集合s,每个元素在s中出现的次数称为该元素的重数,多重集s中重数最大的元素称为众数,给定多重集合s,求s中的众数集重数。二:思路首先,我们最容易想到的就是统计每个数的出现次数,然后比较得出结果。这个思路可以利用容器来实现。仔细思考,这道题目还可以用分治法来解决。解决步骤:①给数组排序;②找出中位数v并且确定中位数的个数num和左右边界;..._设 a 是 n 个数构成的数组, 其中出现次数最多的数称为众数. 设计一个算法求 a 的
文章浏览阅读1.8k次。1 第一章:数据载入及初步观察1.1 载入数据数据集下载 https://www.kaggle.com/c/titanic/overview1.1.1 任务一:导入numpy和pandas#写入代码import numpy as npimport pandas as pdimport os【提示】如果加载失败,学会如何在你的python环境下安装numpy和pandas这两个库1.1.2 任务二:载入数据(1) 使用相对路径载入数据(2) 使用绝对路径载入数据#写入代码test
文章浏览阅读1k次。Error: Activity class {com.example.project/com.example.projectggjk.MainActivity} does not exist.这个错误是因为我在同一文件夹曾有同名称的project,在文件夹内删掉了,但是模拟器内没有删掉,所以导致程序找不到新project的MainActivity。解决办法:Build-Clean Project重启Android Studio再次运行程序参考:https://blog.csdn.net/q_activity class {com.example.helloworld/com.example.helloworld.mainactivity}
文章浏览阅读5.1k次。出现connection refused异常 , zoo.cfg 文件配置问题server.1=0.0.0.0:2888:3888server.2=hxb02:2888:3888server.3=hxb03:2888:3888本机地址要写成 0.0.0.0高可用集群,zookeeper 启动成功,zkfc 显示启动成功。namenode节点DFSZKFailoverController...
文章浏览阅读485次。1、idea插件连接dockersyctemctl启动docker的脚本(vim /usr/lib/systemd/system/docker.service )添加-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock ,默认docker没有监听任何端口的,另外要selinux关了,防火墙开放该端口一般都连接得上。参考:https:/..._idea env docker
文章浏览阅读412次。7月29日,华为宣布推出新一代智慧屏V75 Super。该产品凭借高质量的软硬结合,为用户带来了顶级的影音享受,以及领先行业的全场景智慧体验。一、 华为智慧屏V75 Super发布,顶级“画音”体验惊艳消费者V75 Super是华为V系列智慧屏的第二代产品,与第一代的V75 2021相比,V75 Super在延续了细窄边框和高屏占比优势的同时,还在硬件性能有新的突破。它使用了75英寸的mini LED屏幕。该屏幕通过搭载华为自研的鸿鹄SuperMiniLED精密矩阵背光解决方案,在画质、色彩表现力、_v75二代是什么型号
文章浏览阅读939次。原标题:手机计算器全线阵亡?10%+10%到底等于多少?9月3日,话题“手机计算器全线阵亡”登上热搜榜,消息称苹果、华为、小米、OPPO等各厂商手机计算器都出现了神奇的bug,不少手机计算机计算“10%+10%”时,得出的结果是0.11,而不是正确答案0.2。业内人士随后展开科普,表示这看起来是个Bug,但最终结果其实是计算器处理运算符号的逻辑所导致。iPhone X max、OPPO、华为荣耀、..._手机10%加10%