PHP微信网页版功能分析
提供微信网页版接口分析:
全部接口参照:http://blog.csdn.net/qq_27263649/article/details/52750877
- 首先说明一点:微信目前分为2个版本,所以在获取接口时候请求的路径也不一样,很早以前注册的用户请求地址一般为wx.qq.com,新注册用户为wx2.qq.com,导致很多开发者在开发微信网页版的时候返现有些用户能登录并获取到消息,有的只能登录不能获取到消息
- 第二点:给大家介绍一下微信返回码RetCode和相应的解决方案:0-正常;1-失败,refresh;1101/1100-登出/失败,refresh/重新登录;1203-恭喜您,几个小时后重试,没有解决方案;Selector:2-新消息,6/7-进入/离开聊天界面通常是在手机上进行操作,重新初始化即可,0-正常;话不多说,上代码!
登录
/**
* 获取uuid
* @param: appid = 'wx782c26e4c19acffb'
*/
public function get_uuid($appid)
{
$url = 'https://login.weixin.qq.com/jslogin';
$url .= '?appid=' . $appid;
$url .= '&fun=new';
$url .= '&lang=zh_CN';
$url .= '&_=' . time();
//使用curl进行抓取页面信息
$content = $this->curlPost($url);
//抓取出来的信息使用正则匹配,正则不好的同学也可以学我这样
$content = explode(';', $content);
$content_uuid = explode('"', $content[1]);
$uuid = $content_uuid[1];
return $uuid;
}
生成登录二维码
/**
* 生成登录二维码
* @param:uuid
*/
public function qrcode($uuid)
{
$url = 'https://login.weixin.qq.com/qrcode/' . $uuid . '?t=webwx';
$html = "<img class='img' src=" . $url . "/>";
return $html;
}
这部分很简单不多解释。
获取回调地址
/**
* 获取回调地址
* @param:uuid
*/
public function get_uri($uuid)
{
$url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=' . $uuid. '&tip=0&_=e' . time();
$content = $this->curlPost($url);
$content = explode(';', $content);
$content_uri = explode('"', $content[1]);
$uri = $content_uri[1];
//重点:根据不同版本的微信返回的回调地址是不同的匹配出相应的回调头地址
preg_match("~^https:?(//([^/?#]*))?~", $uri, $match);
$https_header = $match[0];
session('https_header', $https_header);
$base_url = $_SESSION['https_header'] . "/cgi-bin/mmwebwx-bin";
session('base_url', $base_url);
$new_uri = explode('scan', $uri);
$uri = $new_uri[0] . 'fun=new&scan=' . time();
$res = $this->curlPost($uri);
if (!$res) {
$this->error("登录超时", 'index');
}
$res = simplexml_load_string($res);
$data = (array)$res;
return $data;
}
初始化
/**
* 初始化
*/
/**
* 获取post数据
*/
public function get_self($data)
{
$ret = $data['ret'];
if ($ret == '1203') {
$this->error('未知错误,请2小时后重试', 'index');
}
if ($ret == '0') {
$this->self->BaseRequest = array(
'Uin' => $data['wxuin'],
'Sid' => $data['wxsid'],
'Skey' => $data['skey'],
'DeviceID' => 'e' . rand(10000000, 99999999) . rand(1000000, 9999999),
//16位
);
$this->self->skey = $data['skey'];
$this->self->pass_ticket = $data['pass_ticket'];
$this->self->sid = $data['wxsid'];
$this->self->uin = $data['wxuin'];
session('self', $this->self);
return $this->self;
} else {
return $ret;
}
}
/**
* 获取MsgId
*/
public
function wxstatusnotify()
{
$self = $_SESSION['self'];
$User = $self->User;
$url = $_SESSION['base_url'] . '/webwxstatusnotify?lang=zh_CN&pass_ticket=' . $self->pass_ticket;
$params = array(
'BaseRequest' => $self->BaseRequest,
"Code" => 3,
"FromUserName" => $User['UserName'],
"ToUserName" => $User['UserName'],
"ClientMsgId" => time()
);
$res = $this->curlPost($url, $params);
$res = json_decode($res, true);
return $res;
}
/**
* 获取联系人
*params:JSON
*/
public function webwxgetcontact()
{
$self = $_SESSION['self'];
$url = $_SESSION['base_url'] . '/webwxgetcontact?pass_ticket=' . $self->pass_ticket . '&seq=0&skey=' . $self->skey . '&r=' . time();
$params['BaseRequest'] = $self->BaseRequest;
$data = $this->curlPost($url, $params);
return $data;
}
/**
* 获取当前活跃群信息
*/
public function webwxbatchgetcontact($self, $group_list)
{
$url = $_SESSION['base_url'] . '/webwxbatchgetcontact?type=ex&lang=zh_CN&r=' . time() . '&pass_ticket=' . $self->pass_ticket;
$params['BaseRequest'] = $self->BaseRequest;
$params['Count'] = count($group_list);
foreach ($group_list as $key => $value) {
if ($value[MemberCount] == 0) {
$params['List'][] = array(
'UserName' => $value['UserName'],
'ChatRoomId' => "",
);
}
$params['List'][] = array(
'UserName' => $value['UserName'],
'EncryChatRoomId' => "",
);
}
$data = $this->curlPost($url, $params);
$data = json_decode($data, true);
if ($data['BaseResponse']['Ret'] == '1205') {
foreach ($group_list['MemberList'] as $key => $value) {
$value['NickName'] = $this->getFriend($value['UserName']);
if (!$value['NickName']) {
$value['NickName'] = '非好友';
}
}
$data = $group_list;
}
return $data;
}
/**
* 心跳检测 0正常;1101失败/登出;2新消息;7不要耍手机了我都收不到消息了;
*/
public
function synccheck()
{
$self = $_SESSION['self'];
$SyncKey = $_SESSION['synckey'];
if (!$SyncKey['List']) {
$SyncKey = $_SESSION['json']['SyncKey'];
}
foreach ($SyncKey['List'] as $key => $value) {
if ($key == 1) {
$SyncKey_value = $value['Key'] . '_' . $value['Val'];
} else {
$SyncKey_value .= '|' . $value['Key'] . '_' . $value['Val'];
}
}
$header = array(
'0' => 'https://webpush.wx2.qq.com',
'1' => 'https://webpush.wx.qq.com',
);
foreach ($header as $key => $value) {
$url = $value . "/cgi-bin/mmwebwx-bin/synccheck?r=" . getMillisecond() . "&skey=" . urlencode($self->skey) . "&sid=" . $self->sid . "&deviceid=" . $self->BaseRequest['DeviceID'] . "&uin=" . $self->uin . "&synckey=" . urlencode($SyncKey_value) . "&_=" . getMillisecond();
//getMillisecond()时间戳15位
$data[] = $this->curlPost($url);
}
foreach ($data as $k => $val) {
$rule = '/window.synccheck={retcode:"(\d+)",selector:"(\d+)"}/';
preg_match($rule, $data[$k], $match);
if ($match[1] == '0') {
$retcode = $match[1];
$selector = $match[2];
}
}
$status = array(
'ret' => $retcode,
'sel' => $selector,
);
return $status;
}
/**
* 获取最新消息
*/
public
function webwxsync()
{
$self = $_SESSION['self'];
$SyncKey = $_SESSION['synckey'];
$url = $_SESSION['https_header'] . '/cgi-bin/mmwebwx-bin/webwxsync?sid=' . $self->sid . '&skey=' . $self->skey . '&pass_ticket=' . $self->pass_ticket;
$params = array(
'BaseRequest' => $self->BaseRequest,
'SyncKey' => $SyncKey,
'rr' => ~time(),
);
$data = $this->curlPost($url, $params);
return $data;
}
/**
* 发送消息
*/
public function sendMsg($username, $content)
{
header("Content-Type: text/html; charset=UTF-8");
$this->webwxsendmsg($_SESSION['self'], $username, $content);
}
/**
* 发送消息
*/
public
function webwxsendmsg($self, $to, $word)
{
header("Content-Type: text/html; charset=UTF-8");
$url = $_SESSION['https_header'] . '/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=' . $self->pass_ticket;
$clientMsgId = getMillisecond() * 1000 + rand(1000, 9999);
$params = array(
'Msg' => array(
"Type" => 1,
"Content" => $word,
"FromUserName" => $self->User['UserName'],
"ToUserName" => $to,
"LocalID" => $clientMsgId,
"ClientMsgId" => $clientMsgId
),
'BaseRequest' => $self->BaseRequest,
);
$data = $this->curlPost($url, $params, 1);
return $data;
}
好了不多解释了,有问题github:https://github.com/yjliushigui/wxrobot
转载请注名出处http://blog.csdn.net/qq_27263649/article/details/52701181