fanbo 7 months ago
commit 70a75cfdf2

Binary file not shown.

@ -1,14 +1,27 @@
<?php
namespace LaneWeChat;
/**
*
* 自动载入函数
* Created by Lane.
* User: lane
* Date: 14-10-15
* Time: 下午6:13
* E-mail: lixuan868686@163.com
* WebSite: http://www.lanecn.com
*/
class Autoloader{
const NAMESPACE_PREFIX = 'LaneWeChat\\';
/**
* 向PHP注册在自动载入函数
*/
public static function register(){
spl_autoload_register(array(new self, 'autoload'));
}
/**
* 根据类名载入所在文件
*/
public static function autoload($className){
$namespacePrefixStrlen = strlen(self::NAMESPACE_PREFIX);
if(strncmp(self::NAMESPACE_PREFIX, $className, $namespacePrefixStrlen) === 0){

@ -1,6 +1,35 @@
<?php
namespace LaneWeChat\Core;
/**
* 推广支持
* User: lane
* Date: 14-10-31
* Time: 下午4:15
* E-mail: lixuan868686@163.com
* WebSite: http://www.lanecn.com
*/
class Popularize{
/**
* 生成带参数的二维码 - 第一步 创建二维码ticket
*
* 获取带参数的二维码的过程包括两步首先创建二维码ticket然后凭借ticket到指定URL换取二维码。
*
* 目前有2种类型的二维码分别是临时二维码和永久二维码
* 前者有过期时间最大为1800秒但能够生成较多数量后者无过期时间数量较少目前参数只支持1--100000
* 两种二维码分别适用于帐号绑定、用户来源统计等场景。
*
* @param $type Int 临时二维码类型为1永久二维码类型为2
* @param $expireSeconds Int 过期时间只在类型为临时二维码时有效。最大为1800单位秒
* @param $sceneId Int 场景值ID临时二维码时为32位非0整型永久二维码时最大值为100000目前参数只支持1--100000
* @return Array(
* //获取的二维码ticket凭借此ticket可以在有效时间内换取二维码。
* "ticket"=>"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==",
* //二维码的有效时间以秒为单位。最大不超过1800。
* "expire_seconds"=>60,
* //二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片
* "url"=>"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"
* )
*/
public static function createTicket($type, $expireSeconds, $sceneId){
$queryUrl = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.AccessToken::getAccessToken();
$queryAction = 'POST';
@ -16,6 +45,12 @@ class Popularize{
return Curl::callWebServer($queryUrl, $template, $queryAction);
}
/**
* 生成带参数的二维码 - 第二步 通过ticket换取二维码
* @param $ticket Popularize::createTicket()获得的
* @param $filename String 文件路径如果不为空则会创建一个图片文件二维码文件为jpg格式保存到指定的路径
* @return 直接echo本函数的返回值并在调用页面添加header('Content-type: image/jpg');,将会展示出一个二维码的图片。
*/
public static function getQrcode($ticket, $filename=''){
$queryUrl = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.urlencode($ticket);
$queryAction = 'GET';
@ -26,6 +61,12 @@ class Popularize{
return $result;
}
/**
* 将一条长链接转成短链接。
* 主要使用场景:开发者用于生成二维码的原链接(商品、支付二维码等)太长导致扫码速度和成功率下降,将原长链接通过此接口转成短链接再生成二维码将大大提升扫码速度和成功率。
* @param $longUrl String 需要转换的长链接支持http://、https://、weixin://wxpay 格式的url
* @return array('errcode'=>0, 'errmsg'=>'错误信息', 'short_url'=>'http://t.cn/asdasd')错误码为0表示正常
*/
public static function long2short($longUrl){
$queryUrl = 'https://api.weixin.qq.com/cgi-bin/shorturl?access_token='.AccessToken::getAccessToken();
$queryAction = 'POST';

@ -1,16 +1,32 @@
<?php
namespace LaneWeChat\Core;
/**
* 发送主动响应
* Created by Lane.
* User: lane
* Date: 13-12-29
* Time: 下午5:54
* Mail: lixuan868686@163.com
* Website: http://www.lanecn.com
*/
class ResponseInitiative{
protected static $queryUrl = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=';
protected static $action = 'POST';
public static function text($tousername, $content){
/**
* @descrpition 文本
* @param $tousername
* @param $content 回复的消息内容换行在content中能够换行微信客户端就支持换行显示
* @return string
*/
public static function text($tousername, $content){
//获取ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
self::$queryUrl = self::$queryUrl.$accessToken;
//开始
$template = array(
'touser'=>$tousername,
'msgtype'=>'text',
@ -23,6 +39,12 @@ class ResponseInitiative{
return Curl::callWebServer(self::$queryUrl, $template, self::$action);
}
/**
* @descrpition 图片
* @param $tousername
* @param $mediaId 通过上传多媒体文件得到的id。
* @return string
*/
public static function image($tousername, $mediaId){
//获取ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
@ -40,6 +62,12 @@ class ResponseInitiative{
return Curl::callWebServer(self::$queryUrl, $template, self::$action);
}
/**
* @descrpition 语音
* @param $tousername
* @param $mediaId 通过上传多媒体文件得到的id
* @return string
*/
public static function voice($tousername, $mediaId){
//获取ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
@ -57,6 +85,14 @@ class ResponseInitiative{
return Curl::callWebServer(self::$queryUrl, $template, self::$action);
}
/**
* @descrpition 视频
* @param $tousername
* @param $mediaId 通过上传多媒体文件得到的id
* @param $title 标题
* @param $description 描述
* @return string
*/
public static function video($tousername, $mediaId, $title, $description){
//获取ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
@ -76,7 +112,16 @@ class ResponseInitiative{
return Curl::callWebServer(self::$queryUrl, $template, self::$action);
}
/**
* @descrpition 音乐
* @param $tousername
* @param $title 标题
* @param $description 描述
* @param $musicUrl 音乐链接
* @param $hqMusicUrl 高质量音乐链接WIFI环境优先使用该链接播放音乐
* @param $thumbMediaId 缩略图的媒体id通过上传多媒体文件得到的id
* @return string
*/
public static function music($tousername, $title, $description, $musicUrl, $hqMusicUrl, $thumbMediaId){
//获取ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
@ -98,6 +143,15 @@ class ResponseInitiative{
return Curl::callWebServer(self::$queryUrl, $template, self::$action);
}
/**
* @descrpition 图文消息 - 单个项目的准备工作用于内嵌到self::news()中。现调用本方法再调用self::news()
* 多条图文消息信息默认第一个item为大图,注意如果调用本方法得到的数组总项数超过10则将会无响应
* @param $title 标题
* @param $description 描述
* @param $picUrl 图片链接支持JPG、PNG格式较好的效果为大图360*200小图200*200
* @param $url 点击图文消息跳转链接
* @return string
*/
public static function newsItem($title, $description, $picUrl, $url){
return $template = array(
'title'=>$title,
@ -107,12 +161,18 @@ class ResponseInitiative{
);
}
/**
* @descrpition 图文 - 先调用self::newsItem()再调用本方法
* @param $tousername
* @param $item 数组每个项由self::newsItem()返回
* @return string
*/
public static function news($tousername, $item){
//获取ACCESS_TOKEN
$accessToken = AccessToken::getAccessToken();
self::$queryUrl = self::$queryUrl.$accessToken;
//开始
$template = array(
'touser'=>$tousername,
'msgtype'=>'news',

@ -1,59 +1,87 @@
以下是去除注释后的PHP代码
```php
<?php
namespace LaneWeChat\Core;
/**
* 处理请求
* Created by Lane.
* User: lane
* Date: 13-12-19
* Time: 下午11:04
* Mail: lixuan868686@163.com
* Website: http://www.lanecn.com
*/
class WechatRequest{
/**
* @descrpition 分发请求
* @param $request
* @return array|string
*/
public static function switchType(&$request){
$data = array();
switch ($request['msgtype']) {
//事件
case 'event':
$request['event'] = strtolower($request['event']);
switch ($request['event']) {
//关注
case 'subscribe':
//二维码关注
if(isset($request['eventkey']) && isset($request['ticket'])){
$data = self::eventQrsceneSubscribe($request);
//普通关注
}else{
$data = self::eventSubscribe($request);
}
break;
//扫描二维码
case 'scan':
$data = self::eventScan($request);
break;
//地理位置
case 'location':
$data = self::eventLocation($request);
break;
//自定义菜单 - 点击菜单拉取消息时的事件推送
case 'click':
$data = self::eventClick($request);
break;
//自定义菜单 - 点击菜单跳转链接时的事件推送
case 'view':
$data = self::eventView($request);
break;
//自定义菜单 - 扫码推事件的事件推送
case 'scancode_push':
$data = self::eventScancodePush($request);
break;
//自定义菜单 - 扫码推事件且弹出“消息接收中”提示框的事件推送
case 'scancode_waitmsg':
$data = self::eventScancodeWaitMsg($request);
break;
//自定义菜单 - 弹出系统拍照发图的事件推送
case 'pic_sysphoto':
$data = self::eventPicSysPhoto($request);
break;
//自定义菜单 - 弹出拍照或者相册发图的事件推送
case 'pic_photo_or_album':
$data = self::eventPicPhotoOrAlbum($request);
break;
//自定义菜单 - 弹出微信相册发图器的事件推送
case 'pic_weixin':
$data = self::eventPicWeixin($request);
break;
//自定义菜单 - 弹出地理位置选择器的事件推送
case 'location_select':
$data = self::eventLocationSelect($request);
break;
//取消关注
case 'unsubscribe':
$data = self::eventUnsubscribe($request);
break;
//群发接口完成后推送的结果
case 'masssendjobfinish':
$data = self::eventMassSendJobFinish($request);
break;
//模板消息完成后推送的结果
case 'templatesendjobfinish':
$data = self::eventTemplateSendJobFinish($request);
break;
@ -62,24 +90,31 @@ class WechatRequest{
break;
}
break;
//文本
case 'text':
$data = self::text($request);
break;
//图像
case 'image':
$data = self::image($request);
break;
//语音
case 'voice':
$data = self::voice($request);
break;
//视频
case 'video':
$data = self::video($request);
break;
//小视频
case 'shortvideo':
$data = self::shortvideo($request);
break;
//位置
case 'location':
$data = self::location($request);
break;
//链接
case 'link':
$data = self::link($request);
break;
@ -90,16 +125,32 @@ class WechatRequest{
return $data;
}
/**
* @descrpition 文本
* @param $request
* @return array
*/
public static function text(&$request){
$content = '收到文本消息';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 图像
* @param $request
* @return array
*/
public static function image(&$request){
$content = '收到图片';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 语音
* @param $request
* @return array
*/
public static function voice(&$request){
if(!isset($request['recognition'])){
$content = '收到语音';
@ -110,64 +161,127 @@ class WechatRequest{
}
}
/**
* @descrpition 视频
* @param $request
* @return array
*/
public static function video(&$request){
$content = '收到视频';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 视频
* @param $request
* @return array
*/
public static function shortvideo(&$request){
$content = '收到小视频';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 地理
* @param $request
* @return array
*/
public static function location(&$request){
$content = '收到上报的地理位置';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 链接
* @param $request
* @return array
*/
public static function link(&$request){
$content = '收到连接';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 关注
* @param $request
* @return array
*/
public static function eventSubscribe(&$request){
$content = '欢迎您关注我们的微信,将为您竭诚服务';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 取消关注
* @param $request
* @return array
*/
public static function eventUnsubscribe(&$request){
$content = '为什么不理我了?';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 扫描二维码关注(未关注时)
* @param $request
* @return array
*/
public static function eventQrsceneSubscribe(&$request){
$content = '欢迎您关注我们的微信,将为您竭诚服务';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 扫描二维码(已关注时)
* @param $request
* @return array
*/
public static function eventScan(&$request){
$content = '您已经关注了哦~';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 上报地理位置
* @param $request
* @return array
*/
public static function eventLocation(&$request){
$content = '收到上报的地理位置';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 自定义菜单 - 点击菜单拉取消息时的事件推送
* @param $request
* @return array
*/
public static function eventClick(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到点击菜单事件您设置的key是' . $eventKey;
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 自定义菜单 - 点击菜单跳转链接时的事件推送
* @param $request
* @return array
*/
public static function eventView(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到跳转链接事件您设置的key是' . $eventKey;
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 自定义菜单 - 扫码推事件的事件推送
* @param $request
* @return array
*/
public static function eventScancodePush(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到扫码推事件的事件您设置的key是' . $eventKey;
$content .= '。扫描信息:'.$request['scancodeinfo'];
@ -176,7 +290,13 @@ class WechatRequest{
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 自定义菜单 - 扫码推事件且弹出“消息接收中”提示框的事件推送
* @param $request
* @return array
*/
public static function eventScancodeWaitMsg(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到扫码推事件且弹出“消息接收中”提示框的事件您设置的key是' . $eventKey;
$content .= '。扫描信息:'.$request['scancodeinfo'];
@ -185,7 +305,13 @@ class WechatRequest{
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 自定义菜单 - 弹出系统拍照发图的事件推送
* @param $request
* @return array
*/
public static function eventPicSysPhoto(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到弹出系统拍照发图的事件您设置的key是' . $eventKey;
$content .= '。发送的图片信息:'.$request['sendpicsinfo'];
@ -195,7 +321,13 @@ class WechatRequest{
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 自定义菜单 - 弹出拍照或者相册发图的事件推送
* @param $request
* @return array
*/
public static function eventPicPhotoOrAlbum(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到弹出拍照或者相册发图的事件您设置的key是' . $eventKey;
$content .= '。发送的图片信息:'.$request['sendpicsinfo'];
@ -205,7 +337,14 @@ class WechatRequest{
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
Key = $request['eventkey'];
/**
* @descrpition 自定义菜单 - 弹出微信相册发图器的事件推送
* @param $request
* @return array
*/
public static function eventPicWeixin(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到弹出微信相册发图器的事件您设置的key是' . $eventKey;
$content .= '。发送的图片信息:'.$request['sendpicsinfo'];
$content .= '。发送的图片数量:'.$request['count'];
@ -214,7 +353,13 @@ class WechatRequest{
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* @descrpition 自定义菜单 - 弹出地理位置选择器的事件推送
* @param $request
* @return array
*/
public static function eventLocationSelect(&$request){
//获取该分类的信息
$eventKey = $request['eventkey'];
$content = '收到点击跳转事件您设置的key是' . $eventKey;
$content .= '。发送的位置信息:'.$request['sendlocationinfo'];
@ -226,26 +371,49 @@ class WechatRequest{
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* 群发接口完成后推送的结果
*
* 本消息有公众号群发助手的微信号“mphelper”推送的消息
* @param $request
*/
public static function eventMassSendJobFinish(&$request){
//发送状态为“send success”或“send fail”或“err(num)”。但send success时也有可能因用户拒收公众号的消息、系统错误等原因造成少量用户接收失败。err(num)是审核失败的具体原因可能的情况如下err(10001), //涉嫌广告 err(20001), //涉嫌政治 err(20004), //涉嫌社会 err(20002), //涉嫌色情 err(20006), //涉嫌违法犯罪 err(20008), //涉嫌欺诈 err(20013), //涉嫌版权 err(22000), //涉嫌互推(互相宣传) err(21000), //涉嫌其他
$status = $request['status'];
//计划发送的总粉丝数。group_id下粉丝数或者openid_list中的粉丝数
$totalCount = $request['totalcount'];
//过滤过滤是指特定地区、性别的过滤、用户设置拒收的过滤用户接收已超4条的过滤准备发送的粉丝数原则上FilterCount = SentCount + ErrorCount
$filterCount = $request['filtercount'];
//发送成功的粉丝数
$sentCount = $request['sentcount'];
//发送失败的粉丝数
$errorCount = $request['errorcount'];
$content = '发送完成,状态是'.$status.'。计划发送总粉丝数为'.$totalCount.'。发送成功'.$sentCount.'人,发送失败'.$errorCount.'人。';
return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
}
/**
* 群发接口完成后推送的结果
*
* 本消息有公众号群发助手的微信号“mphelper”推送的消息
* @param $request
*/
public static function eventTemplateSendJobFinish(&$request){
//发送状态成功success用户拒收failed:user block其他原因发送失败failed: system failed
$status = $request['status'];
if($status == 'success'){
//发送成功
}else if($status == 'failed:user block'){
//因为用户拒收而发送失败
}else if($status == 'failed: system failed'){
//其他原因发送失败
}
return true;
}
public static function test(){
// 第三方发送消息给公众平台
$encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG";
$token = "pamtest";
$timeStamp = "1409304348";
@ -273,6 +441,7 @@ class WechatRequest{
$format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>";
$from_xml = sprintf($format, $encrypt);
// 第三方收到公众号平台发送的消息
$msg = '';
$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);
if ($errCode == 0) {
@ -281,6 +450,5 @@ class WechatRequest{
print($errCode . "\n");
}
}
}
}

Loading…
Cancel
Save