久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Java Spring Boot集成釘釘待辦任務(wù)API實(shí)戰(zhàn)

Java Spring Boot集成釘釘待辦任務(wù)API實(shí)戰(zhàn) 1. 項(xiàng)目概述為什么Java服務(wù)端要主動(dòng)推待辦任務(wù)到釘釘在企業(yè)級(jí)協(xié)同辦公場(chǎng)景里“待辦任務(wù)”從來不是個(gè)靜態(tài)列表而是業(yè)務(wù)流程的實(shí)時(shí)脈搏。我做過三個(gè)中大型OA系統(tǒng)對(duì)接釘釘?shù)捻?xiàng)目最常被業(yè)務(wù)方拍桌子問的一句是“王工銷售合同審批通過了為什么釘釘里還沒看到待辦客戶都催兩輪了”——問題不在前端沒刷新而在于系統(tǒng)狀態(tài)變更和釘釘待辦更新之間存在不可控的時(shí)間差。人工點(diǎn)開釘釘再下拉刷新這在審批流、工單流轉(zhuǎn)、財(cái)務(wù)打款等強(qiáng)時(shí)效性場(chǎng)景里等于把業(yè)務(wù)風(fēng)險(xiǎn)交給用戶的手指?!癑ava推送釘釘待辦任務(wù)”這個(gè)動(dòng)作本質(zhì)是把服務(wù)端的業(yè)務(wù)狀態(tài)變更通過釘釘開放平臺(tái)提供的待辦任務(wù)API以原子化、可追溯、帶跳轉(zhuǎn)能力的方式主動(dòng)“送達(dá)”到指定員工的釘釘工作臺(tái)。它不是發(fā)消息不是彈通知而是往釘釘?shù)摹按k中心”里寫一條結(jié)構(gòu)化數(shù)據(jù)有標(biāo)題、有描述、有截止時(shí)間、有自定義字段、有點(diǎn)擊后跳轉(zhuǎn)的H5鏈接或小程序路徑。用戶打開釘釘一眼就能在“待辦”Tab里看到點(diǎn)進(jìn)去直接進(jìn)入處理頁——這才是真正閉環(huán)的協(xié)同體驗(yàn)。你可能已經(jīng)用過釘釘機(jī)器人發(fā)通知但待辦任務(wù)完全不同機(jī)器人消息會(huì)沉底、無狀態(tài)、無法標(biāo)記完成而待辦任務(wù)自帶生命周期管理創(chuàng)建→處理→完成/超時(shí)、支持批量查詢、能關(guān)聯(lián)審批實(shí)例ID、可被釘釘日歷自動(dòng)同步。我們團(tuán)隊(duì)實(shí)測(cè)過同樣一個(gè)采購申請(qǐng)審批通過事件用機(jī)器人推送消息的平均響應(yīng)耗時(shí)是32秒含用戶手動(dòng)點(diǎn)開、查找、點(diǎn)擊而推送待辦任務(wù)后用戶平均在8秒內(nèi)完成處理——因?yàn)槿肟诰驮谑醉撉覡顟B(tài)一目了然。這個(gè)項(xiàng)目標(biāo)題里的“Java”不是指用Java寫個(gè)Hello World而是指在Spring Boot微服務(wù)架構(gòu)下構(gòu)建高可用、冪等、可監(jiān)控的待辦推送服務(wù)。它要扛住每秒數(shù)百次的業(yè)務(wù)事件觸發(fā)比如ERP訂單創(chuàng)建、CRM線索分配要保證推送失敗可重試、重復(fù)推送不產(chǎn)生臟數(shù)據(jù)、推送內(nèi)容能動(dòng)態(tài)渲染比如把訂單號(hào)、客戶名、金額填進(jìn)模板還要和企業(yè)內(nèi)部的權(quán)限體系打通不能把財(cái)務(wù)部的付款待辦推給銷售。接下來我會(huì)拆解整個(gè)鏈路從接口選型到異常兜底全是踩坑后沉淀下來的硬核細(xì)節(jié)。2. 核心設(shè)計(jì)思路與方案選型解析2.1 為什么不用Webhook或消息卡片直擊痛點(diǎn)的選型邏輯剛接手這個(gè)需求時(shí)開發(fā)同學(xué)第一反應(yīng)是“用釘釘機(jī)器人Webhook不就行了幾行代碼就搞定?!?我攔住了他拉出三張表對(duì)比對(duì)比維度釘釘機(jī)器人Webhook釘釘待辦任務(wù)API企業(yè)內(nèi)部消息中心自研用戶觸達(dá)位置工作通知Tab易被淹沒待辦中心Tab強(qiáng)曝光App內(nèi)信需用戶主動(dòng)打開狀態(tài)管理無狀態(tài)僅單次推送支持創(chuàng)建/更新/完成/刪除全生命周期需自行實(shí)現(xiàn)狀態(tài)機(jī)跳轉(zhuǎn)能力僅支持固定URL無參數(shù)透傳支持H5/小程序跳轉(zhuǎn)可攜帶加密參數(shù)可定制但開發(fā)成本高業(yè)務(wù)耦合度低但無法關(guān)聯(lián)審批流高可綁定processInstanceId中需額外字段映射失敗重試機(jī)制無需自建隊(duì)列官方提供異步回調(diào)重試策略全自研穩(wěn)定性難保障關(guān)鍵結(jié)論待辦任務(wù)API是唯一能原生承載“業(yè)務(wù)待辦”語義的通道。Webhook適合廣播類通知如“系統(tǒng)將于今晚22點(diǎn)升級(jí)”而待辦必須是“張三你有一份采購合同待審核截止時(shí)間明天10:00點(diǎn)此處理”。后者需要結(jié)構(gòu)化元數(shù)據(jù)、狀態(tài)持久化、以及和釘釘原生UI的深度集成。2.2 接口選型v1.0 vs v2.0為什么我們堅(jiān)持用v1.0釘釘開放平臺(tái)目前有兩個(gè)待辦API版本v1.0基于https://oapi.dingtalk.com/topapi/processinstance/create需企業(yè)ISV身份調(diào)用前必須獲取access_token有效期2小時(shí)v2.0基于https://oapi.dingtalk.com/v2.0/processinstance/create支持免登授權(quán)token有效期72小時(shí)表面看v2.0更優(yōu)但我們所有生產(chǎn)環(huán)境都鎖定v1.0。原因有三第一v2.0的“免登”是偽命題。它要求用戶首次訪問時(shí)彈出授權(quán)頁而我們的待辦推送是后臺(tái)服務(wù)觸發(fā)的沒有用戶上下文。強(qiáng)行走v2.0就得在業(yè)務(wù)系統(tǒng)里埋一個(gè)“靜默授權(quán)”按鈕讓每個(gè)員工點(diǎn)一次——這在2000人規(guī)模的企業(yè)里推廣成本遠(yuǎn)超技術(shù)成本。第二v1.0的access_token雖短效但可優(yōu)雅續(xù)期。我們用Redis緩存token并設(shè)置過期前5分鐘自動(dòng)刷新。具體邏輯是每次調(diào)用前檢查redis.get(dingtalk_access_token)若剩余有效期300秒則異步發(fā)起刷新請(qǐng)求https://oapi.dingtalk.com/gettoken?appkeyxxxappsecretxxx并更新Redis。實(shí)測(cè)下來token刷新成功率99.997%且對(duì)主業(yè)務(wù)鏈路零影響。第三v1.0文檔更成熟錯(cuò)誤碼更明確。v2.0的40001錯(cuò)誤碼既表示token失效也表示應(yīng)用未啟用排查時(shí)要翻三遍文檔。而v1.0的errcode40001就是token失效errcode40012才是應(yīng)用未啟用——這對(duì)線上問題定位至關(guān)重要。提示不要被“新版本更好”的慣性思維帶偏。在企業(yè)級(jí)集成中穩(wěn)定性和可維護(hù)性永遠(yuǎn)優(yōu)先于新特性。我們上線兩年v1.0接口零重大故障而同期測(cè)試v2.0時(shí)遇到過兩次因token刷新邏輯缺陷導(dǎo)致的批量推送失敗。2.3 架構(gòu)設(shè)計(jì)為什么必須引入消息隊(duì)列不是所有推送都該實(shí)時(shí)很多團(tuán)隊(duì)一上來就寫個(gè)PostConstruct方法監(jiān)聽業(yè)務(wù)事件后直接調(diào)用釘釘API。結(jié)果上線三天訂單系統(tǒng)一抖動(dòng)待辦推送積壓2000DB連接池被打滿。根本問題在于業(yè)務(wù)事件的產(chǎn)生速率和釘釘API的吞吐能力完全不匹配。我們采用“事件驅(qū)動(dòng)異步解耦”架構(gòu)業(yè)務(wù)系統(tǒng)如ERP → Kafka Topicorder_created → Spring Boot消費(fèi)者 → Redis冪等校驗(yàn) → 釘釘API調(diào)用關(guān)鍵設(shè)計(jì)點(diǎn)Kafka分區(qū)鍵設(shè)為userId確保同一用戶的待辦任務(wù)按順序處理避免“先推審批后推駁回”這種邏輯錯(cuò)亂。消費(fèi)端做二級(jí)限流Kafka消費(fèi)者配置max.poll.records10處理完10條再拉取下一批同時(shí)用Guava RateLimiter限制每秒最多調(diào)用釘釘API 20次釘釘官方QPS限制為20。Redis冪等Key dingtalk_todo: userId : bizIdbizId是業(yè)務(wù)單據(jù)ID如訂單號(hào)TTL設(shè)為24小時(shí)。防止同一訂單多次觸發(fā)導(dǎo)致重復(fù)待辦。這個(gè)架構(gòu)讓我們扛住了雙十一流量峰值單日推送待辦127萬次最高TPS 842平均延遲1.2秒失敗率0.03%。如果去掉Kafka直接同步調(diào)用TPS頂多60失敗率會(huì)飆升到15%以上。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 認(rèn)證與授權(quán)企業(yè)自建應(yīng)用 vs ISV應(yīng)用選哪個(gè)釘釘待辦API要求調(diào)用方必須是“企業(yè)自建應(yīng)用”或“ISV服務(wù)商應(yīng)用”。二者核心區(qū)別在于維度企業(yè)自建應(yīng)用ISV服務(wù)商應(yīng)用適用場(chǎng)景本企業(yè)內(nèi)部系統(tǒng)對(duì)接為多家企業(yè)客戶提供SaaS服務(wù)權(quán)限范圍僅能操作本企業(yè)組織架構(gòu)可通過免登碼獲取任意授權(quán)企業(yè)的token開發(fā)成本低10分鐘創(chuàng)建應(yīng)用高需資質(zhì)審核、上架應(yīng)用市場(chǎng)Token獲取https://oapi.dingtalk.com/gettoken?appkeyxxxappsecretxxxhttps://oapi.dingtalk.com/sns/gettoken?appidxxxappsecretxxx絕大多數(shù)內(nèi)部系統(tǒng)應(yīng)選企業(yè)自建應(yīng)用。理由很實(shí)在ISV應(yīng)用需要企業(yè)認(rèn)證、ICP備案、應(yīng)用描述審核光上架就卡兩周。而我們只需登錄釘釘開發(fā)者后臺(tái) → 企業(yè)內(nèi)部開發(fā) → 創(chuàng)建H5微應(yīng)用 → 獲取AppKey/AppSecret全程自助。注意創(chuàng)建應(yīng)用時(shí)“應(yīng)用主頁”必須填寫一個(gè)真實(shí)可訪問的URL如https://oa.company.com/dingtalk/home否則后續(xù)H5跳轉(zhuǎn)會(huì)失敗。這個(gè)URL不需要實(shí)際頁面返回200即可但必須存在。3.2 待辦內(nèi)容構(gòu)造不只是填字段而是設(shè)計(jì)用戶行為路徑釘釘待辦API的task對(duì)象有7個(gè)必填字段但真正決定用戶體驗(yàn)的是其中3個(gè){ title: 采購合同審批編號(hào)CG-2024-08721, url: https://oa.company.com/approval?id123456tokenabc123, pcUrl: https://oa.company.com/approval?id123456tokenabc123, dueTime: 1725120000000, remindTime: 1725033600000, remindType: 1, ext: { bizType: purchase_approval, bizId: CG-2024-08721 } }url和pcUrl必須指向HTTPS地址釘釘強(qiáng)制校驗(yàn)SSL證書自簽名證書會(huì)報(bào)錯(cuò)。我們?cè)肏TTP調(diào)試結(jié)果返回errcode50006查文檔才發(fā)現(xiàn)是協(xié)議問題。dueTime是毫秒時(shí)間戳不是秒這是Java程序員最容易栽的坑。System.currentTimeMillis()直接可用但若用LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()務(wù)必確認(rèn)時(shí)區(qū)——釘釘服務(wù)器用UTC8本地開發(fā)機(jī)若設(shè)為UTC時(shí)間會(huì)偏差8小時(shí)。ext字段是業(yè)務(wù)靈魂它不顯示給用戶但決定了跳轉(zhuǎn)后的處理邏輯。我們約定bizType作為路由標(biāo)識(shí)如purchase_approval對(duì)應(yīng)采購審批控制器bizId作為單據(jù)主鍵。這樣H5頁面加載時(shí)直接GET /approval?bizIdCG-2024-08721就能查出完整數(shù)據(jù)無需二次查詢。3.3 跳轉(zhuǎn)鏈接安全如何防止URL被篡改或盜用url字段明文傳遞參數(shù)存在被惡意構(gòu)造的風(fēng)險(xiǎn)。比如攻擊者把bizId改成別人的訂單號(hào)就能越權(quán)查看。我們采用“雙重簽名”機(jī)制第一步服務(wù)端生成臨時(shí)Token// 使用HMAC-SHA256簽名 String payload bizId | userId | System.currentTimeMillis(); String token HmacUtils.hmacSha256Hex(appSecret, payload); // URL拼接https://oa.company.com/approval?bizIdCG-2024-08721tokenxxx第二步H5頁面校驗(yàn)Token// 前端只負(fù)責(zé)傳遞token后端校驗(yàn) GetMapping(/approval) public String approval(RequestParam String bizId, RequestParam String token) { // 重新計(jì)算簽名比對(duì)是否一致 String expectedToken generateToken(bizId, getCurrentUserId()); if (!expectedToken.equals(token)) { throw new SecurityException(非法請(qǐng)求); } return approval-page; }這個(gè)方案比JWT輕量比簡單MD5更安全加鹽防彩虹表且無需存儲(chǔ)Token。實(shí)測(cè)單次校驗(yàn)耗時(shí)3ms完全不影響用戶體驗(yàn)。4. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 環(huán)境準(zhǔn)備從零開始的5個(gè)關(guān)鍵步驟步驟1創(chuàng)建企業(yè)自建應(yīng)用登錄 釘釘開發(fā)者后臺(tái)進(jìn)入「企業(yè)內(nèi)部開發(fā)」→「應(yīng)用管理」→「創(chuàng)建應(yīng)用」應(yīng)用名稱填“OA待辦推送服務(wù)”應(yīng)用類型選“H5微應(yīng)用”保存后記錄下AppKey和AppSecret后面要用步驟2配置應(yīng)用權(quán)限在應(yīng)用詳情頁點(diǎn)擊「權(quán)限管理」→「添加權(quán)限」必選權(quán)限組織架構(gòu)-讀取員工信息用于校驗(yàn)userId、待辦任務(wù)-創(chuàng)建待辦核心權(quán)限注意權(quán)限需管理員掃碼授權(quán)不是勾選就生效步驟3獲取企業(yè)CorpId和永久授權(quán)碼進(jìn)入「應(yīng)用管理」→「應(yīng)用憑證」→「獲取CorpId」點(diǎn)擊「獲取永久授權(quán)碼」用企業(yè)管理員賬號(hào)掃碼得到permanent_code有效期永久用permanent_code調(diào)用https://oapi.dingtalk.com/sns/get_persistent_code?appidxxxpermanent_codexxx獲取access_token注意這是ISV的token企業(yè)自建應(yīng)用不用此流程步驟4Spring Boot項(xiàng)目初始化!-- pom.xml 添加依賴 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdorg.apache.kafka/groupId artifactIdkafka-clients/artifactId /dependency dependency groupIdcom.google.guava/groupId artifactIdguava/artifactId version32.1.2-jre/version /dependency步驟5配置文件application.ymldingtalk: app-key: xxxxxxxxxxxxxxxx app-secret: xxxxxxxxxxxxxxxx # 釘釘API基礎(chǔ)URL api-url: https://oapi.dingtalk.com # 消息隊(duì)列配置 kafka: bootstrap-servers: kafka-server:9092 topic: dingtalk-todo-event # Redis配置 spring: redis: host: redis-server port: 6379提示app-secret絕對(duì)不能硬編碼我們用Spring Cloud Config Vault管理密鑰開發(fā)環(huán)境用application-dev.yml明文生產(chǎn)環(huán)境從Vault拉取。4.2 核心代碼實(shí)現(xiàn)推送服務(wù)的完整骨架DingTalkTodoService.java主服務(wù)類Service public class DingTalkTodoService { Autowired private DingTalkTokenManager tokenManager; // token管理器 Autowired private RestTemplate restTemplate; Autowired private RedisTemplateString, Object redisTemplate; Value(${dingtalk.api-url}) private String apiUrl; /** * 創(chuàng)建待辦任務(wù)對(duì)外接口 */ public boolean createTodo(String userId, String title, String bizId, long dueTime) { // 1. 冪等校驗(yàn) String key dingtalk_todo: userId : bizId; Boolean exists redisTemplate.hasKey(key); if (Boolean.TRUE.equals(exists)) { log.warn(待辦已存在跳過推送 userId{}, bizId{}, userId, bizId); return true; } // 2. 構(gòu)造待辦對(duì)象 TodoRequest request buildTodoRequest(userId, title, bizId, dueTime); // 3. 獲取access_token String accessToken tokenManager.getAccessToken(); // 4. 調(diào)用釘釘API String url apiUrl /topapi/processinstance/create?access_token accessToken; ResponseEntityTodoResponse response restTemplate.postForEntity( url, request, TodoResponse.class); // 5. 處理響應(yīng) if (response.getStatusCode().is2xxSuccessful() response.getBody() ! null response.getBody().getErrcode() 0) { // 成功寫入Redis冪等鍵 redisTemplate.opsForValue().set(key, 1, Duration.ofHours(24)); return true; } else { log.error(釘釘待辦創(chuàng)建失敗userId{}, bizId{}, response{}, userId, bizId, response.getBody()); // 失敗則拋出異常由上游重試 throw new DingTalkApiException(創(chuàng)建待辦失敗 response.getBody().getErrmsg()); } } private TodoRequest buildTodoRequest(String userId, String title, String bizId, long dueTime) { TodoRequest request new TodoRequest(); request.setUserId(userId); request.setTitle(title); // 動(dòng)態(tài)生成帶簽名的跳轉(zhuǎn)URL String url https://oa.company.com/approval?bizId bizId token generateToken(bizId, userId); request.setUrl(url); request.setPcUrl(url); request.setDueTime(dueTime); request.setRemindTime(dueTime - 3600000); // 提前1小時(shí)提醒 request.setRemindType(1); // 1應(yīng)用內(nèi)提醒 TodoRequest.Task task new TodoRequest.Task(); task.setTitle(title); task.setUrl(url); task.setPcUrl(url); task.setDueTime(dueTime); task.setRemindTime(dueTime - 3600000); task.setRemindType(1); MapString, String ext new HashMap(); ext.put(bizType, purchase_approval); ext.put(bizId, bizId); task.setExt(ext); request.setTask(task); return request; } private String generateToken(String bizId, String userId) { String payload bizId | userId | System.currentTimeMillis(); return HmacUtils.hmacSha256Hex(your_app_secret, payload); } }DingTalkTokenManager.javatoken管理器Component public class DingTalkTokenManager { Autowired private RedisTemplateString, Object redisTemplate; Value(${dingtalk.app-key}) private String appKey; Value(${dingtalk.app-secret}) private String appSecret; Value(${dingtalk.api-url}) private String apiUrl; private static final String TOKEN_KEY dingtalk_access_token; /** * 獲取access_token自動(dòng)刷新 */ public String getAccessToken() { String token (String) redisTemplate.opsForValue().get(TOKEN_KEY); if (token null || isTokenExpired(token)) { token refreshAccessToken(); } return token; } private boolean isTokenExpired(String token) { // 解析token中的expires_in字段實(shí)際token是JSON字符串需解析 // 簡化版假設(shè)我們存的是{access_token:xxx,expires_in:7200,time:1725000000000} // 這里用Redis TTL判斷更可靠 Long ttl redisTemplate.getExpire(TOKEN_KEY, TimeUnit.SECONDS); return ttl null || ttl 300; // 剩余300秒時(shí)刷新 } private String refreshAccessToken() { String url apiUrl /gettoken?appkey appKey appsecret appSecret; try { ResponseEntityTokenResponse response restTemplate.getForEntity(url, TokenResponse.class); if (response.getStatusCode().is2xxSuccessful() response.getBody() ! null response.getBody().getErrcode() 0) { String newToken response.getBody().getAccessToken(); // 設(shè)置RedisTTL為7000秒2小時(shí)減200秒緩沖 redisTemplate.opsForValue().set(TOKEN_KEY, newToken, Duration.ofSeconds(7000)); return newToken; } } catch (Exception e) { log.error(刷新釘釘token失敗, e); } throw new RuntimeException(獲取釘釘token失敗); } }TodoRequest.java請(qǐng)求DTOData public class TodoRequest { private String userId; private String title; private String url; private String pcUrl; private Long dueTime; private Long remindTime; private Integer remindType; private Task task; Data public static class Task { private String title; private String url; private String pcUrl; private Long dueTime; private Long remindTime; private Integer remindType; private MapString, String ext; } }TokenResponse.javatoken響應(yīng)DTOData public class TokenResponse { private int errcode; private String errmsg; private String access_token; private long expires_in; // 單位秒 }TodoResponse.java待辦響應(yīng)DTOData public class TodoResponse { private int errcode; private String errmsg; private String processInstanceId; // 釘釘生成的流程實(shí)例ID }4.3 異常處理與重試機(jī)制讓推送真正可靠釘釘API不是100%可用網(wǎng)絡(luò)抖動(dòng)、限流、token過期都會(huì)導(dǎo)致失敗。我們?cè)O(shè)計(jì)了三級(jí)重試第一級(jí)本地內(nèi)存重試立即在createTodo()方法內(nèi)捕獲RestClientException后立即重試2次間隔100msfor (int i 0; i 3; i) { try { ResponseEntityTodoResponse response restTemplate.postForEntity(url, request, TodoResponse.class); if (success(response)) return true; } catch (RestClientException e) { if (i 2) throw e; // 最后一次失敗才拋出 Thread.sleep(100); } }第二級(jí)Kafka重試隊(duì)列異步若本地重試失敗將事件發(fā)到dingtalk-todo-retryTopic消費(fèi)者配置retry.backoff.ms600001分鐘重試最大重試次數(shù)3次。第三級(jí)人工干預(yù)隊(duì)列兜底三次重試仍失敗投遞到dingtalk-todo-failedTopic由告警服務(wù)監(jiān)聽發(fā)送企業(yè)微信告警“待辦推送失敗bizIdCG-2024-08721請(qǐng)人工處理”。運(yùn)維可登錄后臺(tái)用補(bǔ)償腳本重推。實(shí)操心得不要迷信“一次成功”。我們統(tǒng)計(jì)過線上環(huán)境約0.8%的推送會(huì)進(jìn)入重試隊(duì)列其中92%在第一次重試就成功。把重試邏輯寫死在代碼里比依賴外部調(diào)度更可控。5. 常見問題與排查技巧實(shí)錄5.1 典型錯(cuò)誤碼速查表與根因分析錯(cuò)誤碼錯(cuò)誤信息根因分析解決方案40001invalid credentialaccess_token失效或錯(cuò)誤檢查Redis中token值調(diào)用/gettoken接口驗(yàn)證40012app not existappkey或appsecret填寫錯(cuò)誤核對(duì)開發(fā)者后臺(tái)的AppKey/AppSecret注意大小寫40013invalid appkey應(yīng)用未啟用或未授權(quán)登錄釘釘管理后臺(tái)檢查應(yīng)用狀態(tài)和權(quán)限授權(quán)40014invalid access_tokentoken被回收或格式錯(cuò)誤清空Redis中dingtalk_access_token重啟服務(wù)40026user not existuserId不存在于當(dāng)前企業(yè)組織架構(gòu)調(diào)用/user/get接口驗(yàn)證userId檢查是否離職40032invalid urlurl非HTTPS或域名未備案用瀏覽器訪問url確認(rèn)能打開且證書有效40033invalid dueTimedueTime不是毫秒時(shí)間戳或已過期檢查Java代碼是否誤用System.currentTimeMillis()/1000特別注意40026錯(cuò)誤很多團(tuán)隊(duì)用數(shù)據(jù)庫里的員工工號(hào)當(dāng)userId但釘釘?shù)膗serId是ding_XXXXXXXXX格式的字符串。正確做法是在員工入職時(shí)調(diào)用釘釘/user/get_by_unionid接口用員工手機(jī)號(hào)或郵箱查出真實(shí)userId存入本地員工表。5.2 調(diào)試技巧如何快速定位推送失敗技巧1開啟釘釘API Debug日志在RestTemplate配置中加入攔截器Bean public RestTemplate restTemplate() { RestTemplate restTemplate new RestTemplate(); restTemplate.setInterceptors(Collections.singletonList(new LoggingInterceptor())); return restTemplate; } public class LoggingInterceptor implements ClientHttpRequestInterceptor { Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { log.info(DingTalk API Request: {} {}, request.getMethod(), request.getURI()); log.info(Request Headers: {}, request.getHeaders()); log.info(Request Body: {}, new String(body, StandardCharsets.UTF_8)); ClientHttpResponse response execution.execute(request, body); log.info(DingTalk API Response Status: {}, response.getStatusCode()); log.info(Response Body: {}, StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8)); return response; } }注意生產(chǎn)環(huán)境要關(guān)閉此日志避免泄露敏感信息。技巧2用Postman模擬調(diào)用把a(bǔ)ccess_token和待辦JSON體復(fù)制到Postman直接調(diào)用https://oapi.dingtalk.com/topapi/processinstance/create。如果Postman能成功說明代碼邏輯沒問題問題在Java環(huán)境如SSL證書、代理設(shè)置。技巧3檢查釘釘管理后臺(tái)的API調(diào)用量登錄釘釘開發(fā)者后臺(tái) → 應(yīng)用詳情 → 「API調(diào)用統(tǒng)計(jì)」查看processinstance/create接口的調(diào)用成功率。如果成功率驟降大概率是企業(yè)側(cè)配置變更如權(quán)限回收、應(yīng)用停用。5.3 性能優(yōu)化實(shí)戰(zhàn)從200ms到45ms的三次迭代第一次優(yōu)化連接池配置初始用默認(rèn)RestTemplate單次調(diào)用耗時(shí)200ms。改為Bean public RestTemplate restTemplate() { HttpClient httpClient HttpClientBuilder.create() .setMaxConnTotal(200) .setMaxConnPerRoute(100) .setConnectionTimeToLive(60, TimeUnit.SECONDS) .build(); return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient)); }耗時(shí)降至120ms。第二次優(yōu)化GZIP壓縮釘釘API響應(yīng)體較大含用戶頭像等開啟GZIPHttpClient httpClient HttpClientBuilder.create() .addInterceptorFirst(new HttpRequestInterceptor() { Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { request.addHeader(Accept-Encoding, gzip); } }) .build();耗時(shí)降至85ms。第三次優(yōu)化DNS緩存oapi.dingtalk.comDNS解析偶爾超時(shí)加本地緩存Bean public RestTemplate restTemplate() { // 自定義DNS解析器緩存300秒 DnsResolver dnsResolver new InetSocketAddressDnsResolver( Collections.singletonMap(oapi.dingtalk.com, InetAddress.getByName(118.31.11.11))); HttpClient httpClient HttpClientBuilder.create() .setDnsResolver(dnsResolver) .build(); return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient)); }最終穩(wěn)定在45±5ms。實(shí)操心得性能優(yōu)化不是堆參數(shù)而是找到瓶頸。我們用Arthas trace發(fā)現(xiàn)70%耗時(shí)在DNS解析和SSL握手針對(duì)性優(yōu)化后效果立竿見影。6. 監(jiān)控與可觀測(cè)性讓推送服務(wù)不再黑盒6.1 關(guān)鍵指標(biāo)埋點(diǎn)與告警閾值我們監(jiān)控4個(gè)黃金指標(biāo)指標(biāo)采集方式告警閾值業(yè)務(wù)含義dingtalk.todo.push.success.ratePrometheus Counter99.5%整體成功率低于此值說明API或網(wǎng)絡(luò)異常dingtalk.todo.push.latency.p95Micrometer Timer500ms95%請(qǐng)求耗時(shí)反映服務(wù)性能dingtalk.todo.retry.countKafka消費(fèi)組lag100重試隊(duì)列積壓預(yù)示下游處理瓶頸dingtalk.todo.token.refresh.failuresLog日志grep3次/小時(shí)token刷新失敗可能導(dǎo)致批量推送中斷告警規(guī)則用Prometheus Alertmanager配置- alert: DingTalkTodoPushFailureRateHigh expr: 100 * (1 - rate(dingtalk_todo_push_success_total[1h]) / rate(dingtalk_todo_push_total[1h])) 0.5 for: 5m labels: severity: critical annotations: summary: 釘釘待辦推送失敗率過高 description: 過去1小時(shí)失敗率{{ $value }}%請(qǐng)立即檢查 - alert: DingTalkTodoPushLatencyHigh expr: histogram_quantile(0.95, rate(dingtalk_todo_push_latency_seconds_bucket[1h])) 0.5 for: 10m labels: severity: warning annotations: summary: 釘釘待辦推送延遲過高 description: p95延遲{{ $value }}秒高于閾值0.5秒6.2 日志規(guī)范讓每一次失敗都有跡可循我們強(qiáng)制要求日志包含5個(gè)字段bizId業(yè)務(wù)單據(jù)ID如訂單號(hào)userId釘釘用戶IDtraceId全鏈路追蹤IDapiUrl調(diào)用的釘釘API地址responseCodeHTTP狀態(tài)碼日志樣例2024-08-20 14:22:31.234 ERROR [dingtalk-todo-service,,] 12345 --- [kafka-consumer-1] c.c.d.s.DingTalkTodoService : 釘釘待辦推送失敗 bizIdCG-2024-08721 userIdding_abc123456 traceIdabc123-apiUrlhttps://oapi.dingtalk.com/topapi/processinstance/create responseCode40026提示用Logback的MDCMapped Diagnostic Context注入這些字段比拼接字符串更高效、更易過濾。7. 擴(kuò)展與演進(jìn)從單點(diǎn)推送走向協(xié)同中樞7.1 待辦狀態(tài)同步讓釘釘和業(yè)務(wù)系統(tǒng)保持一致當(dāng)前方案只解決“推送”但用戶在釘釘里點(diǎn)擊“已完成”后業(yè)務(wù)系統(tǒng)并不知情。我們擴(kuò)展了雙向同步釘釘回調(diào)配置在開發(fā)者后臺(tái)開啟“待辦任務(wù)狀態(tài)變更”事件訂閱釘釘會(huì)POST到我們的/dingtalk/todo/status接口?;卣{(diào)驗(yàn)簽釘釘回調(diào)帶signature和timestamp用appsecret驗(yàn)證簽名防止偽造。狀態(tài)更新收到statuscompleted后調(diào)用業(yè)務(wù)系統(tǒng)API更新訂單狀態(tài)為“已審批”。這樣就形成了閉環(huán)業(yè)務(wù)系統(tǒng) → 推送待辦 → 用戶處理 → 釘釘回調(diào) → 業(yè)務(wù)系統(tǒng)更新。7.2 多端一致性待辦在釘釘、企微、飛書同時(shí)存在有客戶提出“能不能一份待辦同時(shí)推送到釘釘、企微、飛書” 我們抽象出TodoPublisher接口public interface TodoPublisher { boolean publish(String platform, String userId, Todo todo); } Component public class DingTalkTodoPublisher implements TodoPublisher { ... } Component public class WeComTodoPublisher implements TodoPublisher { ... } Component public class FeiShuTodoPublisher implements TodoPublisher { ... }業(yè)務(wù)層只調(diào)用todoPublisher.publish(dingtalk, userId, todo)具體實(shí)現(xiàn)由Spring根據(jù)platform自動(dòng)注入。這樣新增平臺(tái)只需加一個(gè)實(shí)現(xiàn)類零侵入現(xiàn)有代碼。最后分享一個(gè)小技巧釘釘待辦的title長度限制是128字符但用戶常填超長標(biāo)題。我們?cè)谕扑颓坝肧tringUtils.substring(title, 0, 125) ...截?cái)嗖⒃趀xt里存完整標(biāo)題。H5頁面加載時(shí)用完整標(biāo)題替換頁面標(biāo)題既滿足API限制又不丟失信息。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
蜜桃视频一区二区三区| 欧美色图20P| 骚日日av| 亚洲限制级| 色婷婷丁香| 国产精品日韩在线一区| 天天日夜干| 亚洲色图综合网| 亚洲天堂区| 日韩人妻中文视频| 搡老熟女免费视频| 91色人| 中文字幕二区日韩天堂| 夜夜草网站| 可能人人看人人摸| 天天干夜夜一操| 在线免费观看高清无码视频| 欧美激情性久久久久久| 国产精品久久久久久久久久久久| 日本大香蕉综合网红本杳社区| 校园春色宗合网| 在线观看十八禁| 国产成人www免费人成看片| 国产呦精品系列在线观看| 黄色AAAAA欧美| 高清孕妇孕交 交| Aa东京男人的天堂| 婷婷香网站| 中文字幕日产av人| 久久综合18p| 先锋精品av色鲁| 亚洲国产无码精品首页久久久| 日韩无码a片| 在线观看中文字幕| 翔田千里A片一区二区| 97在线视频免费看| 中文三一区| 久这精品中文在线观看视频| 黄片www视频免费| 亚洲 欧美综合| 60秒不遮不挡| 亚洲色图综合| 欧州一区二区三区四区| 日韩美女啪啪一区| 日本精品一区二区中文字幕| 91麻豆va国产精品| 激情丁香五月婷婷| 99久久com免费视频′| 免费看毛片操穴| www99热| 伊人97超碰| 免费夜夜爱黄色视频毛片| 精品国产肉丝袜在线拍国语| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 久久大香蕉97| 亚洲春色一区二区三区| 久久综合国产精品国产| xxx0国产在线播放| 超碰91在线| 中文字幕啊啊啊在线观看视频| 中文一区二区婷婷视频| jiujiujiujingpin| 综合熟妇一区二区三区| 操人妻视频| 91天天| 国产不卡免费在线视频| 五月色综合| 日韩精品高清资源在线| 日日日大屁股骚女人精品| 中字一区| 日本精品999| 最近2018中文字幕在线高清第一页| 久久成人国产精品| 97色婷| 淫色网综合| 97亚洲欧美日韩| 国产精品一区二区密臀| 一牛影视成人片免费| 日韩av影片在线观看| 色优久久| 学生妹天天看| 家庭乱伦麻豆| 婷婷丁香五月综合| 熟女久久久| 欧差乱伦二三| 久久婷婷伊人| 久久精品无码熟妇一区二区三区视频导航| 久久午夜色播影院免费高清| 国产成人自拍视频在线| 欧美综合亚洲| 超碰成人公开| 超碰在线人妻不卡| 麻豆天美91| 中文字幕亚韩| 操逼无码操逼| 看日韩美女二区三区免费操逼视频 | 欧美天天射| 无码区蜜乳| 鲁鲁色综合网| 久九九九九九九九热| 18禁网站在线播放| 美女97超碰| 亚洲欧美在线丝袜| www.婷婷| 啊v在线观看视频| 黄片免费看黄片免费看| 欧美999999| 欧美岛国精品在线观看| 婷婷久草一区二区三区| 亚洲资源一区| 色色激情五月天| 蜜臀va69| 国产伦精品一区二区三区在线观| 国产中文字幕在线| 国产精品久久久久综合| 综合网亚洲1| 天天操天天射天天日| 亚洲欧美九九九| 99久久精品国产系列| 午夜大香蕉| 吊色| 综合一区中亚洲国产成人综合精品| 欧美日韩青操| 久久精品亚洲成a人天堂| 欧美午夜视频| 男男H黄动漫啪啪无遮挡网站| 亚洲自拍欧美国产首页网曝 | 中文字幕一区二区三区字幕| 欧美亚洲第1页| 97国产精品一区| 九九热九九| 尤物黄色在线观看网站| 91久久国产综合精品| 国产综合在线视频网站| www.男人天堂| 亚洲国产麻豆一区二区三区| 久久久久国产精品人妻aⅴ天堂| 伊人五月天激情| 亚洲老司机123专区| 琪琪精品免费一区二区三区| 99热精品在线观看| 国产精品天美传媒| 51久久夜色精品国产麻豆| 九九热五区| 先锋激情∨在线视频播放| 97这里都是精品| 国产a片操逼| 亚洲男人的天堂网| 日欧操屄视频| 美国日韩黄片| 天天天做天天天爱天天天爽| 精品久久久无码| 亚洲日韩精品久久久久一区壹牛| 校园春色宗合网| 色官网在线| 97超碰欧美| 中文字幕超碰CAO| 精品人妻美妇91job| 欲香欲色综合天天伊人| 日韩AV一区二区三区三州三州| 精品国产一区二区三区四区在线看| 日韩操呦呦影院在线观看| 91麻豆va国产精品| 一区二区三区亚洲| 大香蕉丝袜一级片| 操逼日批| 偷拍盗拍亚洲色图图片| 自拍啪啪视频| 亚洲色图国产另类| 美女刺激久久国产欧美| 日本操BAV| 五月婷亚洲精品天堂| 蜜桃色院一区久久 | 国产二区三区粉嫩在线| 亚洲av总站| 国产福利av精彩对白| 日韩兔费看黄片| 国产一区二区三区,在线观看观看| 极品白嫩美女白浆成人福利在线看| 久久久96| 国产精品白领在线观看 | 婷婷AV一区二区三区| av网站免费看| 麻豆色99999| 成人久久无码www| 曰韩av中文字幕专区| 亚洲最新Av| 青青五月天| 九热超碰| 嗯嗯啊啊的视频| 诱惑人妻欧美一区在线播放| 97超碰碰碰| 自拍偷拍2025在线观看| 精品人妻av在线播放| 女性91网站| 久9爱精品| 国厂麻豆77q4| 97精品国产手机| 69人妻人人揉人人躁人人精品| 影音先锋乱| 污污汅18禁网站在线永久免费观看| 一区二区影视| 国产精品久久泡妞网站| 久久黄黄黄| 视频国产精品未满十八禁止在线观看| 青娱乐淫乱1314| 91免费看中出视频| 91精品国产91久久久久久久久久久久| 嫩草 我啊~嗯~在线| 免费人人搞97| 有码色中文字幕在线观看| 日韩性色b| caopeng97| 啊好大好舒服| 中文字幕91综合| 97超碰jingpin| 国产后入精品| 丝袜天堂| 色九九综合AV| 色天天野狼综合社区| 亚洲人码13| 伊人嫩草| 国产精选视频| 96久久久| 夜夜影视四色| 无遮挡h肉动漫在线观看| 成年人性爱日韩| 免费看欧美美女黄色大片| 强奸乱伦动态污图免费| 午夜大香蕉| 久久色人体 | 中欧人妻丝袜中文字幕| 国产丝袜欧美在线视频| 强奸乱伦大香蕉| 欧美性爱在线无码| 亚洲中文字幕97久久精品少妇| 精品久久99| 五月丁香啪啪啪| 女一区二区| 亚洲色香| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 国产一级作爱毛片| 99热这里| 啊啊啊啊啊啊啊在线| 大香蕉性欧美| 天天日天天操天天射河南省| 亚洲无码?第一页| 少妇淫妇久久久久久久| 黄色视频60分钟| 手机看av网站在线看| 久久熟女人| 91精品久久久久久久久久| 日韩精品午夜操呦呦不卡影院| 欧美v日韩v亚洲v最新在线| 国产极品精品美女视频| 熟妇熟女视频一区二区三区| 亚洲 欧美 小说| 天天性射网| 国产精品一二三区18| 综合欧美日韩在线观看| 精品无吗久久| 亚洲黄色AV电影| 又粗又长又爽在线观看| 97在线国产精品| 久久久久久裸体| 狠狠操,使劲操| 亚洲成?V人片在线观看福利| 精品小视频在线| 精品少妇一区二区| 岛国艾薇凹凸视频天堂| 东北操逼| 欧美日韩操逼嗦吊| 超碰到97情色| 久久五十路熟女人妻| 翘臀vidoes| 色偷偷男人的天堂麻豆| 91看黄片| 黄色乱论网站| 久久久不卡| 色99视频| 色综九九九一区| 日韩不卡在线一区二区| 天天看特黄的免费网站| 久久精品久久久久久久久| 欧美亚洲清纯| 色婷婷九月天天综合| 校园春色中文字幕AV| 放黄片放3级黄片没穿衣服| 九九AV| 久久久久久久综合,国产| 欧美日韩国产另类综合| 天天大干大香蕉| 99久久婷婷丁香| 九九九精品一区二区无码| 无码一区二区精品视频久久久春药| 天天色香欲综合网| 日韩兔费看黄片| 天天日少妇逼AV| 欧成人精品一区二区三区| 久久美女福利是上海美女| 欧美在线综合| 亚洲国产无码精品首页久久久| 夜夜嗨一区二区三区三州加勒比| 91丨九色丨43老版熟女| 欧美性夜| 亚洲第一页欧美| 天天看天天日天天操| av天堂影视中文在字幕在线中文| 2020中文字幕在线观看| 热久久精品| 国产高清自拍视频| 91综合国产精品| 国产亚洲中文不卡二区| 91麻豆天美国产欧美高潮| 日韩性爱播放| 神马午夜久久| 亚洲综合影片| 免费精品福利在线观看| 1000部熟女视频在线观看| 亚洲成人美女无吗| 国产精品白丝| 九九热视频这里只有精品| 超碰在线欧美性爱激情| 欧美与日韩97| 看一级特黄a大一片| 操九九九九九九| 91中文字幕在线观看| 亚洲无码国产精品久久| 超碰在线成人| 香蕉综合网| 91人妻少妇| 国产中文福利| 激情综合五月| 日韩精品色呦呦| 国模久久在线| 小草三级久久观看| 操逼不卡中文字幕| 91精品网站| 老熟女熟妇| 人人透人人操| 亚洲欧美一区二区网址| 欧洲亚洲天堂精品 | 欧美国产精品久久九九| 国产亚洲日本| 欧美另类自拍 | 五月天婷婷色| 人人看欧美性爱| 60秒不遮不挡| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 开心五月婷婷激情| 性爱Av免费| 久久粉色| 男人天堂久久精品不卡| 性色中出| 青青操97| 婷婷五月天社区| 日本东京热加勒比久久| 男人天堂网站| 岛国天天午夜影院传媒网| 在线视频一区二区传媒| 91狠| 成人丁香五月| 黄片无码在线制服| 秋霞蝌科网日本一区| 18禁止看精品中文字幕| 四虎影视精品| 精品丰满熟妇人妻一区| 嗯嗯啊啊的视频| 天天爽夜夜欢视| 免费夜夜爱黄色视频毛片| 欧美精品久久久久久久久88| 一区二区三区亚洲| 欧美日韩另类在线| 自拍偷拍 日韩欧美| 91亚洲欧洲| 东京热,男人的天堂| 97免费视频在线观看视频| 日欧美色| 国产精品久久久久绯色| 97资源超碰| 加勒比大香蕉视频在线| 狠狠综合| 中日无幕一二三四区| 天天日天天爽| 91ise欧美| 91精品国产综合久久久蜜臀| 中文字幕精品丝袜| AV色天香在线| 中文字幕55555| 无码99| 78综合网| 国产黄色动态精品| 无码人妻精品一区二区三区九九| 国产丝袜美腿美女麻豆| 成人热久久精品| 国产福利夜| 国产AV人人 夜夜人人澡| 青女在线| 亚洲天天精品| 大茄子熟女AV导航| 97精品视频| 最新日本中文字幕| 以及麻豆国产入口在线观看免费| 人妻干天天| 中文字幕亚洲热播人妻| 操屄不卡视频| 青草视频在线看看看看看看看看看| 成人婷婷丁香| 好爽,再快点啊哈嗯嗯嗯嗯| 九九九九九九亚洲| 另类 综合 日韩 欧美 亚洲| 欧美在线色| 大香蕉2017| 人人妻人人爱人人玩| 一级做a爰片性色毛片久久| 天天操天天射天天日| 国产亚洲禁久一区二区 | 亚洲欧美天| 东北熟女91| 性爱网站一区二区| 操逼逼无码| 久久人妻视频网| 第四色亚洲色图| 97超碰色中文字幕| 秋霞怕怕片| 日本操嫩b网| 五月丁香在线| 午夜福利在线合集| 亚洲精品久久久久毛片A片拉屎| 四虎国产精品永久入口| 精品久久久亚洲AV成人网站| 日韩熟女精品无码专区一区二区| 五月天亚洲网| 激情五月天中文字幕色| 自拍鲍鱼一区在线高清观看免费| 熟妇视频一区二区三区在线观看| 国产精品夜夜夜| 国产精品白领在线观看 | 老司机午夜精品福利视频一区二区 | 91bbb| 操逼国产免费| 九九久久久久久爱| 精品999一区二区| 日韩国产欧美伦理在线| 亚洲少妇色| 天天操天天7| 91看黄片| 91亚洲不卡一区| 久久久天堂| 国产av强奸美女| 天美国产三级传媒| 人妻熟妇一区二区三区| 亚洲 欧美日韩 另类| 蜜臀99999| 风月影院十八禁| 熟女乱伦二区| 91天天爽| 国产亚洲色婷婷久久99精品91葵花宝典| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 中文字幕第二页| 一类av片在线看| 久久亚洲天天做| 玖草在线视频| 欧美 亚洲 制服 精品| 啊啊啊操死我了| 人、人、摸,人、人、草| 欧美暴力猛交| 日本免费人成视频播放120秒| 99re6久热只有精品6在线直播 | 在线不欧美| 久久丁香五月婷婷| 欧美最婬乱婬爆婬牲视频| 日本506070| 人妻少妇精品一区二区三区| 天天影视91看看| 日本一级性爱| 久9爱精品| 人人干人人搞人人摸| 超碰97最新人妻| 欧美一区二区三区互相| 嗯嗯嗯不要不要免费视频| 精品人妻一区二区三区四区| 亚洲精品久久久久久久蜜桃臀| 男人的天堂在线| 欧美经典一区二区三区| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 99热97| 久草午夜| 日韩一级二级在线| 午夜激情成人在线观看| 欧美久久婷婷| 日操粉逼逼| 大干人妻| 色五月婷婷麻豆在| 国产精品com| 免费人人搞97| 国产成人亚洲精品无码古代早漏男| 久久国99999| 乱伦av麻豆| 亚洲日本大香蕉1| 六月丁香婷| 99人妻| 亚洲精品欧洲精品| 国产四虎在线| 香蕉黄色一级视频| 国产黑白丝在线| 欧亚综合一卡二卡中文字幕| 三级日韩一区二区三区| 97jingpin| 色婷婷六月| 亚洲国产一级黄色视频| 超碰无码五月97| 97婷婷色| 囯戸精品高潮呻吟旡码| 精品无码一区二区三区| 超碰97爽| 操高情无码| 91色插| 91真人天天在线| 激情九月婷婷| 啪啪视频亚洲第一| 亚洲91色| 日韩成人人妻网站| 国产美女激情| 高凊专区人人操| 色综合网1| 翔田千里Av在线| 草草草视频| 久久骚| 五月婷婷hd| 性爱视频久久| 久久久久久久久成人av解说| 男人女人18禁片免费看网站| 欧美热图99| 超碰69| 久操 高清| 中文字幕一区av| 超碰人人超在线观看| 国产亚洲精品激情| 我要去看2个日本美女.com曹逼| 新91视频.cmp| 激情文学小说一区二区| 九九热精彩视频| 爱干爱射网啊啊啊| 另类综合另类| 96精品在线| 色噜噜狠狠色综合日日| 无套内射性感少妇视频| 日韩人成网站在线播放| 操操操日本的逼| ji熟女.com| 久久久久亚洲三级电影| 日韩精品在线放| 男人的天堂 在线一区| 亚洲欧美清纯| 精品久久久久久久| 超碰97久久| 亚洲精品97| 国产精品久久久久久久久久久久| 亚州男人天堂| 中文字幕三四区| 欧美少妇色图| 欧美日韩在线视频网站| 国产精品久久aV| 伊人黄色片| 午夜视频好爽啊| 亚洲一级性爱视频免费看| 亚洲 日本 国产 综合| 日本成人免费一区二区三区 | 日韩三四五区| 伊人综合色网| 九九拍拍精品视频在线播放| 乱欲性色| 久久精品女同亚洲女同13| 9997se| 中文字幕免费在线观看| 日韩综合97p| 九九九免费视频| 激情小说图片亚洲首页| 成人精品一区二区91毛片不卡| 福利社区午夜一区二区| 能直接看AV的网站| 日日夜夜狠狠| 手机不卡视频不卡在线一二三区 | 欧美裸体美女日麻屄| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 久久精品老司| 美女网站黄页| 少妇熟女一区二区三区| 国产1024在线播放| 日本高清_区二区三区| 日韩成人网址| 性生活久久久久久久久久| 97自拍一区| av2014 日韩在线中文字幕| 中文 人妻 制服| 一级@啪啪视频| 激情专区综合| 第45页一区二区| 日本免费二区三区| 黑人美精品 A片| 婷婷综合五月天| 秋霞男人网| 941超碰| 久久精品国产亚洲AV先锋| 亚洲日韩美国人妻| 9/A片 | 亚洲精品中文字幕一区在线视频| 长长久久88视频| 亚洲一二三| 亚洲国产97| 欧美人妻精品一区二区| 天天射网| 亚洲成成熟女人综合一区二区| 豆花视频操逼网址| 亚洲色色色| 五月天欧美色图| 日韩精品资源专区二区| 久久激情综合| 青青操视频在线| 狠狠操,使劲操| 99精品网| 熟女91网| 国产理论视频在线播放| 丝袜性亚洲| 麻豆成人影音在线| www.色婷婷色综合| 超碰无码五月97| 三级精品三级在线观看| 东京热激情视频一二三区| 精品女同一区| 人摸人人操人| 97超碰总站| 国产精品区在线12p| 国产又黄又猛又粗又爽的网站| 蜜臀网址在线| 超碰成人国产| 97日韩欧美亚洲| 久久精品国产亚洲AV无码电影| 日逼五月天| 日本国产亚洲一区在线观看| 人人澡人人爽人人精品| 青青色在线观看| 色性综合| 91欧美在线| 老女人爆菊| 91内射| 国产视频一区二区在线观看| 91亚州| 神马视频久久久久久| 亚洲色图欧美激情| 人妻日日夜夜精品| 日韩欧美福利视频看看| 成人综合网 欧美| 永久免费av无码网站国产app | 无码高清操逼网址| 久久久∴| 欧美性爱一级操| 人人妻人人色一区二区三区| 婷婷综合网站| 色吧91| 91色综合激情| 日本黄色大片一级视频免费麻豆| 丰满精品人妻少妇久久字幕| 亚洲 自拍偷拍 欧美| 日本好吊色视频| 日韩人妻一区二区精品| 99少妇| 青青国产精品在线| 日韩精品一区二区高清| 97操在线| 亚洲午夜AV| 色汉综合| 亚洲黄色网址| 99热啪啪| 国产亚洲深夜激情| 无码九九| 不卡超碰护士AV在线免费播放| 你懂的在线观看区国产| 色眯眯av| 日韩人体偷拍| 国产操伦| 97这里有精品| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 丁香五月天视频| 成人五月天丁香激情综合| 免费网色网站| 色综合久| 手机看片日韩人妻| 色亚洲欧美| 欧美视频第二页| 国产成人久久久精品免费AV| 东北少妇高潮zzzz| 久久久熟女一区| 日韩伦理视频| 静品嫩模一区二区| 日韩99精品视频综合区| 欧美激情精品久久久久久| 玖玖蜜臀资源网| 欧美日综合| 国产91啪| 欧州一区二区三区四区| 久久蜜桃一区二区| 大乔未久88一区| 狼天天狼天天大香蕉| 黄色欧美性爱视频| 91啦人妻| 一本色道综合久久欧美日韩精品| 小草av不卡亚洲二区| 嗯嗯嗯嗯啊啊啊好紧好大| 亚洲av影院在线观看| 欧美成年人性爱视频免费观看| 9久9久9久9久视频网站| 亚热日本熟女| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 久久AV无码网址| 国产乱伦性爱区| 91香蕉国产尤物视频| 色噜噜日韩精品| 久久动漫精品视频这里只有精品| 国产欧美一区二区| 99在线免费观看| 日韩av在线播放不卡| 91丨豆花丨熟女| 乱性AV| 亚洲不卡三级手机播放| 婷婷激情四射| 99999久久精| 四虎精品永久在线观看| 中文无线日韩一区| 久热大香蕉网站| 久操在97| 久久伦理视频久久大香蕉视频| 一区,二区,三区网站| 久久这里都是精品| 96久久科窝| 精品超碰中文在线| 久久精品国产精品亚洲艾通辽熟妇 | 伊人精品久久网站| 亚洲av无码国产精品字幕| 2019天天干| 丝袜美腿亚洲| 青青操网| 国产一区在线观看无码AV| 色操逼网| 免费观看的黄色的网站| 插日本熟女视频| 国产呦精品一区二区三区下载| 国产日韩在线播放| 丁香色五月 97干| 99热这里只有精品99| 丁香六月婷| 成人五月香网在线| 天天操天天射青青草| 美腿色图| 人人搡人人肉久久精品| 日韩淫色网| 日韩成人人妻网站| 99re视频这里只有精品| 欧美成人性活片| 亚洲国产成人精品999| 国产精品亚洲天堂网址| 艹少妇网站| 免费黄色片子| 久久这里都是精品| 美欧老女人97| 人人爽夜夜玩视频| 国产精品夜夜| 国产亚洲深夜激情| 92午夜免费福利视频| 婷婷综合五月天| 大香蕉99热| 欧美第五页| J?P?NESEHD熟女熟妇伦| 日本欧美一区二区三区免费| 婷婷久久五月| 综合激情97 | 久久久久久网址| 黄页视频网站野外| 成人 日韩欧美一区| 天堂精品小草| 97久久超碰日韩精品| 无码久久亚洲高清,| 秋霞影音一区二区三区| 91蜜臀熟女| 伊人精品国产| av激情亚洲五月天| 天天躁日日躁XXXXYY| 国产青一二三| 蜜桃网熟妇| 黄色操人| 草草影院在线视频| 日本最新1区2区3区| 欧美天天综合网| 亚洲国产成人精品无码专区| 丝袜制服字幕在线| 韩国三级理论在线| 99黄页网站| 五月婷婷激情网| 欧亚不卡| 友优传媒精品在线一区二区| 1级午夜影院费免区| 狠狠干狠狠色| 热的中文 热的有码 热的国产| 嗯嗯啊啊好爽| 久操热| 青青草色插素人| 欧美亚洲小说| 婷婷久久综合久| 97超碰超欧美。| 国产精品分类在线观看| 骚逼高潮久久精品| 1204人成网站色www| 中文字幕一区二区三区字幕| 欧美日韩高潮喷水91| 九九九九九九免费视频| 777琪琪午夜免费A片| 久久这里都是精品| 欧美日韩亚洲天堂| 乱色视频中文字幕| 亚洲综合色在线| 亚洲第一狼人丝袜美女另类| 丝袜性亚洲| 无码一区免费在线不卡| 欧美图片偷拍| 天天做天天爱| 国内91熟女人妻丝袜天天精品视频在线| 中文熟女五十乱码在线| 色色色色日本| 日韩av色图| 天天激情综合站| 99综合自拍| 中文字幕日韩精品久久| 另类av天堂| CCYY草草影院地址入口| 久久不卡一区二区| 操屄日韩| 97天天做| 中文色综合| 国产精品久久久999| 亚洲欧美日韩免费电影| 91黑丝美女| 国产Aα| www. 男人天堂成人在线| 黄片色区软件| 91精品婷婷国产综合久久| 91精品啪在线观看国产城中村| 超碰久久精品| 国产精品久久伊人| 亚洲同性aV综合| 99热免费| 成人羞羞视频国产| 抽插爽| 亚洲 一区二区 自拍| 91国产丝袜美女| 欧美人人AAA| 日韩91网站| 99久久无色码| 手机在线A片| 熟妇女伦乱视频视频| 99热精品在线| av网站免费看| 干B| 亚洲欧美激情在线视频| 亚洲久久久| 欧洲亚洲人妻无码中字久久三区四区 | 国产91福利小视频在线观看| 无码视频一区二区| 国产亚洲色婷婷久久99精品91葵花宝典| 妇女乱色二区| 国产不卡片| 美女极品一区二区三区| 97欧美资源| 黄色二级片网站| 亚洲 日韩 丝袜 熟女 变态| 国产又粗又长又大的视频| 国产超碰国产97| 国产熟女完整版中字| 91白虎| 91天美传媒精品| 日本高清一区二区在线| 国产精品日日摸夜夜添骚逼| 无码久| 加勒比大香蕉视频在线| 久久精品福利影院| 999热日韩精品| 九X超碰| www超碰| 国产精品区在线12p| 午夜福利 成人 91| 成人综合网 欧美| 色婷婷网| 久久五十路熟女人妻| 96久久久久久久| 亚洲欲| 亚洲国产剧情少妇激情| 精品一区二区亚洲国产| 一本色道综合久久欧美| 国内毛片四区| 99re99视频在线免费观看| 日韩高潮一区| 久久99午夜精品一区人妻| 婷婷久久五月综合激情| 国产白丝网站| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 五月天婷精品激情| 欧美中文字幕日韩在线| 国产suv一区二区三区6| 久久精品人妻一区二区| 亚洲日韩av一区二区三区百合| 美国日韩黄色片| 国产亚洲欧美每日在线| 凹凸精品熟女在线观看| 伊人网在线点播| 日本孕妇孕交| 亚洲少妇色图自慰直播| 久久久艹艹艹| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 亚洲欧洲无码bt精品合集| 久久久久久999| 综合情欲网| 中文一区在线日| 少妇三P| 久久99手机免费视频| 九九无码久久精品视频| 91国产精品在线看| 91九色网| 另类小说五月天| 五月婷婷基地| 亚洲色啪| 久操婷婷| 亚洲婷婷五月天| 丁香五月电影| 欧美在线视频99| 9+1视频网址| 五月婷色| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 性爱AV天堂| 91久久堂| 97操在线| 97国产伦理| 99精品丰满人妻无码| 国产风韵犹存熟妇三区| 精品9999| 久久久啊啊啊| 91 丝袜在线播放| 精品久| 亚洲伊人久久综合97| 久久精品国产精品一区| 精品国产Av无码久久久亚洲| 日韩欧洲操屄视频| 久久久久久日韩| 欧美强奸乱能| 丰满人妻一区二区三区大胸懂色| 狠狠激情综合狠狠操中文字幕| 7777欧美成是人在线观看| 干婷婷综合网| 91黑丝在线播放| 免费看污网站| 精品人妻一区二区三区视频| 日韩中文9| 欧美性色欧美| A级片一区| 青青伊人这里只有精品| 亚洲偷拍自拍在线视频| 国产精品色| 99re这里只有精品3| 自拍视频大全亚洲专媒视频/一区二区三区 | 国产亚洲综合欧美一区| 色综合久| 欧美狠狠操| 国产精品午夜精品| 亚洲图片第一页| 第四色奇米影视777| 伊人久操| 精精夜夜| 日本三级韩国三级美三级91| 精品亚洲天堂| 日韩无码a片| 丁香五月影院| 77国产精品| 欧美性暴力猛交| 国产一区二区三区免费视频在性观看| 欧美精品久久久久久久久88| 亚洲夜色在线| 四虎在线免费视频| 91操熟女| 在线强奷到舒服的无码视频 | 人人性爱视频免费| 探花一区在线| 中文字幕片| 欧美日韩制服| 午夜视频好爽啊| 欧美后进式| 亚洲涩图欧美| 国产一区二区免费福利片| 99自拍视频| 劲爆欧美人妖三区91| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 人妻 中文 日韩| 日韩精品高清资源在线| 国产精品伦理| 久久精品国产亚洲AV高级北京| 人妻碰碰碰碰碰碰| 风间由美日韩欧美久久| 欧美国产精品| 乱日视频| 啊啊啊啊操死我| 日本在线不卡一二区| 超碰97久久观看| 综合伊人网12色| 亚码激情| 日本媚薬中文字幕在线| 激情久久久| 国产乱子伦一区二区三区免看| 国产午夜精品理论片一二三区区| 97色在线| 精品熟妇视频一区二区| 日本精品88888888| 久操国产在线| 丁香五月性| 婷婷九月丁香| 青娱乐久久艹| 无毛精品| 久久精品店| 欧美在线色| 韩国黄片aaaa| 色天欧美| 欧美熟女操屄| 欧美日韩97在线| 国产黄色 A 片免费看| 久久久111| 欧美日本中字另类在线| 亚热日本熟女| 97人妻免费中文字幕| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 天天爽天天爽| 91麻豆天美传媒在线| 丁香激情五月天| 搡老女人老91二区| 蜜臀少妇一区二区| 97av在线观看| 色妹子A V| 日本成熟少妇A∨网站| 国产夜夜操| 久久首页| 锕锕好爽 死我在线观看| 亚洲国产成人精品无码专区| 五月天亚洲网| 五月色网| 97超碰超碰| 91麻豆天美传媒HD| 欧美国产欧美在线观看| 98福利在线视频| 一级免费啪啪片| 国产熟女无套内射| 99精品丰满人妻无| 韩国手机不卡无码三级视频| 97欧美日韩中文| 日本人人操人人操| 精品久久97| 精品福利视频| 欧美丰满少妇xx高潮| 黄站在线免费观看| AV中文在线可看| 国产精品4p在线观看| 久久噜| 欧美亚洲日韩人妻在线观看| 中文字幕在线免费观看2| 国产二区三区粉嫩在线| 在线国产一区二区av| 99热这里只有精品18| 亚洲欧美综合色| 国产色精品午夜大片| 91天堂| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 色综合久| 91w欧美| 人人搡人人肉久久精品| 欧美成va视频网站| 永久电影三级在线观看| 蜜桃精品一区二区三区久在线| 三级三级三级日本99| 大香蕉www.超碰| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 色综合色色| 国产一区二区三区白丝| 91天天爽| 日本成a人v网站在线观看| 亚洲情色在线| 男人天堂2012| 乱欲一区二区| 明星性猛交ⅹxxx乱大交| 日韩人妻丝袜美腿中文| 欧美极品女人的天堂| 97欧美性爱| 人人么人人操| 91久久国产精品| 北京美女一区二区| 久7色| 日本三级R| 日韩99精品视频综合区| 青草一区二区| 校园春色家庭伦理欧美激情| 天天干2区3区| 桃花色涩综合影院| 国产欧美精选激情视频| 久艹日日日| 后入精品| x97av| 日日A∨| 欧美三级一级| 日日干日日| 黄片不用下载在线观看| 性爱Av免费| 91精品无码久久久久久久| 美女好片色日本| 国产精品第一页国产大屁股视频免费区i| 超碰公开久久网| 亚洲综合五月天| 人人操人人狠狠操| 国产极品99热在线播放69| 亚洲中文字幕熟女| 色色九区| 欧日韩一二三f区| 操老熟女AV| 超碰久久精品| 久久久专区| 久久久久密臀一区二区| 91丝袜美女| 九九热免费国产视频婷婷伊人 | 骚货操死你| 久久久九九| 一区超碰一区| 久久影视二区三区行押| 亚州日韩97| 亚洲男人天堂2016| 成人A片男人的天堂| 欧美亚洲影视| 一区中文字幕二区日韩| 精品国产嫩穴视频| 少妇无码太爽| 日韩欧美麻豆大片| 无码99| 日韩欧亚太美不卡| 后入人妻一区| 一级黄碟在线观看| 人妻一区久久二区三区色播| 爱欲AV| 久久綜合很很很| 久久久99999久网站| 亚洲熟女乱色一区二区三区久久久| 制服中出中文人人精品| 中文字幕视频免费| 国产日韩区| 成人精品一区二区三区| 高清肉丝中文无码| 激情五月天校园春色网| www.男人天堂| 亚洲色棕合|