wechat.php
<?php
/**
*Author @zhongbo
* 步骤说明
* 1,微信服务器返回一个会话ID
* 2.通过会话ID获得二维码
* 3.轮询手机端是否已经扫描二维码并确认在Web端登录
* 4.访问登录地址,获得uin和sid
* 5.初使化微信信息
* 6.获得所有的好友列表
* 7.保持与服务器的信息同步
* 8.获得别人发来的消息
* 9.向用户发送消息
**/
class wechat {
/**
* uuid 微信服务器返回的会话id
**/
private $uuid = '';
/**
* loginUrl 扫描二维码并确认后返回的登录url
**/
private $loginUrl = '';
/**
* toLingUrl 图灵机器人api
**/
private $tlApi = 'http://www.tuling123.com/openapi/api';
private $tlAppkey = '820176b52352471a943d73a8c304ad32';
/**
* 发起GET请求
*
* @access public
* @param string $url
* @return string
*/
function get($url = '', $cookie = '')
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
if($cookie){
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_REFERER,'https://wx.qq.com');
}
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
/**
* 发起POST请求
*
* @access public
* @param string $url
* @param array $data
* @return string
*/
public function post($url, $data = '', $cookie = '', $type = 0)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
if($cookie){
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_REFERER,'https://wx.qq.com');
}
if($type){
$header = array(
'Content-Type: application/json',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
/**
* 获取当前时间戳精确到毫秒级
*
* @access private
* @return string
*
**/
private function getMillisecond()
{
list($usec, $sec) = explode(" ", microtime());
return (float)sprintf('%.0f',(floatval($usec)+floatval($sec))*1000);
}
/**
* 获取微信服务器返回的一个会话ID
*
* @access public
* @return string
**/
public function getUuid(){
$url = 'https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_='.$this->getMillisecond();
$str = $this->get($url);
preg_match('/"(.*?)"/',$str,$match);
$_SESSION['uuid'] = $match[1];
return $match[1];
}
/**
* 通过会话ID获得二维码
* @access public
* @return string
**/
public function getQrcode($uuid){
$url = 'https://login.weixin.qq.com/qrcode/'.$uuid.'?t=webwx';
return "<img src='$url' />";
}
/**
* 轮询手机端是否已经扫描二维码并确认在Web端登录
* @access public
* @param $uuid string 用户会话id
* @return mixed
**/
public function getLoginStatus($uuid = ''){
$url = sprintf("https://login.wx2.qq.com/cgi-bin/mmwebwx-bin/login?uuid=%s&tip=1&_=%s", $uuid, $this->getMillisecond());
$res = $this->get($url);
preg_match('/=(.*?);/',$res,$match);
if($match[1] == 200){
//登陆成功
preg_match('/redirect_uri="(.*?)";/',$res,$match2);
return $match2[1];
}
return $match[1];
}
/**
* 访问登录地址,获得uin和sid,并且保存cookies
* @access public
* @param $url string 登录地址
* @return array
**/
public function getCookies($url){
$cookie_jar = dirname(__FILE__)."/".$_SESSION['uuid'].".cookie";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_HEADER,1);//如果你想把一个头包含在输出中,
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//将 curl_exec()获取的信息以文件流的形式返回,而不是直接输出。设置为0是直接输出
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);//获取的cookie 保存到指定的 文件路径
$content=curl_exec($ch);
if(curl_errno($ch)){
$info = array('status' => 0, 'msg' => 'Curl error: '.curl_error($ch));
return $info;//这里是设置个错误信息的反馈
}
if($content==false){
$info = array('status' => 0, 'msg' => '无法获取cookies');
return $info;//这里是设置个错误信息的反馈
}
//正则匹配出wxuin、wxsid
preg_match('/wxuin=;/iU',$content,$uin);
preg_match('/wxsid=(.*);/iU',$content,$sid);
preg_match('/webwx_data_ticket=(.*);/iU',$content,$webwx);
//@TODO将wxuin、wxsid、webwx_data_ticket存入cookies,以便获取微信头像----暂无效
/*if(preg_match_all('/Set-Cookie:[\s]+([^=]+)=([^;]+)/i', $content,$match)) {
foreach ($match[1] as $key => $cookieKey ) {
setcookie($cookieKey,$match[2][$key],'36000','','.wx.qq.com');
}
}*/
//将wxuin、wxsid、webwx_data_ticket存入session
$_SESSION['uin'] = @$uin[1];
$_SESSION['sid'] = @$sid[1];
$wxinfo = array(
'uin' => @$uin[1],
'sid' => @$sid[1]
);
curl_close($ch);
return $wxinfo;
}
/**
* 登录成功,初始化微信信息
* @access public
* @param $uin string 用户uin
* @param $sid string 用户sid
* @return mixed
**/
public function initWebchat($uin = '', $sid = ''){
$cookie_jar = dirname(__FILE__)."/".$_SESSION['uuid'].".cookie";
$url = sprintf("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=%s", $this->getMillisecond());
if(!$uin || !$sid){
$uin = $_SESSION['uin'];
$sid = $_SESSION['sid'];
}
$data['BaseRequest'] = array(
'Uin' => $uin,
'Sid' => $sid,
'Skey' => '',
'DeviceID' => 'e189320295398756'
);
$res = $this->post($url, json_encode($data),$cookie_jar);
//将登陆用户username、nickname存入session中
$user = json_decode($res, true);
$_SESSION['username'] = $user['User']['UserName'];
$_SESSION['nickname'] = $user['User']['NickName'];
return $res;
}
/**
* 获取全部联系人
* @access public
* @param $uin string 用户uin
* @param $sid string 用户sid
* @return mixed
**/
public function getContact($uin = '', $sid = ''){
$cookie_jar = dirname(__FILE__)."/".$_SESSION['uuid'].".cookie";
$url = sprintf("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&r=%s&seq=0", $this->getMillisecond());
if(!$uin || !$sid){
$uin = $_SESSION['uin'];
$sid = $_SESSION['sid'];
}
$res = $this->post($url, '{}',$cookie_jar);
return $res;
}
/**
* 登录成功,保持与服务器的信息同步,获取是否有推送消息等
* @access public
* @param $synckey string
* @return mixed
**/
public function wxsync($synckey){
$uin = $_SESSION['uin'];
$sid = $_SESSION['sid'];
$cookie_jar = dirname(__FILE__)."/".$_SESSION['uuid'].".cookie";
$url = sprintf("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=%s", $sid);
$data['BaseRequest'] = array(
'Uin' => $uin,
'Sid' => $sid,
'Skey' => '',
'DeviceID' => 'e189320295398756'
);
$data['SyncKey'] = json_decode($synckey);
$data['rr'] = time();
$res = $this->post($url, json_encode($data),$cookie_jar);
return $res;
}
/**
* 发送消息
* @access public
* @param $toUsername string
* @return mixed
**/
public function sendMessage($toUsername = '', $content = ''){
$uin = $_SESSION['uin'];
$sid = $_SESSION['sid'];
$cookie = dirname(__FILE__)."/".$_SESSION['uuid'].".cookie";
$url = sprintf("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?sid=%s&r=%s",$sid,$this->getMillisecond());
$data['BaseRequest'] = array(
'Uin' => $uin,
'Sid' => $sid,
'Skey' => "",
'DeviceID' => "e287276317582836"
);
$data['Msg'] = array(
'ClientMsgId' => $this->getMillisecond(),
'Content' => $content,
'FromUserName' => $_SESSION['username'],
'LocalID' => $this->getMillisecond(),
'ToUserName' => $toUsername,
'Type' => 1
);
$data['Scene'] = 0;
//json_encode JSON_UNESCAPED_UNICODE防止将汉字转义为unicode字符
$res = $this->post($url, json_encode($data,JSON_UNESCAPED_UNICODE),$cookie);
return $res;
}
/**
* 获取头像
* @access public
* @param $uri string 头像地址
* @return mixed
**/
public function getAvatar($uri = ''){
$cookie = dirname(__FILE__)."/".$_SESSION['uuid'].".cookie";
$url = "https://wx.qq.com".$uri;
$res = $this->get($url, $cookie);
echo $res;
}
/**
* 图灵机器人 =》文本
* @access public
* @param $toUsername string
* @return mixed
**/
public function sendMessageToTuling($content = ''){
$data = array(
'key' => $this->tlAppkey,
'info' => $content,
'userid' => '123456789'
);
$res = $this->post($this->tlApi,json_encode($data,JSON_UNESCAPED_UNICODE),'',1);
$r = json_decode($res,true);
//文本类
if(isset($r['url'])){
//存在链接则发送链接
return $r['url'];
}
return $r['text'];
}
//转换为UTF-8
public function characet($data){
if( !empty($data) ){
$fileType = mb_detect_encoding($data , array('UTF-8','GBK','LATIN1','BIG5')) ;
if( $fileType != 'UTF-8'){
$data = mb_convert_encoding($data ,'utf-8' , $fileType);
}
}
return $data;
}
}
wechat.php的更多相关文章
- 教程三:Wechat库的使用
上一篇教程中我们提供了wechat的php的库,这里我们简要介绍一个这个库的源码和使用.这个库的主文件为`Wechat.php`,其余的几个文件都是为这个文件服务的,提供加解密,消息拼接等功能.`We ...
- 如何保存微信的小视频 How to keep WeChat 'Sights'
微信小视频非常方便,但很难将其下载到本地电脑长期保存.网上有介绍方法,如百度经验上办法,但目前看来它可能只适用安卓系统,而且或已失效(可能由于版本更新).对Windows Phone无效,而对于更加封 ...
- win环境 yii2 框架 overtrue/wechat 包 由 sys_get_temp_dir 引发的 the directory "c:\Windows" is not writable
vendor\overtrue\wechat\src\Foundation\Application.php registerBase 方法 在初始化属性时 $this['cache'] = funct ...
- 开源库Magicodes.WeChat.SDK总体介绍
目录 1 概要 1 2 主要特点 2 3 架构图 8 3.1 构造器——WeChatSDKBuilder 8 3.2 函数管理器——WeChatF ...
- 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发
概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...
- [转]微信公众平台WeChat PHP SDK
地址:https://github.com/dodgepudding/wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用 微信支付接入文档: https://mp. ...
- 微信和WeChat的合并月活跃账户数达到7.62亿了
昨日,腾讯公布了截至2016年3月31日未经审核的第一季度综合业绩,其中财报显示微信和WeChat的合并月活跃账户数达到7.62亿,比去年同期增长39%.网络广告业务的收入同比增长73%至2016年第 ...
- 微信和WeChat的合并月活跃账户达6.97亿
腾讯最新财报显示,微信和WeChat的合并月活跃账户于2015年底达6.97亿,同比增长39%.2016年初春节假期期间,通过微信支付收发的红包数量仅在6天内就超过320亿,同比增长9倍. 腾讯网络广 ...
- 微信发明人竟是他!也是WeChat/Line/WhatsApp的发明者
赵建文,很多人不知道他是谁:说到微信大家都耳熟能详吧?没错,他就是初始微信发明人,同时也是WeChat/Line/WhatsApp的发明者!正是他的专利<一种基于或囊括手机电话本的即时通讯方法和 ...
- 集成 WeChat SDK - 支付篇
作者感言 惯例, 开头都是要说些东西的了, 随着现在的App越来越商业化, 很多公司的App都会集成第三方的支付SDK, 这样子的成本就比较低, 但是呢, 有很多朋友还是不太会集成, 也不太爱看集成文 ...
随机推荐
- 处理ajax数据;数据渲染
当我们用ajax把数据拿到前台,该如何渲染到页面,有以下几种方式: 一:使用字符串拼接的方法 声明一个空变量,然后拼接 var st=""; st+="<div&g ...
- JS判断图片是否加载完成 背景图404 快到碗里来
面对这个问题 我最多做到表面笑嘻嘻 …… 真不知道测试怎么那么…… 啥都能给你测出来 有的没的都能给你测出来 算了算了 谁让本仙女本精灵本可爱温柔大方善解人意呢 …呵呵呵 ————————————正 ...
- 使用Typescript实现依赖注入(DI)
前言DI总是和ico相辅相成的,如果想对DI有更多的了解,可以移步我的另一篇文章 依赖注入(DI)和控制反转(IOC),再次我就不多做赘述了. 前几天看见一道面试题,今天借这个话题想跟大家分享一下: ...
- NC 自定义项参照设置为查询条件
select * from pub_query_condition where pk_templet in (select id from pub_query_templet where node_c ...
- HTML5-桌面提醒功能
window.webkitNotifications.requestPermission(); statue = window.webkitNotifications.checkPermission( ...
- openstack镜像制作centos7
1,找一台宿主机安装kvm并检查是否支持虚拟化,这里我用的是vmware来做宿主机 egrep '(vmx|svm)' /proc/cpuinfo 然后安装kvm: yum install epel- ...
- Java:ConcurrentHashMap支持完全并发的读
ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁.(事实上,ConcurrentHashMap支持完全并发的读以及一定程度并发的写.)如果使用传统的技术,如HashMa ...
- IOS 设置视图半透明子控件不透明
代码处理: UIColor *color = [[UIColor blackColor] colorWithAlphaComponent:0.6]; self.view.backgroundColor ...
- Liang-Barsky直线段裁剪算法
Liang-Barsky直线段裁剪算法 梁友栋与Barsky提出的裁剪算法以直线的参数方程为基础,把判断直线段与窗口边界求交的 二维裁剪问题转化为求解一组不等式,确定直线段参数的一维裁剪问题.设起点为 ...
- (PMP)第5章-----项目范围管理
产品范围:所具有的特征和功能 项目范围:必须完成的工作. 5.1 规划范围管理 输入 工具与技术 输出 1.项目章程 2.项目管理计划 (质量管理计划, 项目生命周期描述, 开发方法) 3.事业环境因 ...