成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > PHP實現(xiàn)微信小程序用戶授權(quán)的工具類示例

PHP實現(xiàn)微信小程序用戶授權(quán)的工具類示例

熱門標簽:銀川ai電話機器人 地圖標注風向標 安陽自動外呼系統(tǒng)價格是多少 芒果電銷機器人 上海公司外呼系統(tǒng)線路 臨沂智能電銷機器人軟件 浙江外呼電話系統(tǒng)軟件 十堰ai電話機器人效果怎么樣 電梯外呼線路板維修視頻

先準備工作

1.申請一個小程序,申請地址:傳送門
2.仔細閱讀小程序的用戶授權(quán)登陸官方文檔: 《用戶授權(quán)登陸的流程》
3.仔細閱讀微信用戶數(shù)據(jù)解密的相關(guān)文檔: 《用戶數(shù)據(jù)解密說明文檔》
4.在小程序后臺配置好相應(yīng)的后端請求地址,路徑是:開發(fā)---->開發(fā)設(shè)置,如圖


5.小程序如果需要做多個小程序的打通,還需要在微信開放平臺綁定到開發(fā)者賬號下面, 如果不需要union_id請忽略

6.服務(wù)端準備一個用戶授權(quán)的接口,假設(shè)接口鏈接為http://test.dev.com/user/authorization,此接口接受如下參數(shù)

  • code:微信登陸接口返回的登陸憑證,用戶獲取session_key
  • iv:微信小程序登陸接口返回的向量,用于數(shù)據(jù)解密
  • encrypted_data : 微信獲取用戶信息接口的返回的用戶加密數(shù)據(jù),用于后端的接口解析
  • signature加密數(shù)據(jù)

接口返回的數(shù)據(jù)如下

{
  "errcode": 200,
  "msg": "SUCCESS",
  "data": {
    "uid": 34098,
    "unionid": "xxx",
  }
}

6.建表

1)用戶表,其中比較重要的字段是union_id,因為我們是有多個小程序和公眾號,因此使用這個來區(qū)分唯一的用戶編號

DROP TABLE IF EXISTS `jz_wxa_user`;
CREATE TABLE `jz_wxa_user` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `uid` bigint(18) DEFAULT NULL,
 `openid` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'openid',
 `user_name` varchar(100) CHARACTER SET utf8mb4 DEFAULT '',
 `nick_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '用戶昵稱',
 `sex` enum('0','1') CHARACTER SET utf8 DEFAULT '1' COMMENT '性別',
 `avatar` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '用戶頭像',
 `province` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '省份',
 `city` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '城市',
 `country` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '國家',
 `wx_union_id` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '公眾平臺的唯一id',
 `from_url` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '來源url',
 `created_at` timestamp NULL DEFAULT NULL,
 `updated_at` timestamp NULL DEFAULT NULL,
 `from_appid` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT 'wx95fc895bebd3743b' COMMENT '來源appid',
 `wx_header` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '微信頭像',
 `gh_openid` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '微信公眾號openid',
 `phone` varchar(30) CHARACTER SET utf8 DEFAULT '' COMMENT '手機號碼',
 PRIMARY KEY (`id`),
 KEY `idx_uid_union_id` (`uid`,`wx_union_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

實現(xiàn)步驟

用戶授權(quán)時序圖

關(guān)鍵代碼

小程序端

小程序端的獲取用戶信息流程

1)調(diào)用login方法獲取code
2)調(diào)用getUserInfo方法獲取用戶的加密數(shù)據(jù)
3)調(diào)用后端的用戶授權(quán)接口將用戶信息保存到服務(wù)端
4)保存后端接口返回的uid和unionid到localstorage中,作為全局參數(shù)

獲取用戶的授權(quán)信息

getUid:function(cf){
  var that = this
  wx.login({
   success: function (ress) {
    var code = ress.code 
    wx.getUserInfo({ 
     withCredentials: true,     
     success: function (res) {
      that.globalData.userInfo = res.userInfo;
      that.authorize(code, res.signature, res.iv, res.rawData, res.encryptedData, cf)
     }
    })
   }
  })
 },
 authorize: function (code, signature, iv, rawData, encryptedData, cf) {
  var that =this
  var dataobj = {
   code: code,
   signature: signature,
   iv: iv,
   raw_data: rawData,
   encrypted_data: encryptedData
  }
  console.log("code:",code)
  var param = JSON.stringify(dataobj)
  param = that.Encrypt(param)
  var url = that.data.API_DOMAIN2 + "/user/authorization?param=" + param
  wx.request({
   url: url,
   method: "GET",
   header: {
    'content-type': 'application/json'
   },
   success: function (res) {
    if (res.data.errcode == 200) {
     wx.hideToast()    
     wx.setStorage({
      key: "uid",
      data: res.data.data.uid,
      success: function () {
       if (cf) {
        typeof cf == "function"  cf(res.data.data.uid)
       }
      }
     })
    } else {
     that.exceptionHandle('uid', url, res.data.errcode, res.data.msg)
    }
   }
  })
 },

服務(wù)端

入口方法

/**
   * api接口開發(fā)
   * 獲取詳情的接口
   * @param $uid 用戶編號
   * @param $iv 向量
   * @param $encryptedData 微信加密的數(shù)據(jù)
   * @param $rawData 判斷是否為今天
   * @param $signature 簽名
   * @return array
   */
  public static function authorization($appid,$appsecret,$code,$iv,$encryptedData,$rawData,$signature){
    $result = self::decodeWxData($appid,$appsecret,$code,$iv,$encryptedData);
    if($result['errcode'] != 200){
      return $result;
    }
    //處理微信授權(quán)的邏輯
    $wxUserData = $result['data'];
    error_log("authorization data=============>");
    error_log(json_encode($wxUserData));
    $uid = WxaUserService::regWxaUser($wxUserData);
    $data['uid'] = $uid['uid'];
    $data['unionid'] = $uid['unionid'];
    $result['data'] = $data;
    return $result;
  }
  
  /**
   * 解密微信的數(shù)據(jù)
   * @param $code wx.login接口返回的code
   * @param $iv wx.getUserInfo接口或者wx.getWeRunData返回的iv
   * @param $encryptedData wx.getUserInfo接口或者wx.getWeRunData返回的加密數(shù)據(jù)
   * @return array
   */
  public static function decodeWxData($appid,$appsecret,$code,$iv,$encryptedData){
    $sessionKeyUrl = sprintf('%s?appid=%ssecret=%sjs_code=%sgrant_type=authorization_code',config('param.wxa_user_info_session_key_url'),$appid,$appsecret,$code);
    $rtnJson = curlRequest($sessionKeyUrl);
    $data = json_decode($rtnJson,true);
    error_log('authorization wx return data========>');
    error_log($rtnJson);
    if(isset($data['errcode'])){
      return $data;
    }
    $sessionKey = $data['session_key'];
    $wxHelper = new WxBizDataHelper($appid,$sessionKey,$encryptedData,$iv);
    $data['errcode'] = 200;
    $data['data'] = [];
    if(!$wxData = $wxHelper->getData()){
      $data['errcode'] = -1;
    }else{
      error_log('current wx return data is =========>'.json_encode($wxData));
      $data['data'] = $wxData;
    }
    return $data;
  }

保存用戶信息的方法

 /**
   * 保存用戶信息的方法
   * @param $wxaUserData
   * @param $regFromGh 表示是否從公眾號進行注冊
   */
  public function regWxaUser($wxaUserData,$regFromGh = false)
  {
    $value = $wxaUserData['unionId'];
    $key = getCacheKey('redis_key.cache_key.zset_list.lock') . $value;
    $newExpire = RedisHelper::getLock($key);
    $data = $this->storeWxaUser($wxaUserData,$regFromGh);
    RedisHelper::releaseLock($key, $newExpire);
    return $data;
  }
  
  /**
   * 保存信息
   * @param $wxaUserData
   * @return mixed
   */
  public function storeWxaUser($wxaUserData,$regFromGh = false)
  {
    $wxUnionId = $wxaUserData['unionId'];
    if (!$user = $this->getByWxUnionId($wxUnionId)) {
      $getAccountDataStartTime = time();
      //這里是因為需要統(tǒng)一賬戶獲取uid,所以這個是用戶中心的接口,如果沒有這個流程,則直接使用數(shù)據(jù)
      if($accountData = AccountCenterHelper::regWxaUser($wxaUserData)){
        $getAccountDataEndTime = time();
        $accountRegTime = $getAccountDataEndTime - $getAccountDataStartTime;
        error_log("reg user spend time is ===================>" . $accountRegTime);
        $user = [
          'uid' => $accountData['uid'],
          'user_name' => $accountData['user_name'],
          'nick_name' => $wxaUserData['nickName'],
          'sex' => $accountData['sex'],
          'wx_union_id' => $accountData['wx_union_id'],
          'avatar' => isset($accountData['avatar'])?$accountData['avatar']:"",
          'from_appid' => $accountData['from_appid'],
          'province' => $wxaUserData['province'],
          'city' => $wxaUserData['city'],
          'country' => $wxaUserData['country'],
          'openid' => $wxaUserData['openId'],
          'wx_header' => isset($wxaUserData['avatarUrl'])?$wxaUserData['avatarUrl']:"",
          'gh_openid' => $regFromGh?$wxaUserData['openId']:"",
        ];
        error_log("insert data=============>" . json_encode($user));
        $user = $this->store($user);
        $regApiUserEndTime = time();
        error_log(" reg api user spend time================>" . ($regApiUserEndTime - $getAccountDataEndTime));
        error_log(" after insert data=============>" . json_encode($user));
      }
    }else{
      if(!$user['wx_header']){
        $updateData = [
          'id' => $user['id'],
          'uid' => $user['uid'],
          'wx_header' => $wxaUserData['avatarUrl'],
        ];
        $this->update($updateData);
      }
      //同步用戶的openid
      if($wxaUserData['openId'] != $user['openid']){
        $updateData = [
          'id' => $user['id'],
          'uid' => $user['uid'],
          'openid' => $wxaUserData['openId'],
        ];
        $this->update($updateData);
      }
    }
    $data['uid'] = $user['uid'];
    $data['unionid'] = $wxUnionId;
    return $data;
  }

根據(jù)unionid獲取用戶信息

  /**
   * 根據(jù)unionid獲取用戶信息
   */
  public function getByWxUnionId($unionId)
  {
    $cacheKey = getCacheKey('redis_key.cache_key.wxa_user.info') . $unionId;
    $value = $this->remember($cacheKey, function () use ($unionId) {
      $userInfo = WxaUser::where('wx_union_id', $unionId)->first();
      $userInfo = $this->compactUserInfo($userInfo);
      return $userInfo;
    });
    return $value;
  }

WxBizDataHelper工具類

?php
/**
 * Created by PhpStorm.
 * User: Auser
 * Time: 11:17
 */

namespace App\Http\Base\Wx;


class WxBizDataHelper
{

  private $appid;
  private $seesionKey ;
  private $encryptedData;
  private $iv;
  public function __construct($appid, $sessionKey,$encryptedData, $iv)
  {
    $this->appid = $appid;
    $this->seesionKey = $sessionKey;
    $this->encryptedData = $encryptedData;
    $this->iv = $iv;
  }

  public function getData(){
    $pc = new WXBizDataCrypt($this->appid, $this->seesionKey);
    $json = '';
    $errCode = $pc->decryptData($this->encryptedData, $this->iv, $json);
    $data = [];
    if ($errCode == 0) {
      $data = json_decode($json,true);
    }
    return $data;
  }


}

WXBizDataCrypt工具類

?php
/**
 * Created by PhpStorm.
 * User: Auser
 * Time: 10:38
 */

namespace App\Http\Base\Wx;

use App\Http\Base\Wx\Prpcrypt;
use App\Http\Base\Wx\ErrorCode;
use App\Http\Base\Wx\PKCS7Encoder;
class WXBizDataCrypt
{

  private $appid;
  private $sessionKey;

  /**
   * 構(gòu)造函數(shù)
   * @param $sessionKey string 用戶在小程序登錄后獲取的會話密鑰
   * @param $appid string 小程序的appid
   */
  public function __construct( $appid, $sessionKey)
  {
    $this->sessionKey = $sessionKey;
    $this->appid = $appid;
  }


  /**
   * 檢驗數(shù)據(jù)的真實性,并且獲取解密后的明文.
   * @param $encryptedData string 加密的用戶數(shù)據(jù)
   * @param $iv string 與用戶數(shù)據(jù)一同返回的初始向量
   * @param $data string 解密后的原文
   *
   * @return int 成功0,失敗返回對應(yīng)的錯誤碼
   */
  public function decryptData( $encryptedData, $iv, $data )
  {
    if (strlen($this->sessionKey) != 24) {
      return ErrorCode::$IllegalAesKey;
    }
    $aesKey=base64_decode($this->sessionKey);


    if (strlen($iv) != 24) {
      return ErrorCode::$IllegalIv;
    }
    $aesIV=base64_decode($iv);

    $aesCipher=base64_decode($encryptedData);

    $pc = new Prpcrypt($aesKey);
    $result = $pc->decrypt($aesCipher,$aesIV);

    if ($result[0] != 0) {
      return $result[0];
    }

    $dataObj=json_decode( $result[1] );
    if( $dataObj == NULL )
    {
      return ErrorCode::$IllegalBuffer;
    }
    if( $dataObj->watermark->appid != $this->appid )
    {
      return ErrorCode::$IllegalBuffer;
    }
    $data = $result[1];
    return ErrorCode::$OK;
  }

}

Prpcrypt工具類

?php
/**
 * Created by PhpStorm.
 * User: Auser
 * Time: 10:55
 */

namespace App\Http\Base\Wx;

class Prpcrypt
{
  public $key;

  public function __construct($key)
  {
    $this->key = $key;
  }

  /**
   * 對密文進行解密
   * @param string $aesCipher 需要解密的密文
   * @param string $aesIV 解密的初始向量
   * @return string 解密得到的明文
   */
  public function decrypt($aesCipher, $aesIV)
  {

    try {
      $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
      mcrypt_generic_init($module, $this->key, $aesIV);
      //解密
      $decrypted = mdecrypt_generic($module, $aesCipher);
      mcrypt_generic_deinit($module);
      mcrypt_module_close($module);
    } catch (Exception $e) {
      return array(ErrorCode::$IllegalBuffer, null);
    }


    try {
      $result = PKCS7Encoder2::decode($decrypted);
    } catch (Exception $e) {
      //print $e;
      return array(ErrorCode::$IllegalBuffer, null);
    }
    return array(0, $result);
  }
}

ErrorCode狀態(tài)代碼類

?php
/**
 * Created by PhpStorm.
 * User: Auser
 * Time: 10:33
 */

namespace App\Http\Base\Wx;


class ErrorCode
{
  public static $OK = 0;
  public static $IllegalAesKey = -41001;
  public static $IllegalIv = -41002;
  public static $IllegalBuffer = -41003;
  public static $DecodeBase64Error = -41004;

}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 微信小程序開發(fā)之獲取用戶手機號碼(php接口解密)
  • 微信小程序發(fā)送訂閱消息的方法(php 為例)
  • 基于PHP實現(xiàn)微信小程序客服消息功能
  • 微信小程序?qū)W習筆記之表單提交與PHP后臺數(shù)據(jù)交互處理圖文詳解
  • PHP小程序支付功能完整版【基于thinkPHP】
  • PHP后臺實現(xiàn)微信小程序登錄
  • 微信小程序調(diào)用PHP后臺接口 解析純html文本
  • 微信小程序圖片選擇、上傳到服務(wù)器、預(yù)覽(PHP)實現(xiàn)實例
  • 微信小程序 PHP后端form表單提交實例詳解
  • PHP:微信小程序 微信支付服務(wù)端集成實例詳解及源碼下載
  • PHP小程序后臺部署運行 LNMP+WNMP的方法

標簽:荊門 徐州 遵義 吐魯番 常州 寧夏 遂寧 武威

巨人網(wǎng)絡(luò)通訊聲明:本文標題《PHP實現(xiàn)微信小程序用戶授權(quán)的工具類示例》,本文關(guān)鍵詞  PHP,實現(xiàn),微信,小,程序,用戶,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP實現(xiàn)微信小程序用戶授權(quán)的工具類示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP實現(xiàn)微信小程序用戶授權(quán)的工具類示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产成人在线免费视频| 国产夫妻在线观看| 天天在线女人的天堂视频| 日韩电影网1区2区| 亚洲一区二三区| 国产精品扒开腿做爽爽| 亚洲精品欧美综合四区| 国产色产综合色产在线视频| 欧美成人app| 日韩影院一区二区| 日本一区二区久久精品| 色哟哟一一国产精品| 日韩a在线播放| 亚洲私人黄色宅男| 亚洲资源在线看| 婷婷精品国产一区二区三区日韩| 亚洲大肥女ass| 亚洲国产精品第一区二区三区| 国产麻豆视频免费观看| 91高清在线观看视频| 久久久久久福利| 国产乱码在线观看| 久久人人爽av| 亚洲午夜久久久影院伊人| 波霸ol色综合网| 欧美大片网站| 成人亚洲激情网| 亚洲男人天堂av在线| 国产黄色在线免费观看| 国产91精品一区| 久久综合成人| 国产视频一区二区三区四区| 免费av观看网站| 日韩一区二区三区四区| 日韩黄色免费电影| 潘金莲一级淫片aaaaa| 亚洲人成电影| 夜夜嗨av禁果av粉嫩avhd| 欧美极品美女视频网站在线观看免费| 日韩av片电影专区| 欧美久久久久久久久久| 蜜臀国产一区二区三区在线播放| 日韩国产一区| 欧美午夜在线播放| 国产一区二区三区精彩视频| 国产女大学生av| 国产又黄又猛又爽| 成人黄色a级片| 中文字幕在线中文字幕在线中三区| 男女人搞j网站| 国产高清视频一区二区| av资源中文在线| 国产69精品久久久久久久久久| 久久精品国产亚洲av无码娇色| 在线看欧美日韩| 国产精品∨欧美精品v日韩精品| 亚洲精品粉嫩美女一区| 天天操天天爽天天射| a在线观看免费| 国产性一乱一性一伧一色| 国产宾馆实践打屁股91| 91电影在线| 污色网站在线观看| 桃乃木香奈和黑人aⅴ在线播放| 日韩欧美午夜| 亚洲欧美中文字幕| 日韩黄色免费网站| 岛国av在线不卡| 欧美三级美国一级| 欧美日韩国产一区二区三区不卡| www.欧美国产| 亚洲成人999| 91精品国产自产精品男人的天堂| 男女爽爽爽视频| 日韩aaaaaa| 特级黄色录像片| 国产成人愉拍精品久久| 在线精品视频视频中文字幕| 中文字幕免费观看| 欧美日韩中文字幕视频| 国产精品久久久久9999小说| 亚洲成人在线免费| www.色亚洲| 素人av在线| 久久久噜噜噜久久狠狠50岁| 国产成人精品久久亚洲高清不卡| 国产精品一区二区av| eeuss免费天堂影院| 日本人亚洲人jjzzjjz| 亚洲影视九九影院在线观看| 国产又粗又猛又黄| 中文天堂在线播放| 久热成人在线视频| 永久免费无码av网站在线观看| 色综合888| 黄色网在线视频| 亚洲精品日韩欧美| 国产一区视频免费观看| 国产男女免费视频| 国产一区二区三区在线看| 老头吃奶性行交视频| 99精品国产在热久久婷婷| 在线观看亚洲一区二区| 成人满18在线观看网站免费| 免费看成人吃奶视频在线| 香蕉视频网页版| 成人精品999| 国家队第一季免费高清在线观看| 91视频在线看| 亚州av乱码久久精品蜜桃| 99久久人妻无码中文字幕系列| 午夜精品久久久久久99热| 亚洲成人精品一区二区三区| 自拍偷拍亚洲天堂| 欧美精品一区二区久久婷婷| 老牛影视av牛牛影视av| 后进极品白嫩翘臀在线视频| 亚洲校园激情春色| 国产三级按摩推拿按摩| 日韩成人在线电影| 久久精品久久久久久久| 精品国产成人在线影院| 好吊妞这里只有精品| 国产女大学生av| 欧美黄色激情| 日本在线观看不卡| 亚洲成a人片在线不卡一二三区| 亚洲日本青草视频在线怡红院| 伊人成人开心激情综合网| 日韩精品专区在线| 污污免费在线观看| 亚洲国语精品自产拍在线观看| 羞羞免费视频网站| 国产资源在线视频| xxxxx.日韩| av男人天堂av| 精品久久在线观看| 免费黄视频在线观看| 欧美极品少妇xxxxⅹ喷水| 在线中文字幕观看| 久久精品电影一区二区| av大片在线免费观看| 性网站在线免费观看| 成人午夜在线播放| 国产日韩欧美在线播放不卡| 亚洲一区 欧美| 麻豆av一区二区三区| 精品一区二区无码| 5252色成人免费视频| √天堂资源地址在线官网| 香蕉视频成人在线| 一区二区三区四区不卡视频| 成人教育av在线| 狂野欧美性猛交xxxxx视频| 国产极品jizzhd欧美| 日韩精品一区二区在线视频| 91国内精品视频| 波多野结衣在线影院| 欧美视频一区二区三区…| 精品亚洲综合| 成人avav影音| 久久久久久久久久一区二区| 亚洲一区二区三区四区的| 波多野结衣电影免费观看| 国产精品久久久久久在线观看| 91色婷婷久久久久合中文| wwwxxxx国产| 97超碰人人澡| 久久激情综合网| 一区二区三区日本视频| 成人一区二区三| 日韩精品一区二区三区在线| 色婷婷综合在线观看| 日韩在线不卡| 国产精品午夜一区二区欲梦| silk一区二区三区精品视频| 国产在线精品免费| 午夜一级在线看亚洲| 亚洲影视在线观看| 亚洲国内精品在线| 国产在视频线精品视频| 欧美日韩一区二区欧美激情| 超碰在线资源| 亚洲a在线视频| 午夜国产一区二区三区| 成人毛片视频在线观看| 免费日韩中文字幕| 丁香花高清电影在线观看完整版| 欧美国产日韩在线观看| 激情久久综合网| 日本一二三区视频免费高清| 高h视频在线播放| 久九九久频精品短视频| 韩国av在线播放| 国产综合第一页| 国产v亚洲v天堂无码| 人妻丰满熟妇av无码久久洗澡| 国产精品无码无卡无需播放器| 国产精品一区二区三区四区色| av小说在线| 中文字幕精品在线视频| 正在播放一区| 国产精品极品美女粉嫩高清在线| 熟妇高潮一区二区高潮| 美女爆乳18禁www久久久久久| 国产一区二区三区四区在线| 亚洲精品国产电影| 免费在线观看污网站| 懂色中文一区二区在线播放| 欧美一级二级三级视频| 久久久一本二本三本| 最新在线你懂的| 青柠在线免费观看| 国产精品一区二区免费看| 香蕉久久夜色精品国产使用方法| 久久国产成人| 天天做天天摸天天爽国产一区| 中文字幕无码不卡免费视频| 久久久.com| ass精品国模裸体欣赏pics| 国产91视频一区| 亚洲精品视频在线| 裸模一区二区三区免费| 欧美女人天堂| 国产精品久久久久婷婷| 欧美黄在线观看| 久热在线中文字幕色999舞| 中文字幕视频一区二区在线有码| 亚洲 美腿 欧美 偷拍| 国产福利视频网站| 国产一区二区三区亚洲| 无码中文字幕色专区| 国产亚洲综合性久久久影院| 国产裸舞福利在线视频合集| 韩国女主播一区二区三区| 日韩欧美精品免费| 亚洲综合欧美在线| 日韩在线视频在线| 亚洲欧洲另类精品久久综合| 日韩精品一区二区三区免费观影| 国产美女久久久久久| 韩国中文字幕hd久久精品| 国产精品免费久久久久| 亚洲激情六月丁香| 精品婷婷色一区二区三区蜜桃| 免费黄色网址网站| 国内av一区二区三区| 国产一区精品二区| 色中色综合网| 91麻豆精品国产91久久久资源速度| 国产一区二区免费视频| 国产69精品久久久久9999apgf| 从欧美一区二区三区| 成人国产一区二区三区精品麻豆| 红桃成人av在线播放| 亚洲黄色一区| 草莓福利社区在线| 日本午夜精品久久久久| 日本成熟性欧美| 国产男女av| 国产一区二区美女视频| 自拍偷拍21p| 99热超碰在线| 国产又爽又黄又嫩又猛又粗| 欧美日韩免费看片| 亚洲男人天堂久久| 久久久久国产精品厨房| 久久天堂电影网| 樱花视频在线免费观看| 欧美激情综合色| 你懂的好爽在线观看| 91老司机精品视频| 欧美r片在线| 黄色av一区二区三区| 一区二区电影在线观看| 国产精品色婷婷在线观看| 97视频中文字幕| 四虎永久在线观看| 一区二区三区日韩精品| 精品盗摄女厕tp美女嘘嘘| 91亚洲精品久久久久久久久久久久| 92福利视频午夜1000合集在线观看| 国产一二三四在线视频| 先锋在线亚洲| 青青艹在线视频| 92福利视频午夜1000合集在线观看| а√天堂在线官网| 午夜不卡久久精品无码免费| 国产亚洲欧美久久久久| 天堂在线一区二区三区| 亚洲小说区图片| 黄色av电影网站| 在线观看h网址| 欧美超级免费视 在线| 一区二区免费电影| 国产精品日韩三级| 午夜视频一区二区| 日本少妇一级片| 波多野结衣手机在线视频| 亚洲精品高清无码视频| 日韩精品1区| 99久久99久久精品免费观看| abab456成人免费网址| 91在线无精精品白丝| 成人免费91在线看| 日韩人体视频一二区| 国产高清自拍视频| 国产又黄又粗的视频| 俄罗斯av网站| 在线人成日本视频| 先锋影音资源综合在线播放av| 国产日韩欧美一区在线| 在线观看免费91| 欧美绝品在线观看成人午夜影视| 国产一级二级三级精品| 天堂av一区二区三区| 不卡av免费在线| 欧美激情黑白配| 视频在线在亚洲| 九九久久精品视频| 欧美色综合天天久久综合精品| 97精品一区二区视频在线观看| 欧美大片91| 日韩一区二区三区在线免费观看| 有码一区二区三区| 青春娱乐分类视频精品2动漫| 国产精品高潮呻吟av| 欧类av怡春院|