日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

git wechat.class.php,wechat-php-sdk/qywechat.class.php at master · gitye/wechat-php-sdk · GitHub

發布時間:2024/9/27 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git wechat.class.php,wechat-php-sdk/qywechat.class.php at master · gitye/wechat-php-sdk · GitHub 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/**

*微信公眾平臺企業號PHP-SDK, 官方API類庫

* @author binsee

* @link https://github.com/binsee/wechat-php-sdk

* @version 1.0

* usage:

* $options = array(

*'token'=>'tokenaccesskey', //填寫應用接口的Token

*'encodingaeskey'=>'encodingaeskey', //填寫加密用的EncodingAESKey

*'appid'=>'wxdk1234567890', //填寫高級調用功能的app id

*'appsecret'=>'xxxxxxxxxxxxxxxxxxx', //填寫高級調用功能的密鑰

*'agentid'=>'1', //應用的id

*'debug'=>false, //調試開關

*'_logcallback'=>'logg', //調試輸出方法,需要有一個string類型的參數

*);

*

*/

class Wechat

{

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';

const API_URL_PREFIX = 'https://qyapi.weixin.qq.com/cgi-bin';

const USER_CREATE_URL = '/user/create?';

const USER_UPDATE_URL = '/user/update?';

const USER_DELETE_URL = '/user/delete?';

const USER_GET_URL = '/user/get?';

const USER_LIST_URL = '/user/simplelist?';

const USER_GETINFO_URL = '/user/getuserinfo?';

const DEPARTMENT_CREATE_URL = '/department/create?';

const DEPARTMENT_UPDATE_URL = '/department/update?';

const DEPARTMENT_DELETE_URL = '/department/delete?';

const DEPARTMENT_MOVE_URL = '/department/move?';

const DEPARTMENT_LIST_URL = '/department/list?';

const TAG_CREATE_URL = '/tag/create?';

const TAG_UPDATE_URL = '/tag/update?';

const TAG_DELETE_URL = '/tag/delete?';

const TAG_GET_URL = '/tag/get?';

const TAG_ADDUSER_URL = '/tag/addtagusers?';

const TAG_DELUSER_URL = '/tag/deltagusers?';

const TAG_LIST_URL = '/tag/list?';

const MEDIA_UPLOAD_URL = '/media/upload?';

const MEDIA_GET_URL = '/media/get?';

const AUTHSUCC_URL = '/user/authsucc?';

const MASS_SEND_URL = '/message/send?';

const MENU_CREATE_URL = '/menu/create?';

const MENU_GET_URL = '/menu/get?';

const MENU_DELETE_URL = '/menu/delete?';

const TOKEN_GET_URL = '/gettoken?';

const OAUTH_PREFIX = 'https://open.weixin.qq.com/connect/oauth2';

const OAUTH_AUTHORIZE_URL = '/authorize?';

private $token;

private $encodingAesKey;

private $appid; //也就是企業號的CorpID

private $appsecret;

private $access_token;

private $agentid; //應用id AgentID

private $postxml;

private $agentidxml; //接收的應用id AgentID

private $_msg;

private $_receive;

private $_sendmsg; //主動發送消息的內容

private $_text_filter = true;

public $debug = false;

public $errCode = 40001;

public $errMsg = "no access";

private $_logcallback;

public function __construct($options)

{

$this->token = isset($options['token'])?$options['token']:'';

$this->encodingAesKey = isset($options['encodingaeskey'])?$options['encodingaeskey']:'';

$this->appid = isset($options['appid'])?$options['appid']:'';

$this->appsecret = isset($options['appsecret'])?$options['appsecret']:'';

$this->agentid = isset($options['agentid'])?$options['agentid']:'';

$this->debug = isset($options['debug'])?$options['debug']:false;

$this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false;

}

private function log($log){

if ($this->debug && function_exists($this->_logcallback)) {

if (is_array($log)) $log = print_r($log,true);

return call_user_func($this->_logcallback,$log);

}

}

/**

* 數據XML編碼

* @param mixed $data 數據

* @return string

*/

public static function data_to_xml($data) {

$xml = '';

foreach ($data as $key => $val) {

is_numeric($key) && $key = "item id=\"$key\"";

$xml .= "";

$xml .= ( is_array($val) || is_object($val)) ? self::data_to_xml($val) : self::xmlSafeStr($val);

list($key, ) = explode(' ', $key);

$xml .= "$key>";

}

return $xml;

}

public static function xmlSafeStr($str)

{

return '';

}

/**

* XML編碼

* @param mixed $data 數據

* @param string $root 根節點名

* @param string $item 數字索引的子節點名

* @param string $attr 根節點屬性

* @param string $id 數字索引子節點key轉換的屬性名

* @param string $encoding 數據編碼

* @return string

*/

public function xml_encode($data, $root='xml', $item='item', $attr='', $id='id', $encoding='utf-8') {

if(is_array($attr)){

$_attr = array();

foreach ($attr as $key => $value) {

$_attr[] = "{$key}=\"{$value}\"";

}

$attr = implode(' ', $_attr);

}

$attr = trim($attr);

$attr = empty($attr) ? '' : " {$attr}";

$xml = "";

$xml .= self::data_to_xml($data, $item, $id);

$xml .= "{$root}>";

return $xml;

}

/**

* 微信api不支持中文轉義的json結構

* @param array $arr

*/

static function json_encode($arr) {

$parts = array ();

$is_list = false;

//Find out if the given array is a numerical array

$keys = array_keys ( $arr );

$max_length = count ( $arr ) - 1;

if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1

$is_list = true;

for($i = 0; $i < count ( $keys ); $i ++) { //See if each key correspondes to its position

if ($i != $keys [$i]) { //A key fails at position check.

$is_list = false; //It is an associative array.

break;

}

}

}

foreach ( $arr as $key => $value ) {

if (is_array ( $value )) { //Custom handling for arrays

if ($is_list)

$parts [] = self::json_encode ( $value ); /* :RECURSION: */

else

$parts [] = '"' . $key . '":' . self::json_encode ( $value ); /* :RECURSION: */

} else {

$str = '';

if (! $is_list)

$str = '"' . $key . '":';

//Custom handling for multiple data types

if (!is_string ( $value ) && is_numeric ( $value ) && $value<2000000000)

$str .= $value; //Numbers

elseif ($value === false)

$str .= 'false'; //The booleans

elseif ($value === true)

$str .= 'true';

else

$str .= '"' . addslashes ( $value ) . '"'; //All other things

// :TODO: Is there any more datatype we should be in the lookout for? (Object?)

$parts [] = $str;

}

}

$json = implode ( ',', $parts );

if ($is_list)

return '[' . $json . ']'; //Return numerical JSON

return '{' . $json . '}'; //Return associative JSON

}

/**

* 過濾文字回復\r\n換行符

* @param string $text

* @return string|mixed

*/

private function _auto_text_filter($text) {

if (!$this->_text_filter) return $text;

return str_replace("\r\n", "\n", $text);

}

/**

* GET 請求

* @param string $url

*/

private function http_get($url){

$oCurl = curl_init();

if(stripos($url,"https://")!==FALSE){

curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);

curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1

}

curl_setopt($oCurl, CURLOPT_URL, $url);

curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );

$sContent = curl_exec($oCurl);

$aStatus = curl_getinfo($oCurl);

curl_close($oCurl);

if(intval($aStatus["http_code"])==200){

return $sContent;

}else{

return false;

}

}

/**

* POST 請求

* @param string $url

* @param array $param

* @param boolean $post_file 是否文件上傳

* @return string content

*/

private function http_post($url,$param,$post_file=false){

$oCurl = curl_init();

if(stripos($url,"https://")!==FALSE){

curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1

}

if (is_string($param) || $post_file) {

$strPOST = $param;

} else {

$aPOST = array();

foreach($param as $key=>$val){

$aPOST[] = $key."=".urlencode($val);

}

$strPOST = join("&", $aPOST);

}

curl_setopt($oCurl, CURLOPT_URL, $url);

curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );

curl_setopt($oCurl, CURLOPT_POST,true);

curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);

$sContent = curl_exec($oCurl);

$aStatus = curl_getinfo($oCurl);

curl_close($oCurl);

if(intval($aStatus["http_code"])==200){

return $sContent;

}else{

return false;

}

}

/**

* For weixin server validation

*/

private function checkSignature($str)

{

$signature = isset($_GET["msg_signature"])?$_GET["msg_signature"]:'';

$timestamp = isset($_GET["timestamp"])?$_GET["timestamp"]:'';

$nonce = isset($_GET["nonce"])?$_GET["nonce"]:'';

$tmpArr = array($str,$this->token, $timestamp, $nonce);//比普通公眾平臺多了一個加密的密文

sort($tmpArr, SORT_STRING);

$tmpStr = implode($tmpArr);

$shaStr = sha1($tmpStr);

if( $shaStr == $signature ){

return true;

}else{

return false;

}

}

/**

* 微信驗證,包括post來的xml解密

* @param bool $return 是否返回

*/

public function valid($return=false)

{

$encryptStr="";

if ($_SERVER['REQUEST_METHOD'] == "POST") {

$postStr = file_get_contents("php://input");

$array = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

$this->log($postStr);

if (isset($array['Encrypt'])) {

$encryptStr = $array['Encrypt'];

$this->agentidxml = isset($array['AgentID']) ? $array['AgentID']: '';

}

} else {

$encryptStr = isset($_GET["echostr"]) ? $_GET["echostr"]: '';

}

if ($encryptStr) {

$ret=$this->checkSignature($encryptStr);

}

if (!isset($ret) || !$ret) {

if (!$return) {

die('no access');

} else {

return false;

}

}

$pc = new Prpcrypt($this->encodingAesKey);

$array = $pc->decrypt($encryptStr,$this->appid);

if (!isset($array[0]) || ($array[0] != 0)) {

if (!$return) {

die('解密失敗!');

} else {

return false;

}

}

if ($_SERVER['REQUEST_METHOD'] == "POST") {

$this->postxml = $array[1];

//$this->log($array[1]);

return ($this->postxml!="");

} else {

$echoStr = $array[1];

if ($return) {

return $echoStr;

} else {

die($echoStr);

}

}

return false;

}

/**

* 獲取微信服務器發來的信息

*/

public function getRev()

{

if ($this->_receive) return $this;

$postStr = $this->postxml;

$this->log($postStr);

if (!empty($postStr)) {

$this->_receive = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

if (!isset($this->_receive['AgentID'])) {

$this->_receive['AgentID']=$this->agentidxml; //當前接收消息的應用id

}

}

return $this;

}

/**

* 獲取微信服務器發來的信息

*/

public function getRevData()

{

return $this->_receive;

}

/**

* 獲取微信服務器發來的原始加密信息

*/

public function getRevPostXml()

{

return $this->postxml;

}

/**

* 獲取消息發送者

*/

public function getRevFrom() {

if (isset($this->_receive['FromUserName']))

return $this->_receive['FromUserName'];

else

return false;

}

/**

* 獲取消息接受者

*/

public function getRevTo() {

if (isset($this->_receive['ToUserName']))

return $this->_receive['ToUserName'];

else

return false;

}

/**

* 獲取接收消息的應用id

*/

public function getRevAgentID() {

if (isset($this->_receive['AgentID']))

return $this->_receive['AgentID'];

else

return false;

}

/**

* 獲取接收消息的類型

*/

public function getRevType() {

if (isset($this->_receive['MsgType']))

return $this->_receive['MsgType'];

else

return false;

}

/**

* 獲取消息ID

*/

public function getRevID() {

if (isset($this->_receive['MsgId']))

return $this->_receive['MsgId'];

else

return false;

}

/**

* 獲取消息發送時間

*/

public function getRevCtime() {

if (isset($this->_receive['CreateTime']))

return $this->_receive['CreateTime'];

else

return false;

}

/**

* 獲取接收消息內容正文

*/

public function getRevContent(){

if (isset($this->_receive['Content']))

return $this->_receive['Content'];

else

return false;

}

/**

* 獲取接收消息圖片

*/

public function getRevPic(){

if (isset($this->_receive['PicUrl']))

return array(

'mediaid'=>$this->_receive['MediaId'],

'picurl'=>(string)$this->_receive['PicUrl'], //防止picurl為空導致解析出錯

);

else

return false;

}

/**

* 獲取接收地理位置

*/

public function getRevGeo(){

if (isset($this->_receive['Location_X'])){

return array(

'x'=>$this->_receive['Location_X'],

'y'=>$this->_receive['Location_Y'],

'scale'=>(string)$this->_receive['Scale'],

'label'=>(string)$this->_receive['Label']

);

} else

return false;

}

/**

* 獲取上報地理位置事件

*/

public function getRevEventGeo(){

if (isset($this->_receive['Latitude'])){

return array(

'x'=>$this->_receive['Latitude'],

'y'=>$this->_receive['Longitude'],

'precision'=>$this->_receive['Precision'],

);

} else

return false;

}

/**

* 獲取接收事件推送

*/

public function getRevEvent(){

if (isset($this->_receive['Event'])){

$array['event'] = $this->_receive['Event'];

}

if (isset($this->_receive['EventKey'])){

$array['key'] = $this->_receive['EventKey'];

}

if (isset($array) && count($array) > 0) {

return $array;

} else {

return false;

}

}

/**

* 獲取自定義菜單的掃碼推事件信息

*

* 事件類型為以下兩種時則調用此方法有效

* Event 事件類型,scancode_push

* Event 事件類型,scancode_waitmsg

*

* @return: array | false

* array (

* 'ScanType'=>'qrcode',

* 'ScanResult'=>'123123'

* )

*/

public function getRevScanInfo(){

if (isset($this->_receive['ScanCodeInfo'])){

if (!is_array($this->_receive['SendPicsInfo'])) {

$array=(array)$this->_receive['ScanCodeInfo'];

$this->_receive['ScanCodeInfo']=$array;

}else {

$array=$this->_receive['ScanCodeInfo'];

}

}

if (isset($array) && count($array) > 0) {

return $array;

} else {

return false;

}

}

/**

* 獲取自定義菜單的圖片發送事件信息

*

* 事件類型為以下三種時則調用此方法有效

* Event 事件類型,pic_sysphoto 彈出系統拍照發圖的事件推送

* Event 事件類型,pic_photo_or_album 彈出拍照或者相冊發圖的事件推送

* Event 事件類型,pic_weixin 彈出微信相冊發圖器的事件推送

*

* @return: array | false

* array (

* 'Count' => '2',

* 'PicList' =>array (

* 'item' =>array (

* 0 =>array ('PicMd5Sum' => 'aaae42617cf2a14342d96005af53624c'),

* 1 =>array ('PicMd5Sum' => '149bd39e296860a2adc2f1bb81616ff8'),

* ),

* ),

* )

*

*/

public function getRevSendPicsInfo(){

if (isset($this->_receive['SendPicsInfo'])){

if (!is_array($this->_receive['SendPicsInfo'])) {

$array=(array)$this->_receive['SendPicsInfo'];

if (isset($array['PicList'])){

$array['PicList']=(array)$array['PicList'];

$item=$array['PicList']['item'];

$array['PicList']['item']=array();

foreach ( $item as $key => $value ){

$array['PicList']['item'][$key]=(array)$value;

}

}

$this->_receive['SendPicsInfo']=$array;

} else {

$array=$this->_receive['SendPicsInfo'];

}

}

if (isset($array) && count($array) > 0) {

return $array;

} else {

return false;

}

}

/**

* 獲取自定義菜單的地理位置選擇器事件推送

*

* 事件類型為以下時則可以調用此方法有效

* Event 事件類型,location_select 彈出系統拍照發圖的事件推送

*

* @return: array | false

* array (

* 'Location_X' => '33.731655000061',

* 'Location_Y' => '113.29955200008047',

* 'Scale' => '16',

* 'Label' => '某某市某某區某某路',

* 'Poiname' => '',

* )

*

*/

public function getRevSendGeoInfo(){

if (isset($this->_receive['SendLocationInfo'])){

if (!is_array($this->_receive['SendLocationInfo'])) {

$array=(array)$this->_receive['SendLocationInfo'];

if (empty($array['Poiname'])) {

$array['Poiname']="";

}

if (empty($array['Label'])) {

$array['Label']="";

}

$this->_receive['SendLocationInfo']=$array;

} else {

$array=$this->_receive['SendLocationInfo'];

}

}

if (isset($array) && count($array) > 0) {

return $array;

} else {

return false;

}

}

/**

* 獲取接收語音推送

*/

public function getRevVoice(){

if (isset($this->_receive['MediaId'])){

return array(

'mediaid'=>$this->_receive['MediaId'],

'format'=>$this->_receive['Format'],

);

} else

return false;

}

/**

* 獲取接收視頻推送

*/

public function getRevVideo(){

if (isset($this->_receive['MediaId'])){

return array(

'mediaid'=>$this->_receive['MediaId'],

'thumbmediaid'=>$this->_receive['ThumbMediaId']

);

} else

return false;

}

/**

* 設置回復消息

* Example: $obj->text('hello')->reply();

* @param string $text

*/

public function text($text='')

{

$msg = array(

'ToUserName' => $this->getRevFrom(),

'FromUserName'=>$this->getRevTo(),

'MsgType'=>self::MSGTYPE_TEXT,

'Content'=>$this->_auto_text_filter($text),

'CreateTime'=>time(),

);

$this->Message($msg);

return $this;

}

/**

* 設置回復消息

* Example: $obj->image('media_id')->reply();

* @param string $mediaid

*/

public function image($mediaid='')

{

$msg = array(

'ToUserName' => $this->getRevFrom(),

'FromUserName'=>$this->getRevTo(),

'MsgType'=>self::MSGTYPE_IMAGE,

'Image'=>array('MediaId'=>$mediaid),

'CreateTime'=>time(),

);

$this->Message($msg);

return $this;

}

/**

* 設置回復消息

* Example: $obj->voice('media_id')->reply();

* @param string $mediaid

*/

public function voice($mediaid='')

{

$msg = array(

'ToUserName' => $this->getRevFrom(),

'FromUserName'=>$this->getRevTo(),

'MsgType'=>self::MSGTYPE_IMAGE,

'Voice'=>array('MediaId'=>$mediaid),

'CreateTime'=>time(),

);

$this->Message($msg);

return $this;

}

/**

* 設置回復消息

* Example: $obj->video('media_id','title','description')->reply();

* @param string $mediaid

*/

public function video($mediaid='',$title='',$description='')

{

$msg = array(

'ToUserName' => $this->getRevFrom(),

'FromUserName'=>$this->getRevTo(),

'MsgType'=>self::MSGTYPE_IMAGE,

'Video'=>array(

'MediaId'=>$mediaid,

'Title'=>$title,

'Description'=>$description

),

'CreateTime'=>time(),

);

$this->Message($msg);

return $this;

}

/**

* 設置回復圖文

* @param array $newsData

* 數組結構:

* array(

* "0"=>array(

* 'Title'=>'msg title',

* 'Description'=>'summary text',

* 'PicUrl'=>'http://www.domain.com/1.jpg',

* 'Url'=>'http://www.domain.com/1.html'

* ),

* "1"=>....

* )

*/

public function news($newsData=array())

{

$count = count($newsData);

$msg = array(

'ToUserName' => $this->getRevFrom(),

'FromUserName'=>$this->getRevTo(),

'MsgType'=>self::MSGTYPE_NEWS,

'CreateTime'=>time(),

'ArticleCount'=>$count,

'Articles'=>$newsData,

);

$this->Message($msg);

return $this;

}

/**

* 設置發送消息

* @param array $msg 消息數組

* @param bool $append 是否在原消息數組追加

*/

public function Message($msg = '',$append = false){

if (is_null($msg)) {

$this->_msg =array();

}elseif (is_array($msg)) {

if ($append)

$this->_msg = array_merge($this->_msg,$msg);

else

$this->_msg = $msg;

return $this->_msg;

} else {

return $this->_msg;

}

}

/**

*

* 回復微信服務器, 此函數支持鏈式操作

* Example: $this->text('msg tips')->reply();

* @param string $msg 要發送的信息, 默認取$this->_msg

* @param bool $return 是否返回信息而不拋出到瀏覽器 默認:否

*/

public function reply($msg=array(),$return = false)

{

if (empty($msg))

$msg = $this->_msg;

$xmldata= $this->xml_encode($msg);

$this->log($xmldata);

$pc = new Prpcrypt($this->encodingAesKey);

$array = $pc->encrypt($xmldata, $this->appid);

$ret = $array[0];

if ($ret != 0) {

$this->log('encrypt err!');

return false;

}

$timestamp = time();

$nonce = rand(77,999)*rand(605,888)*rand(11,99);

$encrypt = $array[1];

$tmpArr = array($this->token, $timestamp, $nonce,$encrypt);//比普通公眾平臺多了一個加密的密文

sort($tmpArr, SORT_STRING);

$signature = implode($tmpArr);

$signature = sha1($signature);

$smsg = $this->generate($encrypt, $signature, $timestamp, $nonce);

$this->log($smsg);

if ($return)

return $smsg;

elseif ($smsg){

echo $smsg;

return true;

}else

return false;

}

private function generate($encrypt, $signature, $timestamp, $nonce)

{

//格式化加密信息

$format = "

%s

";

return sprintf($format, $encrypt, $signature, $timestamp, $nonce);

}

/**

* 通用auth驗證方法

* @param string $appid

* @param string $appsecret

* @param string $token 手動指定access_token,非必要情況不建議用

*/

public function checkAuth($appid='',$appsecret='',$token=''){

if (!$appid || !$appsecret) {

$appid = $this->appid;

$appsecret = $this->appsecret;

}

if ($token) { //手動指定token,優先使用

$this->access_token=$token;

return $this->access_token;

}

//TODO: get the cache access_token

$result = $this->http_get(self::API_URL_PREFIX.self::TOKEN_GET_URL.'corpid='.$appid.'&corpsecret='.$appsecret);

if ($result)

{

$json = json_decode($result,true);

if (!$json || isset($json['errcode'])) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

$this->access_token = $json['access_token'];

$expire = $json['expires_in'] ? intval($json['expires_in'])-100 : 3600;

//TODO: cache access_token

return $this->access_token;

}

return false;

}

/**

* 刪除驗證數據

* @param string $appid

*/

public function resetAuth($appid=''){

if (!$appid) $appid = $this->appid;

$this->access_token = '';

//TODO: remove cache

return true;

}

/**

* 創建菜單

* @param array $data 菜單數組數據

* example:

* array (

* 'button' => array (

* 0 => array (

* 'name' => '掃碼',

* 'sub_button' => array (

* 0 => array (

* 'type' => 'scancode_waitmsg',

* 'name' => '掃碼帶提示',

* 'key' => 'rselfmenu_0_0',

* ),

* 1 => array (

* 'type' => 'scancode_push',

* 'name' => '掃碼推事件',

* 'key' => 'rselfmenu_0_1',

* ),

* ),

* ),

* 1 => array (

* 'name' => '發圖',

* 'sub_button' => array (

* 0 => array (

* 'type' => 'pic_sysphoto',

* 'name' => '系統拍照發圖',

* 'key' => 'rselfmenu_1_0',

* ),

* 1 => array (

* 'type' => 'pic_photo_or_album',

* 'name' => '拍照或者相冊發圖',

* 'key' => 'rselfmenu_1_1',

* )

* ),

* ),

* 2 => array (

* 'type' => 'location_select',

* 'name' => '發送位置',

* 'key' => 'rselfmenu_2_0'

* ),

* ),

* )

* type可以選擇為以下幾種,會收到相應類型的事件推送。請注意,3到8的所有事件,僅支持微信iPhone5.4.1以上版本,

* 和Android5.4以上版本的微信用戶,舊版本微信用戶點擊后將沒有回應,開發者也不能正常接收到事件推送。

* 1、click:點擊推事件

* 2、view:跳轉URL

* 3、scancode_push:掃碼推事件

* 4、scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框

* 5、pic_sysphoto:彈出系統拍照發圖

* 6、pic_photo_or_album:彈出拍照或者相冊發圖

* 7、pic_weixin:彈出微信相冊發圖器

* 8、location_select:彈出地理位置選擇器

*/

public function createMenu($data,$agentid=''){

if ($agentid=='') {

$agentid=$this->agentid;

}

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::MENU_CREATE_URL.'access_token='.$this->access_token.'&agentid='.$agentid,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return true;

}

return false;

}

/**

* 獲取菜單

* @return array('menu'=>array(....s))

*/

public function getMenu($agentid=''){

if ($agentid=='') {

$agentid=$this->agentid;

}

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::MENU_GET_URL.'access_token='.$this->access_token.'&agentid='.$agentid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || isset($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 刪除菜單

* @return boolean

*/

public function deleteMenu($agentid=''){

if ($agentid=='') {

$agentid=$this->agentid;

}

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::MENU_DELETE_URL.'access_token='.$this->access_token.'&agentid='.$agentid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode'])) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return true;

}

return false;

}

/**

* 上傳多媒體文件 (只有三天的有效期,過期自動被刪除)

* 注意:數組的鍵值任意,但文件名前必須加@,使用單引號以避免本地路徑斜杠被轉義

* @param array $data {"media":'@Path\filename.jpg'}

* @param type 媒體文件類型:圖片(image)、語音(voice)、視頻(video),普通文件(file)

* @return boolean|array

* {

* "type": "image",

* "media_id": "0000001",

* "created_at": "1380000000"

* }

*/

public function uploadMedia($data, $type){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::MEDIA_UPLOAD.'access_token='.$this->access_token.'&type='.$type,$data,true);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode'])) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 根據媒體文件ID獲取媒體文件

* @param string $media_id 媒體文件id

* @return raw data

*/

public function getMedia($media_id){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::MEDIA_GET_URL.'access_token='.$this->access_token.'&media_id='.$media_id);

if ($result)

{

$json = json_decode($result,true);

if (isset($json['errcode'])) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $result;

}

return false;

}

/**

* 創建部門

* @param array $data 結構體為:

* array (

* "name" => "郵箱產品組", //部門名稱

* "parentid" => "1" //父部門id

* "order" => "1", //(非必須)在父部門中的次序。從1開始,數字越大排序越靠后

* )

* @return boolean|array

* 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "created", //對返回碼的文本描述內容

* "id": 2 //創建的部門id。

* }

*/

public function createDepartment($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::DEPARTMENT_CREATE_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 更新部門

* @param array $data 結構體為:

* array(

* "id" => "1" //(必須)部門id

* "name" => "郵箱產品組", //(非必須)部門名稱

* "parentid" => "1", //(非必須)父親部門id。根部門id為1

* "order" => "1", //(非必須)在父部門中的次序。從1開始,數字越大排序越靠后

* )

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "updated" //對返回碼的文本描述內容

* }

*/

public function updateDepartment($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::DEPARTMENT_UPDATE_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 刪除部門

* @param $id

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "deleted" //對返回碼的文本描述內容

* }

*/

public function deleteDepartment($id){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::DEPARTMENT_DELETE_URL.'access_token='.$this->access_token.'&id='.$id);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 移動部門

* @param $data

* array(

* "department_id" => "5",//所要移動的部門

* "to_parentid" => "2",//想移動到的父部門節點,根部門為1

* "to_position" => "1"//(非必須)想移動到的父部門下的位置,1表示最上方,往后位置為2,3,4,以此類推,默認為1

* )

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "ok" //對返回碼的文本描述內容

* }

*/

public function moveDepartment($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::DEPARTMENT_MOVE_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 獲取部門列表

* @return boolean|array 成功返回結果

* {

* "errcode": 0,

* "errmsg": "ok",

* "department": [ //部門列表數據。以部門的order字段從小到大排列

* {

* "id": 1,

* "name": "廣州研發中心",

* "parentid": 0

* },

* {

* "id": 2

* "name": "郵箱產品部",

* "parentid": 1

* }

* ]

* }

*/

public function getDepartment(){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::DEPARTMENT_LIST_URL.'access_token='.$this->access_token);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode'])) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 創建成員

* @param array $data 結構體為:

* array(

* "userid" => "zhangsan",

* "name" => "張三",

* "department" => [1, 2],

* "position" => "產品經理",

* "mobile" => "15913215421",

* "gender" => 1, //性別。gender=0表示男,=1表示女

* "tel" => "62394",

* "email" => "zhangsan@gzdev.com",

* "weixinid" => "zhangsan4dev"

* )

* @return boolean|array

* 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "created", //對返回碼的文本描述內容

* }

*/

public function createUser($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::USER_CREATE_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 更新成員

* @param array $data 結構體為:

* array(

* "userid" => "zhangsan",

* "name" => "張三",

* "department" => [1, 2],

* "position" => "產品經理",

* "mobile" => "15913215421",

* "gender" => 1, //性別。gender=0表示男,=1表示女

* "tel" => "62394",

* "email" => "zhangsan@gzdev.com",

* "weixinid" => "zhangsan4dev"

* )

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "updated" //對返回碼的文本描述內容

* }

*/

public function updateUser($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::USER_UPDATE_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 刪除成員

* @param $userid 員工UserID。對應管理端的帳號

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "deleted" //對返回碼的文本描述內容

* }

*/

public function deleteUser($userid){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::USER_DELETE_URL.'access_token='.$this->access_token.'&userid='.$userid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 獲取成員信息

* @param $userid 員工UserID。對應管理端的帳號

* @return boolean|array 成功返回結果

* {

* "errcode": 0,

* "errmsg": "ok",

* "userid": "zhangsan",

* "name": "李四",

* "department": [1, 2],

* "position": "后臺工程師",

* "mobile": "15913215421",

* "gender": 1, //性別。gender=0表示男,=1表示女

* "tel": "62394",

* "email": "zhangsan@gzdev.com",

* "weixinid": "lisifordev", //微信號

* "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3W..../0", //頭像url。注:如果要獲取小圖將url最后的"/0"改成"/64"即可

* "status": 1 //關注狀態: 1=已關注,2=已凍結,4=未關注

* }

*/

public function getUserInfo($userid){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::USER_GET_URL.'access_token='.$this->access_token.'&userid='.$userid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 獲取部門成員

* @param $department_id 部門id

* @param $fetch_child 1/0:是否遞歸獲取子部門下面的成員

* @param $status 0獲取全部員工,1獲取已關注成員列表,2獲取禁用成員列表,4獲取未關注成員列表。status可疊加

* @return boolean|array 成功返回結果

* {

* "errcode": 0,

* "errmsg": "ok",

* "userlist": [

* {

* "userid": "zhangsan",

* "name": "李四"

* }

* ]

* }

*/

public function getUserList($department_id,$fetch_child=0,$status=0){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::USER_LIST_URL.'access_token='.$this->access_token

.'&department_id='.$department_id.'&fetch_child='.$fetch_child.'&status='.$status);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 根據code獲取成員信息

* 通過Oauth2.0或者設置了二次驗證時獲取的code,用于換取成員的UserId和DeviceId

*

* @param $code Oauth2.0或者二次驗證時返回的code值

* @param $agentid 跳轉鏈接時所在的企業應用ID,未填則默認為當前配置的應用id

* @return boolean|array 成功返回數組

* array(

* 'UserId' => 'USERID', //員工UserID

* 'DeviceId' => 'DEVICEID' //手機設備號(由微信在安裝時隨機生成)

* )

*/

public function getUserId($code,$agentid=0){

if (!$agentid) $agentid=$this->agentid;

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::USER_GETINFO_URL.'access_token='.$this->access_token.'&code='.$code.'&agentid'.$agentid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 創建標簽

* @param array $data 結構體為:

* array(

* "tagname" => "UI"

* )

* @return boolean|array

* 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "created", //對返回碼的文本描述內容

* "tagid": "1"

* }

*/

public function createTag($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::TAG_CREATE_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 更新標簽

* @param array $data 結構體為:

* array(

* "tagid" => "1",

* "tagname" => "UI design"

* )

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "updated" //對返回碼的文本描述內容

* }

*/

public function updateTag($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::TAG_UPDATE_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 刪除標簽

* @param $tagid 標簽TagID

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "deleted" //對返回碼的文本描述內容

* }

*/

public function deleteTag($tagid){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::TAG_DELETE_URL.'access_token='.$this->access_token.'&tagid='.$tagid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 獲取標簽成員

* @param $tagid 標簽TagID

* @return boolean|array 成功返回結果

* {

* "errcode": 0,

* "errmsg": "ok",

* "userlist": [

* {

* "userid": "zhangsan",

* "name": "李四"

* }

* ]

* }

*/

public function getTag($tagid){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::TAG_GET_URL.'access_token='.$this->access_token.'&tagid='.$tagid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 增加標簽成員

* @param array $data 結構體為:

* array (

* "tagid" => "1",

* "userlist" => array( //企業員工ID列表

* "user1",

* "user2"

* )

* )

* @return boolean|array

* 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "ok", //對返回碼的文本描述內容

* "invalidlist":"usr1|usr2|usr" //若部分userid非法,則會有此段。不在權限內的員工ID列表,以“|”分隔

* }

*/

public function addTagUser($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::TAG_ADDUSER_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 刪除標簽成員

* @param array $data 結構體為:

* array (

* "tagid" => "1",

* "userlist" => array( //企業員工ID列表

* "user1",

* "user2"

* )

* )

* @return boolean|array

* 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "deleted", //對返回碼的文本描述內容

* "invalidlist":"usr1|usr2|usr" //若部分userid非法,則會有此段。不在權限內的員工ID列表,以“|”分隔

* }

*/

public function delTagUser($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::TAG_DELUSER_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 獲取標簽列表

* @return boolean|array 成功返回數組結果,這里附上json樣例

* {

* "errcode": 0,

* "errmsg": "ok",

* "taglist":[

* {"tagid":1,"tagname":"a"},

* {"tagid":2,"tagname":"b"}

* ]

* }

*/

public function getTagList(){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::TAG_LIST_URL.'access_token='.$this->access_token);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode'])) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 主動發送信息接口

* @param array $data 結構體為:

* array(

* "touser" => "UserID1|UserID2|UserID3",

* "toparty" => "PartyID1|PartyID2 ",

* "totag" => "TagID1|TagID2 ",

* "safe":"0"//是否為保密消息,對于news無效

* "agentid" => "001",//應用id

* "msgtype" => "text", //根據信息類型,選擇下面對應的信息結構體

*

* "text" => array(

* "content" => "Holiday Request For Pony(http://xxxxx)"

* ),

*

* "image" => array(

* "media_id" => "MEDIA_ID"

* ),

*

* "voice" => array(

* "media_id" => "MEDIA_ID"

* ),

*

* " video" => array(

* "media_id" => "MEDIA_ID",

* "title" => "Title",

* "description" => "Description"

* ),

*

* "file" => array(

* "media_id" => "MEDIA_ID"

* ),

*

* "news" => array(//不支持保密

* "articles" => array( //articles 圖文消息,一個圖文消息支持1到10個圖文

* array(

* "title" => "Title", //標題

* "description" => "Description", //描述

* "url" => "URL", //點擊后跳轉的鏈接。可根據url里面帶的code參數校驗員工的真實身份。

* "picurl" => "PIC_URL", //圖文消息的圖片鏈接,支持JPG、PNG格式,較好的效果為大圖640*320,

* //小圖80*80。如不填,在客戶端不顯示圖片

* ),

* )

* ),

*

* "mpnews" => array(

* "articles" => array( //articles 圖文消息,一個圖文消息支持1到10個圖文

* array(

* "title" => "Title", //圖文消息的標題

* "thumb_media_id" => "id", //圖文消息縮略圖的media_id

* "author" => "Author", //圖文消息的作者(可空)

* "content_source_url" => "URL", //圖文消息點擊“閱讀原文”之后的頁面鏈接(可空)

* "content" => "Content" //圖文消息的內容,支持html標簽

* "digest" => "Digest description", //圖文消息的描述

* "show_cover_pic" => "0" //是否顯示封面,1為顯示,0為不顯示(可空)

* ),

* )

* )

* )

* 請查看官方開發文檔中的 發送消息 -> 消息類型及數據格式

*

* @return boolean|array

* 如果對應用或收件人、部門、標簽任何一個無權限,則本次發送失敗;

* 如果收件人、部門或標簽不存在,發送仍然執行,但返回無效的部分。

* {

* "errcode": 0,

* "errmsg": "ok",

* "invaliduser": "UserID1",

* "invalidparty":"PartyID1",

* "invalidtag":"TagID1"

* }

*/

public function sendMessage($data){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_post(self::API_URL_PREFIX.self::MASS_SEND_URL.'access_token='.$this->access_token,self::json_encode($data));

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* 二次驗證

* 企業在開啟二次驗證時,必須填寫企業二次驗證頁面的url。

* 當員工綁定通訊錄中的帳號后,會收到一條圖文消息,

* 引導員工到企業的驗證頁面驗證身份,企業在員工驗證成功后,

* 調用如下接口即可讓員工關注成功。

*

* @param $userid

* @return boolean|array 成功返回結果

* {

* "errcode": 0, //返回碼

* "errmsg": "ok" //對返回碼的文本描述內容

* }

*/

public function authSucc($userid){

if (!$this->access_token && !$this->checkAuth()) return false;

$result = $this->http_get(self::API_URL_PREFIX.self::AUTHSUCC_URL.'access_token='.$this->access_token.'&userid='.$userid);

if ($result)

{

$json = json_decode($result,true);

if (!$json || !empty($json['errcode']) || $json['errcode']!=0) {

$this->errCode = $json['errcode'];

$this->errMsg = $json['errmsg'];

return false;

}

return $json;

}

return false;

}

/**

* oauth 授權跳轉接口

* @param string $callback 回調URI

* @param string $state 重定向后會帶上state參數,企業可以填寫a-zA-Z0-9的參數值

* @return string

*/

public function getOauthRedirect($callback,$state='STATE',$scope='snsapi_base'){

return self::OAUTH_PREFIX.self::OAUTH_AUTHORIZE_URL.'appid='.$this->appid.'&redirect_uri='.urlencode($callback).'&response_type=code&scope='.$scope.'&state='.$state.'#wechat_redirect';

}

}

/**

* PKCS7Encoder class

*

* 提供基于PKCS7算法的加解密接口.

*/

class PKCS7Encoder

{

public static $block_size = 32;

/**

* 對需要加密的明文進行填充補位

* @param $text 需要進行填充補位操作的明文

* @return 補齊明文字符串

*/

function encode($text)

{

$block_size = PKCS7Encoder::$block_size;

$text_length = strlen($text);

//計算需要填充的位數

$amount_to_pad = PKCS7Encoder::$block_size - ($text_length % PKCS7Encoder::$block_size);

if ($amount_to_pad == 0) {

$amount_to_pad = PKCS7Encoder::block_size;

}

//獲得補位所用的字符

$pad_chr = chr($amount_to_pad);

$tmp = "";

for ($index = 0; $index < $amount_to_pad; $index++) {

$tmp .= $pad_chr;

}

return $text . $tmp;

}

/**

* 對解密后的明文進行補位刪除

* @param decrypted 解密后的明文

* @return 刪除填充補位后的明文

*/

function decode($text)

{

$pad = ord(substr($text, -1));

if ($pad < 1 || $pad > PKCS7Encoder::$block_size) {

$pad = 0;

}

return substr($text, 0, (strlen($text) - $pad));

}

}

/**

* Prpcrypt class

*

* 提供接收和推送給公眾平臺消息的加解密接口.

*/

class Prpcrypt

{

public $key;

function Prpcrypt($k)

{

$this->key = base64_decode($k . "=");

}

/**

* 對明文進行加密

* @param string $text 需要加密的明文

* @return string 加密后的密文

*/

public function encrypt($text, $appid)

{

try {

//獲得16位隨機字符串,填充到明文之前

$random = $this->getRandomStr();//"aaaabbbbccccdddd";

$text = $random . pack("N", strlen($text)) . $text . $appid;

// 網絡字節序

$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

$iv = substr($this->key, 0, 16);

//使用自定義的填充方式對明文進行補位填充

$pkc_encoder = new PKCS7Encoder;

$text = $pkc_encoder->encode($text);

mcrypt_generic_init($module, $this->key, $iv);

//加密

$encrypted = mcrypt_generic($module, $text);

mcrypt_generic_deinit($module);

mcrypt_module_close($module);

//print(base64_encode($encrypted));

//使用BASE64對加密后的字符串進行編碼

return array(ErrorCode::$OK, base64_encode($encrypted));

} catch (Exception $e) {

//print $e;

return array(ErrorCode::$EncryptAESError, null);

}

}

/**

* 對密文進行解密

* @param string $encrypted 需要解密的密文

* @return string 解密得到的明文

*/

public function decrypt($encrypted, $appid)

{

try {

//使用BASE64對需要解密的字符串進行解碼

$ciphertext_dec = base64_decode($encrypted);

$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

$iv = substr($this->key, 0, 16);

mcrypt_generic_init($module, $this->key, $iv);

//解密

$decrypted = mdecrypt_generic($module, $ciphertext_dec);

mcrypt_generic_deinit($module);

mcrypt_module_close($module);

} catch (Exception $e) {

return array(ErrorCode::$DecryptAESError, null);

}

try {

//去除補位字符

$pkc_encoder = new PKCS7Encoder;

$result = $pkc_encoder->decode($decrypted);

//去除16位隨機字符串,網絡字節序和AppId

if (strlen($result) < 16)

return "";

$content = substr($result, 16, strlen($result));

$len_list = unpack("N", substr($content, 0, 4));

$xml_len = $len_list[1];

$xml_content = substr($content, 4, $xml_len);

$from_appid = substr($content, $xml_len + 4);

} catch (Exception $e) {

//print $e;

return array(ErrorCode::$IllegalBuffer, null);

}

if ($from_appid != $appid)

return array(ErrorCode::$ValidateAppidError, null);

return array(0, $xml_content);

}

/**

* 隨機生成16位字符串

* @return string 生成的字符串

*/

function getRandomStr()

{

$str = "";

$str_pol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";

$max = strlen($str_pol) - 1;

for ($i = 0; $i < 16; $i++) {

$str .= $str_pol[mt_rand(0, $max)];

}

return $str;

}

}

/**

* error code

* 僅用作類內部使用,不用于官方API接口的errCode碼

*/

class ErrorCode

{

public static $OK = 0;

public static $ValidateSignatureError = 40001;

public static $ParseXmlError = 40002;

public static $ComputeSignatureError = 40003;

public static $IllegalAesKey = 40004;

public static $ValidateAppidError = 40005;

public static $EncryptAESError = 40006;

public static $DecryptAESError = 40007;

public static $IllegalBuffer = 40008;

public static $EncodeBase64Error = 40009;

public static $DecodeBase64Error = 40010;

public static $GenReturnXmlError = 40011;

public static $errCode=array(

'0'=>'無問題',

'40001'=>'簽名驗證錯誤',

'40002'=>'xml解析失敗',

'40003'=>'sha加密生成簽名失敗',

'40004'=>'encodingAesKey 非法',

'40005'=>'appid 校驗錯誤',

'40006'=>'aes 加密失敗',

'40007'=>'aes 解密失敗',

'40008'=>'解密后得到的buffer非法',

'40009'=>'base64加密失敗',

'40010'=>'base64解密失敗',

'40011'=>'生成xml失敗',

);

public static function getErrText($err) {

if (isset(self::$errCode[$err])) {

return self::$errCode[$err];

}else {

return false;

};

}

}

總結

以上是生活随笔為你收集整理的git wechat.class.php,wechat-php-sdk/qywechat.class.php at master · gitye/wechat-php-sdk · GitHub的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

av免费在线观看1 | 激情综合六月 | 91精品一区二区三区久久久久久 | 亚洲国产精品成人女人久久 | 国产精品99久久久久久宅男 | 国产精品免费一区二区三区在线观看 | av电影在线免费 | 日日草夜夜操 | 国产三级精品三级在线观看 | 97国产大学生情侣白嫩酒店 | 黄色一级大片在线免费看国产一 | 日本久久99 | 亚洲欧洲精品一区 | 美女久久精品 | 超碰国产在线 | 视频一区二区国产 | 久久人人爽人人片 | 色爱成人网 | 久久精品亚洲一区二区三区观看模式 | 婷婷激情综合五月天 | 一区二区三区韩国免费中文网站 | 又黄又网站| 久久综合成人网 | 人人藻人人澡人人爽 | 日韩久久激情 | 免费网站观看www在线观看 | 久久久亚洲网站 | 亚洲一区二区三区91 | 欧美日韩精品区 | 亚洲人精品午夜 | 久久男人中文字幕资源站 | 久久手机免费视频 | 欧美日韩xxx| 玖玖国产精品视频 | 开心综合网 | 在线激情av电影 | 伊色综合久久之综合久久 | 区一区二区三区中文字幕 | 视频福利在线 | 在线视频a| 中文字幕高清在线播放 | 免费网址在线播放 | 久久开心激情 | 精品视频久久久久久 | 天天爽天天搞 | 亚洲精品在线观看中文字幕 | 国产精品精品国产婷婷这里av | 五月婷婷操 | 日夜夜精品视频 | 国产精品少妇 | 在线v片免费观看视频 | 激情欧美在线观看 | 日韩va亚洲va欧美va久久 | 插综合网 | 一区中文字幕在线观看 | 97在线观看免费观看 | 91精品久久久久久久久久久久久 | 日韩大片在线免费观看 | 久久久久激情 | 精品久久久免费视频 | 九九免费精品视频 | 国产成人一区二区三区 | 国产麻豆电影 | 亚洲激情视频在线观看 | 日韩精品专区在线影院重磅 | 亚洲中字幕 | 国产精品久久久久一区二区三区 | 在线视频app| 国产香蕉久久 | 一级片视频在线 | 一级片免费视频 | 色噜噜日韩精品一区二区三区视频 | 亚洲色视频| 69久久夜色精品国产69 | 中文字幕免费看 | 亚洲国产大片 | 欧美精品首页 | 亚洲第一色| 久艹视频免费观看 | 午夜影视剧场 | 国产伦精品一区二区三区无广告 | 精品一区二三区 | www.com久久久 | 国产最新在线 | 中文有码在线视频 | 久久久国产一区二区 | 久久免费公开视频 | 美女视频a美女大全免费下载蜜臀 | 亚洲免费av观看 | 亚洲午夜精品久久久久久久久久久久 | 亚洲国产天堂av | 欧美日韩精品在线播放 | 五月婷婷激情 | 在线观看911视频 | 免费在线观看av网址 | 日韩,中文字幕 | 国内精品小视频 | 爱色av.com| 国产无限资源在线观看 | 婷婷精品 | 欧美日韩有码 | 成人久久亚洲 | 国产青春久久久国产毛片 | 中文字幕av有码 | 免费欧美精品 | 国产黄色资源 | 国产一区二区三区免费观看视频 | www99精品 | 日韩在线影视 | 国产69久久精品成人看 | 久久免费的视频 | 欧美精品一区二区在线观看 | 狠狠艹夜夜干 | 在线va视频| 免费观看一区 | 亚洲欧洲xxxx | 麻豆一区在线观看 | 天天久久综合 | 日日夜夜草 | 国内精品国产三级国产aⅴ久 | 国产对白av | 黄色小视频在线观看免费 | 亚洲成人av片 | 婷婷丁香七月 | 亚洲国产网站 | 午夜性色| 四虎影院在线观看av | 天天干,天天干 | 中文字幕资源在线观看 | 天天搞天天干天天色 | 男女激情免费网站 | 黄在线免费看 | 婷婷av资源| 蜜臀久久99精品久久久久久网站 | 国产婷婷久久 | av免费黄色 | 91精品视频免费看 | 成人av网址大全 | 96av在线视频 | 久久综合久久综合久久 | 国产美女在线观看 | 国产精品久久久久久久99 | 亚洲最大的av网站 | 国产亚洲精品久久久久久电影 | 国产粉嫩在线 | 亚洲天天干 | 亚洲一二三在线 | 日本久久高清视频 | 欧美淫视频| 国产精品一区二区久久精品爱涩 | 免费观看一区 | 一区二区三区免费看 | 夜又临在线观看 | 国产专区在线播放 | 天天做天天射 | 二区三区中文字幕 | 欧美日韩一区二区在线观看 | 国产伦精品一区二区三区在线 | 91视频在线免费下载 | 久久人人97超碰com | 日韩中文字幕视频在线 | 国产精品视频999 | 久久久国产在线视频 | 中文字幕字幕中文 | 日韩在线观看视频免费 | 午夜精品久久久久久久99 | 91精品国产亚洲 | 99精彩视频在线观看免费 | 亚洲午夜久久久久久久久电影网 | 91看片在线播放 | 91亚洲精品久久久蜜桃网站 | 国产一区二区三区免费观看视频 | 国产精品理论片在线观看 | 在线观看国产www | 91精品国产麻豆国产自产影视 | 亚洲精品国 | 久久这里只有精品9 | 狠狠色狠狠色终合网 | 亚洲精品91天天久久人人 | 国产精品乱码一区二区视频 | 我要看黄色一级片 | 成人午夜影院 | 久久国产精品99久久久久久丝袜 | 日韩精品一区二区三区高清免费 | 一区二区三区在线免费观看 | 欧美精品国产综合久久 | 国产一级在线播放 | 欧美日韩精品在线视频 | 黄色aaaaa| 国产高清日韩欧美 | 日韩精品免费一区二区三区 | 瑞典xxxx性hd极品 | 国产免费黄色 | 99久久精品无码一区二区毛片 | 国产精品永久久久久久久久久 | 九九视频免费观看视频精品 | 国产一性一爱一乱一交 | 少妇高潮冒白浆 | 国产精品免费一区二区三区 | 激情网站五月天 | 黄a在线看| 亚洲精品在线观看的 | 亚洲第二色| 超碰在线97观看 | 成人免费观看视频大全 | 亚洲国产免费av | 很污的网站| 毛片视频网址 | 99久久精品国产一区二区成人 | 亚洲乱码精品久久久久 | 一区二区三区 亚洲 | 国产精品久久久久久久久软件 | 久久国产日韩 | 91豆麻精品91久久久久久 | 99久久久久久久 | 在线91精品 | 欧美日韩国产欧美 | 国产亚洲免费的视频看 | 精品国产成人在线 | 国产手机在线观看视频 | 东方av免费在线观看 | 国产精品系列在线播放 | 天天天操天天天干 | 国产亚洲午夜高清国产拍精品 | av夜夜操| 视频在线观看91 | 日韩手机在线观看 | 色综合久久久久久中文网 | 91网在线看 | 丁香六月国产 | 日日夜夜人人天天 | 黄色日本免费 | 中文字幕在线一二 | 精品视频亚洲 | www操操| 欧美成人在线免费 | 久草在线精品观看 | 日韩a在线看| 日韩影片在线观看 | 97超级碰碰碰视频在线观看 | 特级西西444www大精品视频免费看 | 国产三级在线播放 | 国产亚洲一区二区在线观看 | 日本激情视频中文字幕 | 69精品久久 | 在线免费观看黄色av | 天天激情天天干 | 亚洲欧美成人网 | 日韩欧美99 | 日韩一二三在线 | 国产精品九九九 | 天天爽天天爽天天爽 | 成年人视频在线免费播放 | 少妇bbbb揉bbbb日本 | 国产日韩精品一区二区三区 | 九草在线观看 | 欧美日韩国产网站 | 精品99999| 欧美一区中文字幕 | 亚洲精品玖玖玖av在线看 | 亚洲国产黄色 | 黄网站污| 精品九九久久 | 亚洲精品视频网址 | 国产精品12 | 亚洲,国产成人av | 最新中文字幕在线播放 | 91成熟丰满女人少妇 | 91香蕉国产在线观看软件 | 精品视频123区在线观看 | 国产系列在线观看 | 激情视频网页 | 免费精品视频在线观看 | 午夜体验区 | 国产免费三级在线观看 | 国产精品久久久久久久久久白浆 | 婷婷综合成人 | 免费亚洲黄色 | 婷婷新五月| 久久精品久久精品 | 一级片免费观看视频 | 精品久久久久久久久久 | 精品免费在线视频 | 中文字幕欧美三区 | 99热在线看 | 丝袜精品视频 | 性色av香蕉一区二区 | 激情久久婷婷 | 日韩高清 一区 | 99视频偷窥在线精品国自产拍 | 国色综合 | 欧美日韩大片在线观看 | 久久久国产一区 | 国产精品成人一区二区三区吃奶 | 国产尤物在线视频 | 国内精品在线看 | 欧美一二三区在线观看 | 欧美午夜a| 最近久乱中文字幕 | 欧美亚洲精品一区 | 成人一级黄色片 | av综合站| 亚洲色图 校园春色 | 成人看片 | 国产精品99久久久久久宅男 | 日韩精品无码一区二区三区 | 毛片二区 | 国产精品理论在线观看 | 国产在线黄色 | 国产又粗又硬又长又爽的视频 | 丰满少妇在线观看 | 久久精品亚洲综合专区 | 日日操天天射 | 人人爽人人爽人人爽学生一级 | 日本中文字幕在线看 | 国产 日韩 中文字幕 | 国产精品资源 | 国产成本人视频在线观看 | 日韩激情片在线观看 | 国产精品自产拍在线观看 | 97精品国产一二三产区 | 91九色在线观看视频 | 欧美精品亚洲精品 | 黄色网www | 丁香色婷| 中文av免费 | 国产视频中文字幕在线观看 | 韩国av免费在线 | www.看片网站 | 国产拍揄自揄精品视频麻豆 | 女女av在线 | 在线免费av网 | 国产精品丝袜在线 | 国产精品一区免费看8c0m | 国产精品理论片在线播放 | 99久久er热在这里只有精品66 | 91av看片 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 成人av在线影院 | 色偷偷网站视频 | 成人黄色电影免费观看 | 99久久激情视频 | 久久精品在线免费观看 | 欧美网站黄色 | 91视频3p | 2018精品视频 | 超碰在线人人爱 | 日本公乱妇视频 | 日日夜夜精品网站 | 国产精品久久久久久久久久久久午夜 | 色婷婷激情电影 | 中文字幕 国产专区 | 国产一二区在线观看 | av电影中文字幕在线观看 | 色婷婷精品大在线视频 | 久操视频在线免费看 | 国产中文在线播放 | aaa日本高清在线播放免费观看 | 国产精品99久久久久人中文网介绍 | 精品一区 在线 | 91精品高清| 久久五月婷婷丁香 | 国产女人18毛片水真多18精品 | 国产成人av免费在线观看 | 在线观看免费成人 | 又紧又大又爽精品一区二区 | 最新av在线网站 | 人人澡澡人人 | www.久热| 日韩精品视频免费在线观看 | 成人黄色电影免费观看 | 精品国产人成亚洲区 | 亚洲国产无 | 91手机在线看片 | 在线激情av电影 | 色综合网 | 国产中文字幕大全 | 91精品视频一区二区三区 | 久久电影国产免费久久电影 | 91亚洲网站| 久久综合狠狠综合久久综合88 | 精品久久久久久电影 | 夜夜躁日日躁狠狠躁 | www.五月天 | 久久久精品国产一区二区电影四季 | 天天舔天天搞 | 成人网看片 | bbw av| 久久综合网色—综合色88 | 国产短视频在线播放 | 国产精品一区二区三区在线播放 | 亚洲中字幕 | 99热99| av看片在线 | 三上悠亚一区二区在线观看 | 日本高清中文字幕有码在线 | 亚洲做受高潮欧美裸体 | 精品色999| 天天干天天搞天天射 | 日韩欧美在线视频一区二区三区 | 久久婷婷五月综合色丁香 | 精品国产诱惑 | 丝袜美女视频网站 | 久久精品4 | 中文字幕视频三区 | 99色在线观看视频 | 天天射天天做 | 91精品国产高清 | 日韩在线视频免费看 | 九九九热精品 | 久久精品视频中文字幕 | av资源免费看 | 五月天综合婷婷 | 天堂av影院 | 国产精品久久久久久吹潮天美传媒 | 国产99在线播放 | 欧美精品一区二区蜜臀亚洲 | www.狠狠操 | 久久婷五月 | 丁香久久综合 | 免费a v在线| 探花视频免费观看高清视频 | av日韩精品| 一级黄色片在线 | 特级西西444www高清大视频 | av一级在线 | 亚洲黄色区 | 91日本在线播放 | 国产小视频免费在线观看 | 国产尤物在线观看 | 亚洲国产黄色片 | 五月激情久久久 | 国产精品成人一区二区三区 | 一区精品久久 | 在线 成人 | av在线永久免费观看 | 丰满少妇一级片 | 日韩中字在线 | 麻豆久久久久 | 伊人狠狠色 | 久久久久久久久久久网站 | 国产一区电影在线观看 | 黄色毛片视频免费 | 久久久久久久免费观看 | 91字幕 | 国色天香永久免费 | 国产精品一区二区在线免费观看 | 日韩欧美高清视频在线观看 | 久草精品视频在线看网站免费 | 97超在线 | 91人人澡人人爽 | 免费黄色在线 | 国产一区二区三区免费在线 | 欧美在线不卡一区 | 美女久久久| 欧美日韩视频免费 | 欧美日韩aaaa | 在线观看av免费观看 | 少妇啪啪av入口 | 99国产在线视频 | 国产精品久久久久一区 | 亚州性色 | 久久久精品影视 | 国产精品久久久久久久久久久杏吧 | 五月黄色 | 香蕉网在线观看 | 久久综合久久88 | 91在线超碰| 亚洲午夜精品福利 | 黄色在线视频网址 | 中文字幕在线视频一区二区三区 | 女人18毛片a级毛片一区二区 | 又黄又爽的视频在线观看网站 | 91网在线观看| 国产亚洲精品无 | aaawww | 久久久久久久久久久免费 | 国产高清视频在线观看 | 久久精品一区二区三区中文字幕 | 欧美精品久久天天躁 | 久久久国产一区二区三区 | 国产美女网站视频 | 激情视频国产 | 91精彩视频在线观看 | 免费日韩av电影 | 欧美一区二区精品在线 | 97色婷婷 | 中文字幕一区二区三区在线播放 | 国产精品久久久久一区二区三区 | 激情五月婷婷综合 | 国产尤物在线 | 激情视频在线观看网址 | 麻豆久久精品 | 国产精品久久久久久吹潮天美传媒 | 精品国产自在精品国产精野外直播 | 亚洲色视频 | 97在线视频免费播放 | 激情久久综合 | 91成人精品国产刺激国语对白 | 欧美精品久久久久久久久久丰满 | 欧美一级久久 | 国产精品原创av片国产免费 | 日韩毛片一区 | 亚洲精品乱码久久久久久蜜桃91 | 国内精品久久久久影院男同志 | va视频在线观看 | 2022国产精品视频 | 精品产品国产在线不卡 | 丁香六月婷婷开心 | 1024手机在线看 | 日日碰狠狠躁久久躁综合网 | 最近字幕在线观看第一季 | 色婷婷狠 | 国产精品久久久久久久久久 | 一区二区在线电影 | 国产一区在线免费观看 | 懂色av一区二区三区蜜臀 | 91精品久久久久久久99蜜桃 | 国产精品精品国产婷婷这里av | 黄免费在线观看 | 在线免费观看国产视频 | 日韩成年视频 | 91视频在线观看下载 | 亚洲午夜精品久久久久久久久久久久 | 日韩视频一区二区三区 | 国产在线精品福利 | 91大神电影 | 国产成人免费精品 | 97超碰影视 | 久久午夜电影 | 97超碰总站| 亚洲a成人v| 日日弄天天弄美女bbbb | 99久久www免费 | www.狠狠操.com| 国产精品久久久久久久av电影 | 六月丁香激情综合色啪小说 | av在线不卡观看 | 色综合天天综合在线视频 | 摸阴视频 | 91视频最新网址 | av黄色大片| 黄色免费网站下载 | 久久精品官网 | 亚洲午夜精品一区二区三区电影院 | 天天操天天操天天操 | 久久久91精品国产一区二区三区 | 久久综合精品国产一区二区三区 | 天天综合日 | 伊人超碰在线 | 国产美女在线精品免费观看 | 337p欧美| 激情久久一区二区三区 | 亚洲日本在线一区 | 日韩视频一区二区在线 | 四虎永久视频 | 91在线看片 | 97精品一区 | 精品黄色片 | 超碰97国产精品人人cao | 综合精品久久久 | 在线观看一区二区精品 | 超碰.com| 91在线免费公开视频 | 日本丶国产丶欧美色综合 | 欧美一二三视频 | 日本护士三级少妇三级999 | 久久人人爽人人爽人人片 | 91精品999| 日韩视频免费 | 五月天综合激情 | 东方av免费在线观看 | 久久伦理电影 | 国产成人精品一区二 | 一区av在线播放 | 婷婷激情影院 | 久久久久久久网站 | 最新91在线视频 | 成人理论在线观看 | 91中文字幕在线 | 久久99久久久久久 | 成人小视频在线播放 | 日本三级人妇 | 日韩精品久久中文字幕 | 97超碰.com| 国产视频 亚洲精品 | 日本aa在线 | 日日爽天天爽 | 天天狠狠操 | 91经典在线| 精品久久久久久国产偷窥 | 欧美激情第十页 | 免费三级av| 最近av在线 | 久久av免费| 丰满少妇麻豆av | 国产精品嫩草69影院 | 国产特级毛片aaaaaaa高清 | 免费看污片 | 六月丁香久久 | 97在线免费视频 | 狠狠干狠狠插 | 天海冀一区二区三区 | 欧美性色网站 | 国产精品久久久久影院日本 | 麻豆视频免费播放 | 久久中文字幕在线视频 | av一区二区在线观看中文字幕 | 在线观看中文字幕一区二区 | 成年人网站免费观看 | 国产精品免费视频观看 | 欧美男同网站 | 91中文在线观看 | 国产精品一区二区无线 | 色偷偷网站视频 | www久久com| 人人舔人人插 | 天天综合色天天综合 | 91xav| 久久视屏网| 一区二区三区观看 | 久久激五月天综合精品 | 国产又粗又猛又爽又黄的视频免费 | 国产精品第一页在线 | 中文字幕在线国产 | 国产视频在线观看一区二区 | 91精品无人成人www | 国产成年人av| 国产精品久久久久久一区二区 | 久久黄色小说 | 国产一区二区网址 | 综合在线色 | 国产乱码精品一区二区三区介绍 | 精品久久久久久亚洲综合网 | 狠狠色丁香久久婷婷综合五月 | 欧美日韩视频在线观看免费 | 国产精品一区二区精品视频免费看 | 日韩电影一区二区三区在线观看 | h文在线观看免费 | 中文字幕久久网 | 在线影视 一区 二区 三区 | 国产一级特黄电影 | 日韩亚洲欧美中文字幕 | 91视频电影 | a极黄色片| 久久久香蕉视频 | 精品国产乱码 | 国产一级黄色片免费看 | 国产99久久久久久免费看 | 五月婷婷激情综合 | 欧美福利视频一区 | 亚洲va综合va国产va中文 | 国产精品 国内视频 | 国产a国产a国产a | 久操伊人| 国产69精品久久99不卡的观看体验 | 天堂av影院 | 偷拍精品一区二区三区 | 亚洲黄色三级 | 久久久免费观看视频 | 人人讲下载 | 欧美色插 | 黄色www免费 | 日韩 精品 一区 国产 麻豆 | 亚洲精品久 | 婷婷干五月 | 人人澡视频 | 91成人精品视频 | 在线不卡的av| 一区二区视频播放 | 久久99影院| 国产资源网 | 黄色h在线观看 | 天天射日 | 免费一级日韩欧美性大片 | 色av婷婷| 久久久久国产精品一区 | 91av手机在线 | 全久久久久久久久久久电影 | 国产高清一 | 日日夜夜中文字幕 | 久久综合狠狠综合 | 久久精品国产亚洲a | 成人福利在线观看 | 亚洲干| aaa毛片视频 | 五月天堂色 | 亚洲精品乱码久久久久久蜜桃91 | 色鬼综合网 | 日本在线精品视频 | 中文字幕在线观看亚洲 | 欧美少妇xxx | 日韩av电影中文字幕在线观看 | 国产成人精品av久久 | 伊人久久电影网 | 激情五月婷婷激情 | 狠狠操操 | 成人在线中文字幕 | 亚洲精品一区二区三区四区高清 | 色综合久久精品 | 成人免费一级 | 久久只精品99品免费久23小说 | 亚洲精品乱码久久久久久蜜桃91 | av免费在线免费观看 | 91综合色 | 国产福利资源 | 久久精品一二三区 | 日本久久91 | 在线观看国产v片 | 久草在线最新 | 久久99久久99精品免观看软件 | 在线直播av | 在线观看一 | 精品不卡av | 伊人影院99 | 国产精品一区二区三区视频免费 | 久草久| 成人精品一区二区三区中文字幕 | 免费黄色a级毛片 | 久久成人精品视频 | 欧美日韩精品在线 | 99re国产 | 九九精品在线观看 | 国产看片网站 | 色诱亚洲精品久久久久久 | 精品少妇一区二区三区在线 | 久久久久久国产精品亚洲78 | 97超碰在线视 | 毛片网免费 | 91看片淫黄大片91 | 亚洲精品玖玖玖av在线看 | 欧美视频日韩 | 日韩免费一区二区在线观看 | av经典在线| 一区 在线 影院 | av理论电影| 久热电影| 丝袜美腿亚洲综合 | 综合久色 | 亚洲精品美女在线观看播放 | 久久精品91久久久久久再现 | 中文字幕久久精品一区 | 97视频在线看 | 欧美一级久久久久 | 亚洲精品免费观看视频 | 亚洲第一av在线播放 | 伊人五月天.com | 欧美电影在线观看 | 伊甸园永久入口www 99热 精品在线 | 一区二区日韩av | 亚洲午夜精品久久久 | 亚洲精品一区二区三区四区高清 | 色婷婷激情电影 | 国产丝袜一区二区三区 | 亚洲aaa毛片| 中文十次啦 | 日本婷婷色| 国产午夜精品av一区二区 | 国产91影视 | 三级动态视频在线观看 | 一区视频在线 | 亚色视频在线观看 | 久久少妇av| 国产丝袜网站 | 免费视频成人 | 在线日韩一区 | 91久久国产综合精品女同国语 | 成人黄色在线观看视频 | 国产五月色婷婷六月丁香视频 | 欧美另类激情 | 黄毛片在线观看 | 亚洲精品国内 | 深夜男人影院 | 日韩中文字幕在线看 | 精品国产一区二区三区在线 | 中文字幕日韩无 | 免费在线观看污 | 国产精彩视频一区二区 | 免费福利片2019潦草影视午夜 | 日本三级不卡视频 | 精品国产一区二区久久 | 久久精品国产99国产 | 91激情视频在线观看 | av在线免费在线观看 | 午夜国产成人 | 欧美国产不卡 | 日本精品免费看 | 久久免费国产视频 | 久久亚洲日本 | 日韩欧美在线中文字幕 | 国产va饥渴难耐女保洁员在线观看 | 日韩剧情| 成人国产精品免费 | 91免费看黄 | 国产在线免费观看 | 国产精品久久久久久久久久久免费 | 波多野结衣精品视频 | 久久久久亚洲精品成人网小说 | 亚洲禁18久人片 | 波多野结衣视频一区 | 免费不卡中文字幕视频 | 国产理论免费 | 亚洲精品美女久久 | 亚洲国产精彩中文乱码av | 国产经典av | 亚洲精品国产精品99久久 | 欧美在线18 | 国产一区二区精品久久 | 日韩精品中文字幕在线不卡尤物 | 欧美一区二区三区免费看 | 国产精品美女久久久久久久久久久 | 正在播放一区 | 91在线影视 | 中文字幕精品视频 | 国语麻豆| 99视频这里只有 | 国产免费一区二区三区最新6 | 久久久久福利视频 | 久久中文字幕视频 | 成人黄色短片 | 欧美精品首页 | 国产一区在线视频播放 | 国产一区二区在线免费播放 | 激情综合网五月婷婷 | 五月天激情综合网 | 搡bbbb搡bbb视频 | 一区二区不卡高清 | 国产99久久久国产精品免费二区 | 亚洲高清网站 | 天天狠狠干 | 最新国产中文字幕 | 国产精品福利午夜在线观看 | 日韩激情视频 | 久久综合久久久久88 | 亚洲国产日本 | 亚洲激情视频在线观看 | 天天伊人狠狠 | 992tv又爽又黄的免费视频 | 国产亚洲日本 | 精品亚洲成a人在线观看 | 欧美aaaxxxx做受视频 | 亚洲午夜久久久综合37日本 | 麻豆久久一区二区 | 成人一级片免费看 | 精品中文字幕在线播放 | 日韩电影精品一区 | 久久资源在线 | 在线观看av麻豆 | 国产流白浆高潮在线观看 | 婷婷网站天天婷婷网站 | aⅴ精品av导航 | 久久久久久不卡 | 免费在线观看av的网站 | 福利视频一区二区 | 揉bbb玩bbb少妇bbb | 亚洲精品日韩在线观看 | 亚洲精品国产精品99久久 | www.狠狠色.com | 波多野结衣在线播放一区 | 深夜福利视频一区二区 | 免费福利视频网站 | 91久久偷偷做嫩草影院 | 国产精品一区二区三区免费看 | 日韩av午夜在线观看 | 色视频在线看 | 97品白浆高清久久久久久 | 91视频观看免费 | 国产成人精品一区二区三区免费 | 精品国产一区二区三区噜噜噜 | 人人草在线视频 | 五月天综合色激情 | 成年在线观看 | 久久亚洲国产精品 | 在线亚洲播放 | 久久综合五月 | 超碰国产在线观看 | 9999精品免费视频 | 一区二区视频电影在线观看 | 色成人亚洲网 | a亚洲视频 | 人人爽久久久噜噜噜电影 | 91丨九色丨蝌蚪丨对白 | 麻豆精品在线视频 | 成人黄在线观看 | 六月丁香婷婷久久 | 日日草视频 | 国产精品少妇 | 国产在线色视频 | 看片的网址 | 最新精品国产 | 狠狠色丁香九九婷婷综合五月 | a电影免费看 | 日韩一区精品 | 99久久国产免费免费 | 91在线国产观看 | 午夜精品视频免费在线观看 | 久久精品国产成人精品 | 欧美色图另类 | 久久婷婷亚洲 | 天天草天天干天天射 | 亚洲国产免费网站 | 欧美精品中文在线免费观看 | 五月激情站 | 中文字幕在线视频国产 | 欧美日韩一级视频 | 亚洲日本va在线观看 | av在线之家电影网站 | 手机av永久免费 | 色婷婷久久久综合中文字幕 | 黄网站免费久久 | 狂野欧美激情性xxxx | 国产资源在线观看 | 午夜av日韩 | 国产色拍拍拍拍在线精品 | 激情欧美在线观看 | 不卡av在线 | 精品欧美一区二区精品久久 | 久久婷五月 | 干干干操操操 | 久久国产精品99久久久久久丝袜 | 久久久久久综合网天天 | 日本中出在线观看 | 久久久美女 | 激情综合国产 | 黄色软件在线观看 | 精品国产99 | 国产黄影院色大全免费 | 欧美a视频在线观看 | 波多野结衣视频网址 | 国产91精品在线播放 | 成年人免费电影在线观看 | 国产精品美女免费视频 | 国产精品 日韩 | 一级黄色毛片 | 欧美激情视频一区二区三区免费 | 又黄又爽免费视频 | 久久精品久久久久 | 国产福利91精品一区 | 操操操操网 | 人人爽人人爽人人片av免 | 美女免费黄视频网站 | 九九免费在线看完整版 | 狂野欧美激情性xxxx | 一区二区中文字幕在线 | 日韩视频1 | 免费欧美| 天天操夜夜爱 | 国产精品美女久久久久久久 | 免费黄色网址大全 | 久久综合色影院 | 日本aaaa级毛片在线看 | 国产69精品久久久久久 | 亚洲日日夜夜 | www激情久久 | 超碰在线9| 四虎影视精品 | 亚洲精品在线资源 | 国产日本在线播放 | 免费在线观看av网址 | 国产精品久久久久久婷婷天堂 | 激情综合久久 | 日本在线观看中文字幕 | 密桃av在线 | 亚洲电影免费 | www.福利视频 | 中文字幕高清在线播放 | 国产精品久久久久久久久大全 | 高清日韩一区二区 | 天天天天综合 | av中文资源在线 | 色婷婷精品大在线视频 | 欧美一区二区三区在线观看 | 久久久久综合网 | 欧美激情精品久久久久久 | av成人在线看 | 久久久免费看视频 | 国产精品美女视频 | 国产美女免费视频 | 久久国产三级 | 麻豆国产精品va在线观看不卡 | 五月综合激情 | 国产一区二区不卡视频 | 69国产成人综合久久精品欧美 | 人人舔人人爽 | 在线观看mv的中文字幕网站 | 国产精品国产三级国产aⅴ9色 | 99精品免费视频 | 欧美另类xxx| 国精产品999国精产品视频 | 亚洲精品国产精品乱码不99热 | 91丨九色丨蝌蚪丨对白 | 亚洲精品一区二区精华 | 日韩aa视频 | 久久久九色精品国产一区二区三区 | 国产精品久久久久久久久久三级 | 日韩一区二区三区观看 | 狠狠色丁香久久综合网 | 中文字幕av在线播放 |