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

ARTICLE DETAIL

資訊詳情

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

Java 生成微信小程序二維碼:5 種 HTTP 調(diào)用方式與避坑指南

Java 生成微信小程序二維碼:5 種 HTTP 調(diào)用方式與避坑指南 簡(jiǎn)介面向Java后端開發(fā)者的小程序二維碼生成示例工程基于微信官方服務(wù)端能力實(shí)現(xiàn)覆蓋裂變分享、渠道推廣等常見營(yíng)銷場(chǎng)景。針對(duì)每個(gè)賬號(hào)生成專屬邀請(qǐng)二維碼的訴求系統(tǒng)梳理了5種實(shí)現(xiàn)方式并設(shè)計(jì)前端-后端API-微信API的安全調(diào)用鏈路規(guī)避secret與token泄露風(fēng)險(xiǎn)核心使用永久有效、無(wú)數(shù)量限制的getUnlimitedQRCode接口。資源包共69個(gè)文件壓縮后約53KB按Maven標(biāo)準(zhǔn)拆分主代碼、測(cè)試與資源配置包括java源碼、xml配置、properties參數(shù)文件及少量jar依賴可直接導(dǎo)入IDE運(yùn)行驗(yàn)證。已有2647人學(xué)習(xí)下載整體目錄結(jié)構(gòu)清晰便于對(duì)照不同實(shí)現(xiàn)方式在參數(shù)構(gòu)造、異常處理、返回碼校驗(yàn)上的差異理解各方案的適用邊界源碼中保留了完整應(yīng)用配置與接口調(diào)用骨架替換appid等參數(shù)即可快速集成到實(shí)際裂變活動(dòng)中對(duì)中小團(tuán)隊(duì)及個(gè)人開發(fā)者均很友好能有效降低二次開發(fā)與聯(lián)調(diào)成本。1. 生成微信小程序二維碼本質(zhì)上是一次帶 access_token 的 HTTP 請(qǐng)求做 Java 后端久了你會(huì)發(fā)現(xiàn)“生成微信小程序二維碼”這件事說(shuō)穿了就是一次帶 access_token 的 HTTP 請(qǐng)求。運(yùn)營(yíng)要的是每個(gè)用戶一張專屬碼微信官方不會(huì)提供可視化按鈕能靠的只有那幾個(gè)接口和一把 HTTP 客戶端。很多人第一反應(yīng)是找封裝好的 SDK但 SDK 封裝一多token 過(guò)期、接口報(bào)錯(cuò)反而更難排查。這篇筆記不綁定具體業(yè)務(wù)框架從 JDK 原生 HttpURLConnection 到常見的 HttpClient、OkHttp、RestTemplate、Hutool整理 5 種可落地的實(shí)現(xiàn)方式把接口選型、參數(shù)設(shè)置和踩過(guò)的坑一起說(shuō)清楚。后面涉及的代碼都保持同一個(gè)方法簽名方便你直接抄進(jìn)自己的 Service 里。2. 微信小程序二維碼接口與 AccessToken先選對(duì)接口再動(dòng)手2.1 三個(gè)官方接口的差異getwxacodeunlimit 才是主力微信官方一共給了三個(gè)生成二維碼/小程序碼的接口名字接近但限制天差地別。我見過(guò)不少新人把三個(gè)接口混著用照著 createwxaqrcode 寫了一版上線第一天就撞數(shù)量限制。所以動(dòng)手寫代碼前務(wù)必先確認(rèn)你用的是哪個(gè)接口。第一個(gè)是 getwxacodeunlimit全稱“獲取不限制數(shù)量的小程序碼”。它支持通過(guò) scene 傳入自定義參數(shù)生成數(shù)量不限制是做帶參數(shù)推廣的首選。page 參數(shù)可以指向已發(fā)布的小程序頁(yè)面也能配合 env_version 參數(shù)在開發(fā)版、體驗(yàn)版里調(diào)試。缺點(diǎn)是 scene 有長(zhǎng)度和字符限制最長(zhǎng) 32 個(gè)可見字符只支持?jǐn)?shù)字、大小寫英文和!#$()*,/:;?-._~這些特殊字符中文、空格、換行都不行。這個(gè)限制會(huì)在后面避坑部分重點(diǎn)展開。第二個(gè)是 getwxacode獲取小程序碼但不支持 scene 參數(shù)直接用 page 作為路徑。它生成的也是方形帶 logo 的小程序碼數(shù)量有限制適合某些固定頁(yè)面的低頻場(chǎng)景。第三個(gè)是 createwxaqrcode獲取小程序二維碼返回的是傳統(tǒng)二維碼樣式掃碼后跳轉(zhuǎn)指定頁(yè)面同樣有限制。這里還有一個(gè)小誤區(qū)用戶嘴上說(shuō)“要二維碼”實(shí)際要的往往是掃完能直接打開小程序的碼。getwxacodeunlimit 返回的是小程序碼為了讓用戶識(shí)別建議在需求階段就確認(rèn)清楚。選型上我的習(xí)慣是只要業(yè)務(wù)里需要按用戶或按活動(dòng)生成不同參數(shù)就統(tǒng)一用 getwxacodeunlimit。它雖然沒(méi)有傳統(tǒng)二維碼樣式但把參數(shù)放 scene后端拿到場(chǎng)景值自己解析是擴(kuò)展性和穩(wěn)定性最好的組合。下面是三接口對(duì)比建議直接收藏接口是否支持 scene數(shù)量限制返回樣式推薦場(chǎng)景getwxacodeunlimit支持不限小程序碼帶參推廣、按用戶生成getwxacode不支持有限小程序碼固定頁(yè)面、低頻createwxaqrcode不支持有限傳統(tǒng)二維碼需要舊版樣式接口調(diào)用頻率也得留意。getwxacode 和 createwxaqrcode 有累計(jì)數(shù)量限制而 getwxacodeunlimit 雖然不限總量但接口本身的 QPS 仍受官方限制不建議在循環(huán)里批量生成幾百?gòu)?。如果業(yè)務(wù)要預(yù)生成大量碼需要分批執(zhí)行控制每秒最多幾次請(qǐng)求。2.2 先用 curl 走通鏈路再寫 Java 封裝在寫 Java 代碼之前強(qiáng)烈建議先用 curl 把鏈路跑通。這樣能排掉大部分網(wǎng)絡(luò)和參數(shù)問(wèn)題也能對(duì)返回結(jié)果有一個(gè)直觀認(rèn)識(shí)。第一步是獲取 access_token微信接口文檔要求使用你的小程序 appid 和 secretGET 請(qǐng)求就行curl -s https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credentialappidAPPIDsecretAPPSECRET返回 JSON 包含 access_token 與 expires_inexpires_in 固定 7200 秒。這里有個(gè)容易忽略的點(diǎn)access_token 是 appid 維度的全局唯一值頻繁獲取會(huì)互相擠掉而且舊 token 失效前新 token 并不會(huì)立刻生效所以生產(chǎn)環(huán)境必須做緩存。后面第 5 章會(huì)專門講。拿到 access_token 后再調(diào)生成接口這一步就是 POST JSONscene、page、width 是必填參數(shù)curl -s https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_tokenTOKEN \ -H Content-Type: application/json; charsetutf-8 \ -d {scene:uid_1001,page:pages/index/index,width:430} \ -o wxacode.png如果生成的 wxacode.png 能正常打開說(shuō)明參數(shù)鏈路沒(méi)問(wèn)題接下來(lái)?yè)Q成 Java 只是換了 HTTP 客戶端。這里要強(qiáng)調(diào)微信接口雖然文檔里叫 HTTP 請(qǐng)求實(shí)際全部走 HTTPSJava 的 HTTP 請(qǐng)求庫(kù)會(huì)幫我們處理 SSL 握手不需要自己寫證書邏輯。curl 跑通之后建議再用file wxacode.png看一眼文件類型確認(rèn)是 PNG 圖片。如果返回的是 JSON大概率是參數(shù)錯(cuò)誤或者 token 失效。常見錯(cuò)誤碼可以先記住40001 表示 access_token 無(wú)效41030 表示 page 路徑無(wú)效41031 表示 scene 無(wú)效。這些錯(cuò)誤碼在 Java 里要按照 errcode 落到日志而不是只打印 HTTP 狀態(tài)碼。第 3 章的代碼都假設(shè)你已經(jīng)有有效 access_token并把生成方法統(tǒng)一為byte[] createWxACode(String accessToken, String scene, String page, int width)這樣每種客戶端只需要關(guān)注請(qǐng)求體、響應(yīng)體和異常處理。3. 5 種 Java HTTP 調(diào)用方式從原生到第三方工具庫(kù)下面的代碼示例都聚焦在“生成微信小程序碼”這一步方法簽名統(tǒng)一為byte[] createWxACode(String accessToken, String scene, String page, int width)。入?yún)⒁呀?jīng)拿到了 access_token所以代碼塊里不會(huì)再出現(xiàn)獲取 token 的邏輯。每種方式的依賴、超時(shí)配置、異常處理各不一樣我會(huì)在每個(gè)小節(jié)后面說(shuō)明。3.1 方式一JDK 原生 HttpURLConnection這是零依賴的實(shí)現(xiàn)適合不引入第三方庫(kù)的項(xiàng)目。JDK 8 的用戶需要把readAllBytes()換成手動(dòng)讀取流下面代碼以 JDK 9 為例邏輯大家都能看明白。public byte[] createWxACode(String accessToken, String scene, String page, int width) throws IOException { // 把 access_token 拼在 query 參數(shù)里這是微信接口的要求 URL url new URL(https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token accessToken); HttpURLConnection conn (HttpURLConnection) url.openConnection(); conn.setRequestMethod(POST); conn.setDoOutput(true); conn.setConnectTimeout(3000); // 連接超時(shí)單位毫秒 conn.setReadTimeout(5000); // 讀超時(shí)圖片生成一般很快5000 足夠 conn.setRequestProperty(Content-Type, application/json; charsetutf-8); // 拼 JSON 請(qǐng)求體這里沒(méi)有做 JSON 轉(zhuǎn)義實(shí)際生產(chǎn)建議用 JSON 庫(kù) String body String.format({\scene\:\%s\,\page\:\%s\,\width\:%d}, scene, page, width); try (OutputStream os conn.getOutputStream()) { os.write(body.getBytes(StandardCharsets.UTF_8)); } int responseCode conn.getResponseCode(); if (responseCode 200) { // 微信返回的是圖片二進(jìn)制流不是 JSON try (InputStream is conn.getInputStream()) { return is.readAllBytes(); } } // 非 200 時(shí)錯(cuò)誤流里一般是 JSON 錯(cuò)誤碼讀出來(lái)方便排查 try (InputStream es conn.getErrorStream()) { String errorBody new String(es.readAllBytes(), StandardCharsets.UTF_8); throw new IOException(微信接口返回失敗HTTP responseCode , body errorBody); } }邏輯說(shuō)明HttpURLConnection 打開連接后通過(guò)setDoOutput(true)聲明要寫請(qǐng)求體然后用getOutputStream()寫入 JSON 字符串。微信接口成功時(shí)返回圖片二進(jìn)制失敗時(shí)返回 JSON 錯(cuò)誤信息需要分別處理。參數(shù)說(shuō)明connectTimeout控制 TCP 連接建立時(shí)間readTimeout控制等待響應(yīng)的最長(zhǎng)時(shí)間如果你用的網(wǎng)絡(luò)環(huán)境較差可以把 5000 調(diào)到 8000但沒(méi)必要更長(zhǎng)接口通常會(huì)秒回。3.2 方式二Apache HttpClient 5Apache HttpClient 是老牌 HTTP 客戶端適合項(xiàng)目里已經(jīng)用了 httpclient 依賴的團(tuán)隊(duì)。HttpClient 5 的 API 比 4.x 更清晰連接池管理也更成熟。public byte[] createWxACode(String accessToken, String scene, String page, int width) throws Exception { // 默認(rèn)會(huì)使用連接池每次調(diào)用結(jié)束后要 close否則連接無(wú)法釋放 try (CloseableHttpClient client HttpClients.createDefault()) { HttpPost post new HttpPost(https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token accessToken); post.setHeader(Content-Type, application/json; charsetutf-8); String json String.format({\scene\:\%s\,\page\:\%s\,\width\:%d}, scene, page, width); post.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON)); try (CloseableHttpResponse resp client.execute(post)) { byte[] bytes EntityUtils.toByteArray(resp.getEntity()); int status resp.getStatusLine().getStatusCode(); if (status 200) { return bytes; } throw new IOException(微信接口返回失敗HTTP status , body new String(bytes, StandardCharsets.UTF_8)); } } }這里用try-with-resources確保 HttpClient 和響應(yīng)都關(guān)閉。EntityUtils.toByteArray會(huì)把整個(gè)響應(yīng)讀進(jìn)內(nèi)存微信返回的圖片一般在幾十到幾百 KB不會(huì)有內(nèi)存壓力。如果想要更穩(wěn)健可以通過(guò)RequestConfig設(shè)置連接超時(shí)和讀取超時(shí)但示例從簡(jiǎn)生產(chǎn)環(huán)境要補(bǔ)上。對(duì)于并發(fā)較高的服務(wù)用同一個(gè) HttpClient 實(shí)例比每次 new 一個(gè)更好連接池復(fù)用是 Apache HttpClient 的核心優(yōu)勢(shì)。3.3 方式三OkHttp 4OkHttp 是 Android 和 Java 后端都很常用的 HTTP 客戶端API 簡(jiǎn)潔內(nèi)部對(duì)連接復(fù)用和超時(shí)處理做了大量?jī)?yōu)化。項(xiàng)目里如果用 OkHttp推薦優(yōu)先用它的 Builder 配置。public byte[] createWxACode(String accessToken, String scene, String page, int width) throws IOException { OkHttpClient client new OkHttpClient.Builder() .connectTimeout(3, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .build(); String url https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token accessToken; String json String.format({\scene\:\%s\,\page\:\%s\,\width\:%d}, scene, page, width); Request request new Request.Builder() .url(url) .post(RequestBody.create(json, MediaType.parse(application/json; charsetutf-8))) .build(); try (Response response client.newCall(request).execute()) { if (!response.isSuccessful()) { // body() 只能調(diào)用一次先取字符串再拋異常 throw new IOException(微信接口返回失敗: response.body().string()); } return response.body().bytes(); // bytes() 會(huì)把響應(yīng)體全部讀入內(nèi)存 } }OkHttp 的線程模型是異步可中斷的但這里用的是同步execute()返回后就是最終結(jié)果。注意response.body()只能調(diào)用一次所以先判斷成功再取 bytes。超時(shí)配置在 Builder 里完成connectTimeout和readTimeout與方式一的含義一致。如果你擔(dān)心 OkHttpClient 被反復(fù)創(chuàng)建可以在類里聲明為static final因?yàn)?OkHttpClient 本身就是線程安全的。3.4 方式四Spring RestTemplate如果項(xiàng)目已經(jīng)是 Spring BootRestTemplate 是很多人最早接觸的客戶端。它最大的坑是默認(rèn)消息轉(zhuǎn)換器可能把圖片二進(jìn)制當(dāng)字符串處理所以接收類型必須聲明為byte[]。public byte[] createWxACode(String accessToken, String scene, String page, int width) { // 生產(chǎn)環(huán)境建議把 RestTemplate 聲明為單例避免每次 new 浪費(fèi)性能 RestTemplate restTemplate new RestTemplate(); // 添加 ByteArrayHttpMessageConverter并放到第一位優(yōu)先處理二進(jìn)制響應(yīng) restTemplate.getMessageConverters().add(0, new ByteArrayHttpMessageConverter()); String url https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token accessToken; String json String.format({\scene\:\%s\,\page\:\%s\,\width\:%d}, scene, page, width); HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntityString entity new HttpEntity(json, headers); ResponseEntitybyte[] response restTemplate.exchange( url, HttpMethod.POST, entity, byte[].class); if (response.getStatusCode().is2xxSuccessful()) { return response.getBody(); } throw new RuntimeException(微信接口返回失敗: HTTP response.getStatusCode()); }這里最關(guān)鍵的是new ByteArrayHttpMessageConverter()否則 RestTemplate 會(huì)根據(jù)響應(yīng)頭中的Content-Type選擇轉(zhuǎn)換器圖片的響應(yīng)頭往往不是標(biāo)準(zhǔn)的 application/jsonSpring 可能用 StringHttpMessageConverter 把它轉(zhuǎn)成亂碼字符串。把ByteArrayHttpMessageConverter放到 List 第一位能保證它優(yōu)先處理。如果你在 Spring Boot 項(xiàng)目里使用 RestTemplate最好用Bean統(tǒng)一配置而不是在方法里 new這樣也能避免多個(gè)調(diào)用點(diǎn)重復(fù)設(shè)置轉(zhuǎn)換器。3.5 方式五Hutool HttpUtilHutool 是工具集合很多項(xiàng)目已經(jīng)有它的依賴。用 HttpUtil 發(fā)請(qǐng)求非常簡(jiǎn)潔特別適合在內(nèi)部工具、定時(shí)任務(wù)里快速實(shí)現(xiàn)。public byte[] createWxACode(String accessToken, String scene, String page, int width) { String url https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token accessToken; // 這里用 Hutool 的 JSONObject 拼參數(shù)避免手寫 String.format 的轉(zhuǎn)義問(wèn)題 JSONObject body new JSONObject() .set(scene, scene) .set(page, page) .set(width, width); HttpResponse response HttpRequest.post(url) .body(body.toString()) .timeout(5000) .execute(); if (response.isOk()) { // bodyBytes() 返回原始字節(jié)流不會(huì)做字符串解碼 return response.bodyBytes(); } throw new RuntimeException(微信接口返回失敗: response.body()); }Hutool 的HttpRequest.post支持鏈?zhǔn)秸{(diào)用.body()可以傳 JSON 字符串.timeout()統(tǒng)一設(shè)置連接和讀取超時(shí)。response.isOk()判斷 HTTP 狀態(tài)碼是否為 2xx。注意這里返回的是HttpResponse需要用bodyBytes()而不是body()因?yàn)閎ody()會(huì)默認(rèn)按文本解碼圖片會(huì)被弄亂。如果你已經(jīng)依賴 Hutool這種方式是最省事的。3.6 五種方式怎么選如果你已經(jīng)把上面的代碼都看懂了選型其實(shí)就看你項(xiàng)目里的依賴現(xiàn)狀。我給一個(gè)常見選擇參考方式依賴適用場(chǎng)景我的建議HttpURLConnection無(wú)零依賴、學(xué)習(xí)或簡(jiǎn)單工具小流量可用但連接管理要自己做Apache HttpClient需要引入已用 httpclient 的團(tuán)隊(duì)連接池成熟推薦長(zhǎng)期服務(wù)OkHttp需要引入已用 OkHttp 或追求 API 簡(jiǎn)潔綜合體驗(yàn)好推薦RestTemplateSpring 項(xiàng)目自帶已在 Spring 生態(tài)注意 ByteArray 轉(zhuǎn)換器Hutool HttpUtil需要引入工具腳本、定時(shí)任務(wù)上手最快但依賴會(huì)綁 Hutool我的做法是內(nèi)部定時(shí)任務(wù)用 Hutool業(yè)務(wù)接口用 OkHttp 或 RestTemplate少一個(gè)依賴就少一分排查成本。選哪一種不重要核心是把第 4 章的參數(shù)和第 5 章的坑處理好。4. 參數(shù)與返回圖片處理scene、page、width 以及二進(jìn)制流4.1 scene、page、width 的填寫規(guī)則和常見誤解先給參數(shù)一個(gè)明確的表然后逐個(gè)拆。這是我在生產(chǎn)環(huán)境執(zhí)行了無(wú)數(shù)次的參數(shù)組合下面是關(guān)鍵參數(shù)清單參數(shù)類型必填說(shuō)明sceneString是unlimit 接口最大 32 個(gè)可見字符只能數(shù)字字母和部分符號(hào)pageString否默認(rèn)首頁(yè)頁(yè)面路徑如 pages/index/index不帶 / 和后綴widthInteger否默認(rèn) 430圖片寬度單位 px范圍 280-1280auto_colorBoolean否自動(dòng)配色true 時(shí)忽略 line_colorline_colorObject否線條顏色默認(rèn) black如 {r:0,g:0,b:0}env_versionString否release、trial、develop默認(rèn) releasescene 最容易踩坑。很多運(yùn)營(yíng)把訂單號(hào)、渠道碼、用戶ID 全塞進(jìn)去比如order202401010001userabcchannelxxx一不小心就超過(guò) 32 字符而且中文直接報(bào)錯(cuò)。正確的做法是scene 里只放一個(gè)短的業(yè)務(wù)標(biāo)識(shí)比如數(shù)據(jù)庫(kù)自增 ID或者uid_12345由后端拿到 scene 后去查真正的業(yè)務(wù)數(shù)據(jù)。如果確實(shí)要組合多個(gè)維度可以用_或-分隔但要控制在字符集和長(zhǎng)度內(nèi)。page 參數(shù)必須是小程序里真實(shí)存在的路徑不能帶.html或前導(dǎo)/也不能帶?參數(shù)。如果你在開發(fā)階段調(diào)試需要配合env_version: develop并確保這個(gè)頁(yè)面在開發(fā)者工具里已經(jīng)配置為可訪問(wèn)。width 控制圖片寬高430 在小程序碼里視覺(jué)效果最好如果嵌入到海報(bào)或長(zhǎng)圖中需要大圖可以調(diào)到 500 以上但不要超過(guò) 1280否則微信也會(huì)拒絕。在線下聯(lián)調(diào)時(shí)如果小程序頁(yè)面還沒(méi)發(fā)布getwxacodeunlimit 默認(rèn)會(huì)校驗(yàn) page 是否屬于 release 版本此時(shí)生成失敗。你需要在請(qǐng)求體里加env_versiondevelop并且保證后端使用的 appid 和小程序開發(fā)工具登錄的是同一個(gè)賬號(hào)。trial 則對(duì)應(yīng)體驗(yàn)版release 對(duì)應(yīng)正式版。這個(gè)參數(shù)容易被忽略我第一次聯(lián)調(diào)時(shí)就是被這個(gè)參數(shù)卡了一天。還可以用 line_color 指定小程序碼的顏色例如生成紅色碼。這里給一個(gè)帶顏色參數(shù)的請(qǐng)求體示例后續(xù)接口邏輯不變只是 JSON 多兩個(gè)字段String json {\scene\:\uid_12345\,\page\:\pages/index/index\,\width\:430, \auto_color\:false,\line_color\:{\r\:255,\g\:0,\b\:0}};4.2 拿到 byte[] 之后保存文件、轉(zhuǎn) Base64、直接輸出圖片流微信接口正常返回時(shí)body 是一張 PNG 圖片的二進(jìn)制流完全不是 JSON。不同業(yè)務(wù)場(chǎng)景對(duì)這份二進(jìn)制的消費(fèi)方式不同我拆成常見的三種。第一種是保存到服務(wù)器磁盤適用于定時(shí)生成、預(yù)生成文件后上傳 CDN 或 OSS 的場(chǎng)景// 保存前確保目錄存在否則會(huì)拋 NoSuchFileException byte[] bytes createWxACode(token, uid_12345, pages/index/index, 430); Path file Paths.get(/data/qr/uid_12345.png); Files.write(file, bytes);第二種是返回 Base64 字符串給前端前端可以直接放進(jìn)img srcdata:image/png;base64,...。注意要拼接data:前綴否則瀏覽器不會(huì)識(shí)別byte[] bytes createWxACode(token, uid_12345, pages/index/index, 430); String base64 Base64.getEncoder().encodeToString(bytes); // 返回給前端的就是 data:image/png;base64,xxxxxx String dataUrl data:image/png;base64, base64;第三種是后端接口直接輸出圖片流前端用img src/qrcode?scenexxx來(lái)加載。這種方式適合低頻調(diào)用每次請(qǐng)求實(shí)時(shí)生成// 偽代碼Controller 層 GetMapping(/qrcode) public void qrcode(HttpServletResponse response, RequestParam String scene) throws IOException { byte[] bytes createWxACode(token, scene, pages/index/index, 430); response.setContentType(image/png); response.getOutputStream().write(bytes); }微信接口成功時(shí) Content-Type 通常是 image/png失敗時(shí)則是 application/json。在 Java 中不要只判斷 HTTP 狀態(tài)碼因?yàn)榻涌谑∫部赡芊祷?200 但 body 是 JSON微信接口在部分錯(cuò)誤場(chǎng)景下會(huì)用 HTTP 200 返回 errcode。所以更穩(wěn)妥的做法是先讀取 byte[]然后判斷圖片魔數(shù)。PNG 文件的前四字節(jié)固定是0x89 0x50 0x4E 0x47也就是\x89PNG可以用下面的方式判斷byte[] bytes createWxACode(token, scene, page, width); if (bytes.length 4 (bytes[0] 0xFF) 0x89 bytes[1] P bytes[2] N bytes[3] G) { // 正常圖片繼續(xù)處理 } else { // 錯(cuò)誤 JSON轉(zhuǎn)字符串查看 errcode String err new String(bytes, StandardCharsets.UTF_8); log.error(微信接口錯(cuò)誤: {}, err); }三種返回方式各有取舍保存文件適合預(yù)生成Base64 適合后端接口直接返回 JSON 給前端不需要額外請(qǐng)求直接輸出流最簡(jiǎn)單但每次都要調(diào)微信流量一大就會(huì)觸發(fā)頻率限制。我建議把 Base64 和直接輸出流都作為上層選擇底層統(tǒng)一暴露byte[]這樣切起來(lái)非???。5. 避坑指南微信二維碼接口最常見的 4 個(gè)坑以下都是真實(shí)場(chǎng)景里反復(fù)出現(xiàn)的問(wèn)題我按“現(xiàn)象 → 原因 → 解決”的順序?qū)懨織l都可以直接對(duì)照排查。5.1 坑一access_token 在服務(wù)里頻繁失效接口報(bào) 40001現(xiàn)象生成二維碼的接口偶爾報(bào)錯(cuò)日志里出現(xiàn)errcode:40001, errmsg: invalid access_token而且不是每次失敗是隔一段時(shí)間就集中報(bào)一批。原因access_token 有效期 7200 秒但你的服務(wù)可能部署了多個(gè)節(jié)點(diǎn)每個(gè)節(jié)點(diǎn)各獲取各的 token。后拿到的 token 會(huì)把先前的擠掉但微信對(duì) token 的生效有延遲多節(jié)點(diǎn)之間會(huì)出現(xiàn)短暫的空窗期。另一個(gè)常見原因是沒(méi)有做緩存每次生成二維碼都重新調(diào) token 接口也會(huì)引發(fā) token 被刷新。解決用一個(gè)全局緩存比如 Rediskey 按 appid 區(qū)分value 存 access_token過(guò)期時(shí)間設(shè)為 7000 秒比有效期提前 200 秒刷新。如果請(qǐng)求期間發(fā)現(xiàn) token 過(guò)期加鎖重新獲取避免多個(gè)線程同時(shí)刷 token。下面是一個(gè)典型的封裝示意public String getAccessToken() { // 第一步查緩存命中就直接返回 String token redis.opsForValue().get(WX_TOKEN_KEY appid); if (token ! null) { return token; } // 第二步加鎖防止并發(fā)重復(fù)刷新 synchronized (this) { token redis.opsForValue().get(WX_TOKEN_KEY appid); if (token ! null) { return token; } // 調(diào)用微信 token 接口刷新 token fetchTokenFromWeixin(appid, secret); redis.opsForValue().set(WX_TOKEN_KEY appid, token, 7000, TimeUnit.SECONDS); } return token; }如果項(xiàng)目沒(méi)用 Redis也可以用本地內(nèi)存緩存但要注意多實(shí)例部署時(shí)每個(gè)實(shí)例的 token 可能不一致最好還是引入一個(gè)共享存儲(chǔ)。如果已經(jīng)用了 Redis 還出現(xiàn) 40001檢查多個(gè)服務(wù)實(shí)例的時(shí)鐘是否一致以及 Redis 的 key 是否被手動(dòng)刪除。這個(gè)坑不解決第 3 章的 5 種實(shí)現(xiàn)方式誰(shuí)寫都會(huì)炸。5.2 坑二scene 內(nèi)容超長(zhǎng)或帶中文接口返回 41031現(xiàn)象curl 或 Java 調(diào)用返回errcode:41031, errmsg: invalid scene。有時(shí)甚至生成成功但掃碼后小程序拿不到預(yù)期的參數(shù)。原因scene 參數(shù)被拼接得又長(zhǎng)又復(fù)雜或者里面帶了中文、空格。微信對(duì) scene 有嚴(yán)格限制最多 32 個(gè)可見字符只允許數(shù)字、字母以及!#$()*,/:;?-._~這些特殊字符。很多后端會(huì)下意識(shí)把userId123activityId456channelabcd整個(gè)塞進(jìn)去長(zhǎng)度超限。解決scene 里只放一個(gè)短 ID比如用戶表主鍵。需要傳多維度信息時(shí)可以在服務(wù)端維護(hù)一個(gè)超短隨機(jī)碼例如s 9 位隨機(jī)字符串把它和真實(shí)業(yè)務(wù)參數(shù)存到 Redis并設(shè)置過(guò)期時(shí)間。這樣 scene 永遠(yuǎn)只有 10 個(gè)字符既滿足限制又能讓掃碼后的頁(yè)面一次性拿到完整參數(shù)。// 生成短標(biāo)識(shí)作為 scene避免直接拼業(yè)務(wù)參數(shù) String scene s RandomStringUtils.randomAlphanumeric(9); redis.set(scene: scene, userId123activityId456, 300, TimeUnit.SECONDS);如果只是中文可以嘗試用英文字母替代但不建議對(duì)中文做 URL 編碼因?yàn)?scene 的總長(zhǎng)度限制按字符數(shù)算編碼后的 % 會(huì)占多個(gè)字符更容易超限。另外注意和是允許的但傳參前要對(duì)拼接后的字符串做一次長(zhǎng)度校驗(yàn)超過(guò) 32 字符直接拒絕并告警別讓它走到微信接口才報(bào)錯(cuò)。5.3 坑三page 路徑寫錯(cuò)或帶了 .html生成失敗現(xiàn)象調(diào)用接口返回errcode:41030, errmsg: invalid page或者生成了一張碼但是掃碼后提示頁(yè)面不存在。原因page 參數(shù)必須是小程序內(nèi)已存在的頁(yè)面路徑而且不能帶前導(dǎo)/不能帶.html不能帶參數(shù)。常見錯(cuò)誤是把pages/index/index.html寫進(jìn)去或者寫成了/pages/index/index。還有一個(gè)小程序端大小寫敏感的問(wèn)題路徑大小寫不匹配也會(huì)報(bào) 41030。解決先在小程序開發(fā)工具的“頁(yè)面”列表里確認(rèn)路徑復(fù)制不帶后綴的路徑。如果接口已經(jīng)報(bào) 41030先檢查路徑是否匹配。開發(fā)階段記得給請(qǐng)求體加env_version:develop否則默認(rèn) release 模式會(huì)直接校驗(yàn)線上已發(fā)布頁(yè)面本地未發(fā)布的頁(yè)面會(huì)失敗。下面是一個(gè)修復(fù)后的請(qǐng)求體示例{ scene: uid_12345, page: pages/index/index, width: 430, env_version: develop }還有一個(gè)細(xì)節(jié)page 如果不傳默認(rèn)跳小程序首頁(yè)如果你的首頁(yè)路徑不是pages/index/index最好顯式傳遞。如果想把這個(gè)參數(shù)配置化放到application.yml里不同環(huán)境用不同 path可以避免聯(lián)調(diào)時(shí)反復(fù)改代碼。5.4 坑四用 String 接收?qǐng)D片響應(yīng)得到一堆亂碼現(xiàn)象代碼里用response.body().string()或ResponseEntityString接收微信返回結(jié)果打印出來(lái)是一串亂碼或者保存后的文件不是圖片打開報(bào)錯(cuò)。原因微信接口返回的是二進(jìn)制圖片流但你用了文本解析器。比如 Hutool 的body()會(huì)按默認(rèn)編碼解碼RestTemplate 的 String 轉(zhuǎn)換器也會(huì)把字節(jié)流轉(zhuǎn)成亂碼字符串。更隱蔽的是某些 HTTP 客戶端會(huì)自動(dòng)把響應(yīng)頭里的Content-Type當(dāng)作文本類型導(dǎo)致內(nèi)部轉(zhuǎn)碼。解決統(tǒng)一用byte[]或字節(jié)數(shù)組接收響應(yīng)不要用 String。上面第 3 章代碼里我們用的readAllBytes、EntityUtils.toByteArray、response.body().bytes()、response.bodyBytes()都是正確的。如果使用 RestTemplate必須保證消息轉(zhuǎn)換器列表里ByteArrayHttpMessageConverter在最前面否則 Spring 會(huì)選 String 轉(zhuǎn)換器。排查時(shí)可以先打印響應(yīng)頭看Content-Type是不是image/png如果變成了application/json說(shuō)明接口返回了錯(cuò)誤信息而不是圖片這時(shí)候再去解碼錯(cuò)誤 JSON。6. 進(jìn)階玩法把二維碼生成做成穩(wěn)定生產(chǎn)線6.1 用 Redis 做圖片緩存按場(chǎng)景分層第 5 章的 token 緩存只是保底真正的生產(chǎn)環(huán)境我會(huì)把“二維碼圖片本身”也緩存起來(lái)。比如同一個(gè)活動(dòng)碼如果 scene 是 activityId所有用戶共用一張碼緩存 7 天都沒(méi)問(wèn)題。按用戶維度生成的碼內(nèi)容不同不能復(fù)用但也可以把生成結(jié)果存下來(lái)用戶再次請(qǐng)求時(shí)直接返回圖片字節(jié)。我在 service 層一般做兩層查詢byte[] getQrCode(String scene) { // 第一層Redis 緩存圖片字節(jié)避免重復(fù)調(diào)微信 byte[] cached redis.get(qr: scene); if (cached ! null) { return cached; } // 第二層調(diào)微信實(shí)時(shí)生成然后寫回緩存 byte[] fresh createWxACode(token, scene, pages/index/index, 430); redis.set(qr: scene, fresh, 24, TimeUnit.HOURS); return fresh; }緩存時(shí)間不要太長(zhǎng)因?yàn)樾〕绦蝽?yè)面內(nèi)容迭代后舊碼掃碼可能進(jìn)到一個(gè)報(bào)錯(cuò)頁(yè)面。一般 24 小時(shí)或按活動(dòng)周期設(shè)置。高頻活動(dòng)碼建議異步預(yù)生成而不是用戶點(diǎn)要求時(shí)才去請(qǐng)求微信。常見做法是在活動(dòng)創(chuàng)建時(shí)把需要的 scene 列表丟進(jìn)消息隊(duì)列消費(fèi)者拉取后統(tǒng)一調(diào)用微信接口生成圖片上傳到 OSS 或 CDN再把 URL 寫入數(shù)據(jù)庫(kù)。前端拿到的是一張 CDN 圖片不直接依賴微信接口。6.2 重試、監(jiān)控和最后留個(gè)習(xí)慣異步預(yù)生成也別忘了重試和監(jiān)控。微信接口失敗后延遲 1 分鐘重試并記錄錯(cuò)誤碼如果連續(xù)失敗超過(guò) 3 次郵件告警。這樣把實(shí)時(shí)調(diào)用變成了異步任務(wù)微信接口頻率限制的影響就小很多。小程序二維碼接口本身不復(fù)雜真正復(fù)雜的是 token 有效期的網(wǎng)絡(luò)問(wèn)題、參數(shù)格式的嚴(yán)格限制以及圖片流的正確消費(fèi)方式。以前我在一個(gè)業(yè)務(wù)系統(tǒng)里圖省事直接每次實(shí)時(shí)生成結(jié)果活動(dòng)流量一大微信接口報(bào)了很多超時(shí)和限流又被運(yùn)營(yíng)追著問(wèn)為什么圖片加載不出來(lái)。后來(lái)改成“Redis 緩存 異步預(yù)生成 圖片上傳 OSS”這套組合接口基本沒(méi)有打滿過(guò)微信頻率限制。每當(dāng)你準(zhǔn)備在業(yè)務(wù)代碼里直接調(diào)微信接口時(shí)多想想能不能緩存、能不能提前生成這比選哪個(gè) HTTP 客戶端更關(guān)鍵。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情小说亚洲| 中文字幕日产av人| 欧美|91色综合| 麻豆成人av| 亚洲资源站| 亚洲视频精选| 婷婷99| http://qxhbdz.com| 青青伊人久久| 日韩中文字幕视频| 欧美精品久久96人妻无码| 天天日美女的B| 久久精品国产亚洲AV高清演员表| 亚洲网自拍| 青草综合| 秋霞视频一区二区 | 黑人免费福利视频| 亚洲日韩肥臀视频在线观看| 极品另类| 亚州操操穴网| 国产一级内射高清视频| 99免费在线视频| 夜夜国自区| 国产探花精品在线| 国产精品久久久久久无码红治院| 在线日韩日本亚洲国产| 97中文超碰| 日本媚薬中文字幕在线| 欧美制服网站美腿丝袜| 69一区二区三区 | 久久久九九| 亚洲一级特黄大片在线播放91| 男女91| 精品国产一区探花在线观看| 91人妻视频| 秋霞一级鲁丝片A片| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 综合色99| 熟女乱3伦999| 亚洲高清在线se| 亚洲操逼无码| 国产精品96久久久久久| 91啪9色| 插入逼91| 啊啊啊要高潮了| 51一区二区三区| 色噜噜日韩精品| 涩涩五月天| 久久久久久十| 97色97好| 色哟哟511老熟女| 欧美激情亚洲情色| 精品久久久无码| 日韩性爱小视频| 97硬碰| 乱伦av.com| 欧美,日韩,中文,另类| 黄片在线免费在线观看| 午夜福利合集| 偷拍网站久久男女男| 久久美女国产| 韩国三级色呦呦| 91 丝袜在线| 国产九九九九九九九九| 日韩操啪| 夜夜爽夜夜操| 成人AV在线网站| 久久男人的天堂国产| 欧美综合天天| 舔舔啊| 91麻豆天美国产欧美| 澳门黄片一香蕉视频| 国产天天骚| 国产精品一区二区 尿失禁| 欧美色另类| 欧美精品双插| 九九九九久久久| 国产一级内射无挡观看| 亚洲精品国产精品成人| 精品人妻一区二区三区日产| 亚洲视频二区| 人妻精品综合中文字幕在线| 100啪啪视频大全| 97视频播放| 91n免费处女| 成人夜夜爽| 91影库| 亚洲综合第一页| 丰满人妻一区二区中文| 欧美亚洲综合999| 日韩天美| 秋霞一级视频在线观看免费| 中文字幕一区二区三区高清| 岛国黄片网站| 97综合久久| 色老牛| 久久久久性熟视频| 亚洲伊人久久精品狠狠在线| 91在线国产后入风骚翘臀美女素人| 国产97在线 | 亚洲| 伊人 俄罗斯 a v| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 九九九九九九视频| 久久久久密臀一区二区| 麻豆黄色五月天| 久久久久久性爱片| 一区,二区,三区视频| 嫩草一区二区在线观看| 激情专区综合| 天天爽人人综合免费7799| 97资源制服丝袜| 91精品无码人妻系列| 看大黄色大片原件| 26uuu最新| 九九亚洲| 大JI巴好深好爽又大又粗视频| 麻豆一区二区三区在线看| 综合欧美日韩在线| 综合大香蕉美。| 国产精品一级二级在线| 另类av综合久久| 18精品一区| 欧美亚男人的天堂| 精品国产一区二区久久| 91影视亚洲| 亚洲情色一区二区三区| 高清不卡一二三区视频......| 天天舔天天 | 久久女女| 男人的天堂99| 91人妻在线视频| 嗯嗯啊啊的视频| 呦女网站| 怡春院久久| 操逼视频免费日韩无码| 99操碰| 99热网站| 欧美 亚洲 另类 综合| 60秒免费小视频| 啊啊啊啊啊啊啊啊要喷了| 国产精品在线一区二区| 国产精品一区在线播放| 精品国产a∨一区天美传媒| 欧美综色欧| 97在线观看免费| 亚洲欧美在线丝袜| 温婉少妇玩3p| 人妻激情另类| 久草婷婷| 精品999999| 97国产精品| 国产精品区在线12p| 成人 日本A片无码8888| 大香蕉伊人网WWWn0n| 国产肏屁眼视频| 超碰97资源网亚洲| 丰满人妻一区二区三区四区| 久久性生大片免费观看性| 国产亚洲精品无码三区| 日韩成人综合网| 国产亚洲 中文欧美久久| 久久乐| 欧美性爱一区二区三区四区| 大香蕉中文201| 中国AV美女| 性爱视频啪啪啪啪| 操狠狠| 精品国产一区二区三区香蕉欧美| 天天干天天干天天干| 黄色性爱网网| 啊啊啊好湿久久| 婷婷激情五月综合| 国产精品盗摄 偷窥盗摄| 蜜乳AV网址| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 物尤视频一区二区| www.男人的天堂| 琪琪精品免费一区二区三区 | 好湿好紧好爽 视频| 免费国产| 免费超碰97在线观看| 99久久9| 蜜臀久久在线视频| 加勒比久久av| 亚洲人体视频在线观看| 天天干嫩逼网| 另类 日韩 熟女| 欧美精品在线观看| 不卡在线观看视频| 美女自卫慰黄网站免费| 一区| 欧美偷拍区| 裸体美女免费看网站青草| 在线情色电影 91大 | 激情干在线| 久久亚州高清| 亚洲中文字幕在线视频一区二区| 五月丁香色综合| 91熟女.com| 欧美亚洲一级在线观看| 97干色天堂| 99人妻| 综合网色| 欧美少妇色图| 伊人97色天使| 尤物视频视频官网| 欧美精品1区2区3区| 丁香婷婷激情五月天无毒不卡 | 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 久久免费精品视频免一| a人片中文字幕一区二区| 夜夜精品视频| 亚洲最大黄网| 大但人体久久久久| 一级黄碟| 99这里只有精品| 天天欧美| 欧美躁死她一区二区| 青青草原香蕉日本Ap| 91精品久久久久久综合五月天| 激情五月天校园春色网| 强奸乱伦av电影| 伊人操操| 美女午夜福利免费视频| 亚洲 欧美 小说| 精品无码一区二区三区| 蜜臀久久在线视频| 一级AV性爱| 男人的天堂2019AV| 91精品人妻偷情| 国产精品欧美激在线| 2020中文在线一区二区三区| 在线五区| 水澄无码AV| 99久久99久久免费精品蜜臀| 91视频成人福利网站在线一区| 国产主播福利| 国产欧美日韩臀| 国产日韩在线播放| 易易A毛视频| 国产精品久久9| 丰满人妻一区二区三区四区| 狠狠干精品一二三四五六2022| 国产成人91一区二区三区| 亚洲自拍一区夜夜操| 青椒国产97在线熟女| 九99久久| 成人婷婷丁香| 91精品微拍福利| 美日韩一卡二卡三卡免费人妻精品| 人人玩人人添人人澡免费| 人妻少妇色综合| 中文字幕性感少妇av| 91岛国动作片| 99re69| 亚洲国产午夜真人一级片中文字幕精品黄网站 | www.成人无码| 久久精品国产亚洲AV高级北京| 超碰欧美97| 大香蕉伊在线久草麻豆天堂故事| 911粉嫩人妻| 精品高潮| 麻豆久久久久久久久丝袜 | 国产 亚洲 丝袜 制服| 国产熟女二区| 色丁香五月婷婷| 在线中文字幕| 91AV国产精品| 久久水蜜臀亚洲AV无码精品| 综合影院亚洲| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 97伊人超碰| 蜜桃传媒一区二区亚洲| 免费一级欧美片片线观看| 麻豆视频一区二区| 亚洲激情深爱文学小说网站| 久久夜夜夜| 韩国一级做A片免费的| 日韩AV噜噜噜一区二区三区四区| 欧洲精品在线播放| 欧美亚洲第1页| 婷婷久久大香蕉| 日韩综合无码色欲vv| 97精品网| 亚欧洲日韩国产精品| 久草热制服丝袜在线观看| 色小视频蜜乳| 狼狼色丁香久久婷婷综合五月| 国产久久久| 激情人妻另类| 国产专区第一页| 嫩草 我啊~嗯~在线| 无码一区二区三区四区五区六区七区八区九区十区视频 | 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 国产精品suv一区| 色97欧美| 欧美日韩妖精91com| 99精品久久久久久久婷婷| 国产精品一级片在线看| 国产在线激情视频| 天天射天天操天天干天天吃2018| 人妻大香蕉| 伦在线97| 歐美性天天| 精品人妻一区二区三区-国产精品| 精品视频久久久久九九九九9999| 久久婷婷精品| 五月丁香六月激情| 思思热在线视频精品| 新版天堂中文资源8在线| 久久一区二区高清免费| 色欲日韩欧美在线一区| 九色视频91| 搞中出久久| 人人 操人人 操人人| 人人操人人爽人人操人人| 国内外内射高清视频| 国产精点久久久成人| 十八禁视频一区二区| 精品国产91内射久久| 日本精品中文字幕视频| 日本一区二区亚洲综合| 亚洲欧洲中文日韩女优乱码| 中文字幕丰满人妻日本| 国产成年精品高清在线观看91| 成人精品久久久午夜福利| 亚洲 无码 偷拍| 国产AAAAAABBBBB| 中文AV制服乱伦| 亚洲乱色熟女一区| 91c色| 黄骗免费| 亚洲啪啪性视频| 日本中文字幕在线电影| 后入日本1234| 吉川爱美亚洲二区在线 | 久久久96| 久久精品成人| 青青草在线视频播放器| 久久区| av网站在线看| 亚洲精品aa久久伊人| 久久精品性| 一区二区三区精品黑丝白丝酒店对鸡 | 人人澡人人爽人人精品| 啊啊啊在线观看免费视频| 在线五区| 午夜性刺激视频免费观看| 高清视频一区| 为用户提供免费看黄网址在线观看| 变态乱伦伪娘灌肠一区二区| 国产成人免费观看在线视频| 美女诱惑1区2区| 丝袜无码a片| 一本大道久| 麻豆尤物视频网| 国产亚洲精品激情| 啊啊啊不要啊啊受不了了视频在线| 男人天堂久久精品不卡| 亚洲高清视频在线免费观看| jizzjizz欧美| 天天摸天天插天天日| 综合av影片| 久操免费在线| 一个人免费HD91视频| 日韩亚洲美女一区久久| 亚洲国产中文字幕| 91AV入口| 一区二区偷拍拍视频| 亚洲天堂日本| 欧美日韩国产另类综合| 婷婷五月天久久久| 99热日| 精品久久久久久中文字幕视频免费| 国产精品无码久久久久2028| 午夜情侣自拍网站| 99久草| 久久无码电影| 99啪| 精品日韩| 亚洲一区二区麻豆影院| 精品少妇高潮久久| 91c色| 一区中文字幕二区日韩| 97在线看| 超碰AV在线| 国产成人精品午夜福利| 久久精品日韩| 东北老女人的激情视频| 永久电影三级在线观看| 69精品少妇一区二区三区蜜桃| 97天天在线| 很黄很色的视频在线观看| 欧美最婬乱婬爆婬性视频 | 国产精品人妻熟女aⅴ| 久热伊人99re| 丁香七月婷婷| 婷婷伊人| 色吊丝 日日骚 清纯唯美| 免费αⅴ在线观看| h色99999| 黄片www.| 99少妇| 色婷婷亚洲婷婷| 欧美亚洲清纯| 超碰人人干| 欧美日本视频一区| 成人在线视频网| 亚洲男人天堂2013| 色噜噜精品一区二区三| 夜夜嗨一区| 日本综合久久| 国产又大又粗又长视频| 91九色精品熟女内射| 99re这里只有精品2| 日韩国产中文字幕| 玖玖爱影院| yazhousetuoumei| 大屁股人妻女教师撅着屁股| 久热久一区二区三区| 精品人妻一区二区三区四区| 男人的天堂在线有码| 97精品视频在线播放| 探花精品视频| 青青操日韩| 天天做天天爱| 2019精品国产无码成人| 大香蕉色欲AV| 婷婷五月天影院| 国产精品久久久久久久久久久久| 一区二区久久天天干狠狠| 久久久新亚洲AV| 日本超碰在线国产一区| 热99re69精品8在线播放| 久久久国产成人一区二区三区在线| 天天综合网合集91| 精品一区99999| 亚洲欧美碰碰| 欧美中文字幕男人天堂久久精品 | 蜜桃中文字日产乱幕4区| 国产乱伦性爱区| 嗯~啊~快点 死我视频免费看网站| www欧美性爱| 亚洲人妻久久| 亚洲色图加勒比| blacked精品一区国产| 人妻丝袜一区二区三区在线| 亚洲成人精品久久久| 一区二区三区精品视频| 夜色综合| 亚洲涩涩| 亚洲情色1区| 亚洲AV无码黄色强奸| 欧美双插| 麻豆AV96熟妇人妻| 九九在线精品| 亚洲成人激情小说视频| 久久久一二三四区| 亚洲精品819| 五月天丁香婷婷综合网站| 97欧美在线| 岛国AB视频| 91人人操| 色噜噜人妻av中文字幕| 青青草日本中文字幕| 亚洲精品一区中文字幕乱码| 强奸乱伦AV网址| 久久久久幕乱码| 亚洲天堂色图| 亚洲一区中文字幕一区| 熟女五十路一区二区三| 3PAV乱伦视频| 啊v在线观看视频| 熟妇艹鸡八| 欧美制服网站美腿丝袜| 久99| 日本熟妇人妻中出视频| 久久精品人人做人人看| 国产熟妇 码视频户外直播| 欧美人妻一区二区| 老女人老91妇女老热女| 婷婷五月天无码 | 97五月天| 一级免费啪啪片| 国产免费黄色一级大片| 好爽视频在线观看视频 | 亚洲色吧网| 深田咏美亚洲精品福利社| 国产成人精品无码久久| 91欧美www| 99热这里只有精品1| 人妻一区久久二区三区色播| 国产精品小视频一区二区三区| 操逼操逼逼操操逼91 | 天天92av| 最新无码国产| 天天看天天干| 懂色aV一区二区天美传媒| 国产妇女精品视频青青草| 色九九九九| 96免费视频在线| 99re不伦| 久久伊人青青草| 超碰调教97| 亚洲精品久久久久久久久豆丁网| 日韩亚洲美州欧洲综三区一品在线| 99碰碰| 婷婷久久大香蕉| 99无码视频| 日韩pv中文| 草b在线 | 四虎精品永久在线播放| 日本韩国国产精品一区| 久久久久久亚洲Av无码| 国产中文字幕在线点播| 久久国产免费激情视频| 国内毛片国产专区二| 精品国产无码中文| 51一区二区三区| 操逼网免费无码视频| 97色婷| AV一二区| 久热久| 五十路成人在线视频二区三区| 欧美日韩亚洲少妇寂寞影院正在播放 | 高清国产精品无码| 太久视频| 美女午夜福利免费视频| 久久老子无码午夜伦不卡| 色色五月婷婷| 国产久久日韩网站导航| 性九九九九九九| 夜夜嗨一区二区三区直播内容| 久久激情婷婷| 亚洲三区视频| 男人的天堂亚洲| 97色欧州| 精品国产乱码久久久久久久久久毛片 | 好吊色综合| 亚洲男人久久综合天堂| 大香蕉五月天婷婷| 2019AV天堂| 久久一二三四五六七八九区| 干超碰碰熟女| 欧美性爱一级操| 天天肏美女| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 精品福利| 国产男人又猛又粗又爽| 欧美不卡在线美女| 校园春色中文字幕AV| 夜夜性| 日本精品一级二级三级| 国模精品一区二区三区苹果色戒 | 99ri在线视频| 天天干人妻| 97综合久久| 另类TS人妖一区二区三区| 欧美国产日韩高清在线| 9999九九九久久久| 亚洲欧洲av影音| 色999亚洲人成色| x97av| 天天射天天操天天干天天吃2018| 搡老女人老妇女AAA一VU麻豆 | 97精品97| 人人操人人色网| aaa一级黄片| 国产夜夜操| 人妻欧美| 色综合99| 欧美丰满少妇交换91欧美精品| 狠狠操官网| 久久理论字幕视频| 美女高潮国产高清| 一区二区日韩欧美久久| 激情文学亚洲| 国产强奸超碰AV| 精品无码不卡视频| 熟女六十路| 伊人网青青| 国产久久一区二区午夜| 超碰97国产欧美| 在线观看精品国产免费| 久久草视频污视频| 91在线超高颜值国产| 乱理日韩中文| 美女天天干| 亚洲激情在线| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 97视频观看| 欧美综合另类| 啪啪91| 亚洲欧美日韩中文播放| 骚乳在线| 成人自拍三级在线观看| 97日视频| 国产又大又硬又长又粗| av网页一区二区三区| 人妻熟女一区二区三区在线| 免费福利视频中文字幕| 金典av| 狠日操| 青青草玖玖爱| 成人免费不卡在线视频| 限制级中的三级片中的黑粗大屌屌日人妻熟女 | 宗合情欲网| 狠狠色伊人亚洲综合网站色| 黄色高清久久无码依人| 95自拍视频在线观看| 亚洲熟女一区| 福利社区午夜一区二区| 色拍偷亚洲| 亚洲国产欧美中文永久| 男女国产精品| 91影视亚洲| 欧美97视频| 欧美精品99久久久**| 亚洲欧美日韩制服另类| 精品中文日韩字幕视频| 亚洲精品日日夜夜52| 日本国产二线女色| 91亚·色| 福利操逼| 91亚洲影视| 91精品91久久久中77777| 黄骗免费网站| 欧美伦乱爱| 亚洲欧美中文日韩视频中国语| 人人操人人肉久久精品| 久久綜合很很很| 人人操人人摸人 | 九九在线视频| 亚洲AV成人无码一二三久久| 亚欧美色图| 久久久影院| 日人妻视频91| 中文一区二区三区影院| 91美女視頻| 先锋精品av色鲁| 6080YYY午夜理论片在线观看| 少妇蹲下买菜露大唇0| 好湿好紧好爽 视频| 久操凹凸视频| 少妇久久| 岛国在线一区二区三区| 久草新在线| 内射卯月麻衣| 久久久久久久久久久久久久久性生活视频| 三级激情网站| 一区二区不卡视| 白丝在线一区| 青青草久久一区网| 亚洲成A∨人影院在线欢看| 国产精品美女视频诱惑| 久久久9 9 9精品| 天堂精品在线| 亚洲欧美日韩夜夜| 天天草夜夜草高潮片| 91色拍| 欧美性五月| 亚洲揄拍网| 999久久久久久久精| 日日摸夜夜夜夜爽| 国产精品视屏| 人妻熟女一区二区三区视频| 男人的天堂日本东京热| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 高颜值美女口爆高潮浪叫| 九九九久久久久| 精品无码久久久| 成人性爱美曰韩| 牛牛操视频逼| 高清有码一区二区| 啊啊啊好想要| 免费视频97| 欧美色图欧美| 伊人宅男大香蕉| 国产精品国产| 欧美激情久久久久| 天天天天天天天天综合| 精品久久久久黄少妇| 夜夜肏2021| 99九九精品| 亚洲国产精品有声| 一本色道无码DVD中文字幕| 天天日夜干| 男人的天堂久久| 极品人妻少妇综合| 亚洲精品熟妇1区2区3区。| 日韩av电影网站| 亚洲蜜臀视频精品久久| 亚洲综合影视| 在线日韩视频| 99在线精品视频| 天天干天天插| 69超碰综合| 97在线免费看| 97综合日韩| 天天爽夜夜欢视| 久日综合网| 国产超碰97| 欧美日韩中文字幕人妻| 99婷婷一区二区| 在线A日本| 免费一级视频特黄色大片| 日日夜夜狠狠| 美女大乳久久久久久久女人18| 成人在线视频一区| 操老熟女AV| 蜜臀在线网站| 97天天摸天天爽| 一级AV性爱| 岛国AB视频| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 久久香蕉国产线看观看亚洲女人 | 亚洲天堂另类美腿| 高清在线偷拍自拍视频| 99热超碰| 狠狠躁日日躁夜夜躁A| 色原狠狠天天天| 黄骗免费网站| 狠狠色狠狠色狠狠五月| 婷婷综合网| 75大香蕉| 91热| jizz啪啪| 亚洲成人久久美女| 国产乱弄免费在线视频。| 校园春色家庭伦理欧美激情| 91久久婷婷| 人妻 丝袜美腿 中文字幕| 亚洲男人bt天堂| 成人一区二区三区四区| 久久久久国色αv免费观看| 五月丁香六月综合缴清无码| 国产激情综合| 日韩图区| 九九碰九九爱97超| ?亚洲伊人伊成久久人综合网| 91网站18在线观看| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 少妇精品久久| 亚洲中文字母在线播放| 久久人人爽爽爽人久久久| 九九九国产精品| 亚洲第一精品在线视频| 麻豆天美国美国产AV| 91久久久久久久| 尹人免费观看视频在线| 玖玖视频在线资源一区二区三区| 加勒比伊人影院| 美国日韩黄片| 97久久精品亚洲| 国产精品农村妇女精品| 岛国视频一二三区| 校园春色亚洲欧洲| 少妇久久久| 国产激情久久久| 少妇特黄一区二区三区| 男女性感激情网站| 爽爽爽免费视频| 亚洲九九九| 2020中文字幕| 超碰人妻久久| 1024香蕉视频| 久久粉色| 婷婷五月天伊人| 上床啊啊啊| 国产亚洲色婷婷久久99精品91| 成人久久久精品| 成人性爱av.com| 欧洲乱码视频| AV一区观看| 欧亚第一综合网| 在线播放成人高清免费视频| 欧美亚洲激情小说| 国产区日韩区在线观看| 大香蕉AV丝袜| 熟女探花啪啪| 另类亚洲图色| 女人与公拘交酡2020视频| 观看视频图片一区二区三区| 香蕉国产精品麻豆亚洲欧美日韩| 亚洲男人天堂网久久| 日韩欧无码一区二区三区免费不卡 | 日本影视久久免费| 九九九久千久久激情蜜桃在线看| 操逼操2| 97中文字幕色| 亚洲蜜乳av| 久久久少妇诱惑精品视频| 性爱乱伦一区| 国产白丝网站| 性站 | 绯色一区二区三区不卡少妇| 欧美天天谢综合网| 曰韩操B| 久久视频,这里只有精品 | 美女操逼A A| 日日干男人的天堂| 人妻中文字幕日韩电影| 久区视频| 精品久久青青草| 欧美人人曰人人操人人射射| AV中文字幕剧情1区2区3| www网站黄| 男人天堂资源| 佐山爱中文字幕| 欧美顶级黄色大片免费| 色网亚洲人| 国产欧美一区二区| 国产欧美一级在线观看| 一本大道久| 东北夫妻性偷拍| 欧美天天干| 欧美情色亚洲| 久久曰曰| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 男人的天堂va在线| 欧美在线啊啊啊 | 色久桃花影院在线观看| 91精品久久久久| 天天日日本| 美女被艹尤物视频| 97色碰| 久久人妻无码毛片A片麻豆| 日本狠狠干| 欧美一区二区三区四区综合| 啊啊在线| 久久久穴999| 久久久久久久人妻| 亚洲一区二区三区不卡国产欧美| 久操免费电影| 麻豆激情综合| 午夜精品久久久久久久男人的天堂 | 日韩人妻无码不卡网站| 日本 免费 一区二区三区 久久香蕉 | 91深夜夜| 手机在线大香蕉| 欧美精品三区| 久久欧美按摩999| 一级啊性爱在线视频| 亚洲av噜噜噜噜噜噜| 日韩欧美蜜桃精品久久中文字幕久久| 久久99黄色卞西瓜| 亚洲欧美日韩夜夜| 国产一区二区三区久久久精品| 成人青青草原伊人| 热热色色综合| 九热大香蕉| 操久久久久久| 爱做久久久久久| 国产成人精品必看| 国产精品自拍视频| 青草精品视频一日本久久久久网站| 欧美视频第二页| 一色网男人的天堂| 婷婷色导航| 亚洲97久久精品亚洲| 台湾一区国产高清在线| 好爽视频在线观看视频| 偷拍新久久| 老司机午夜精品福利视频一区二区| 国模少妇一区二区三区| 强奸a片网| 久久三区四区| 亚州色交| wwwxxx日本爽| 天天干人妻视频| 欧美三级一级| 一类av片在线看| 2019男人的天堂| 亚洲综合另类| 久久欲| 超碰97人人乐| 精品人妻一区二区三区-国产| 日本一区二区三区午夜观看| 亚洲精品不卡一二三区| 欧美制服网站美腿丝袜| 自慰白浆在线观看| 久久av成人无码免费| 美女视频尤物网在线看| 在线免费观看高清无码视频| 欧美色另类| 青青草国产欧美非洲黑人| 美女AV一区二区| 欧美嫩性色| 蜜乳av首页| 日本操逼视频导航| 一级一性爱免费视频| 日本精品加勒比海一区| 青草园大香蕉| 日韩电影天堂视频一区二区| 亚洲天堂性爱| 四虎AV在线观看| 密臀在线免费观看| 在线观看精品国产免费| 蜜臀久久99精品久久久久久婷婷| 性交一区二区在线播放| 成人精品电影| 日本亚洲vr欧美不卡高清专区| 国产精品久久久三级无码| 欧美黄片免费在线观看视频| 蜜臀99久久| 亚洲一区二区在线观看91| 日本一线产区和二线产区伦理片| 欧亚日韩三区| 久久精品老司| 清纯唯美激情四射| 蜜桃传媒一区二区亚洲| 国产成人亚洲精品自产在线 | 久久性生大片免费观看性| 欧洲与亚洲欧美精品中文字幕| 97视频在线观看网站| 中文字幕国产精品1区| 九九人人操| 91oumei| 2000亚洲男人天堂| 9久久久久| 在线一道啪| 亚洲亚洲亚洲天堂天堂| 国产精品黄色三级av| 欧美天天综合网| 国产激情视频一区区三区| 欧美精品99久久久**| 色婷婷六月| 亚欧美综合网。| 91中文字幕| 成人在线视频网| 日韩精品大香蕉伊人在线| 老女人综合网| 一级黄色影片| 亚洲综合草草| 久久国内| 97视频900| 日韩精品在线放| 天天综合,91综合永久| 午夜AV污污污| 中国91AV| 日本最新1区2区3区| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 999久久久九| 天天狠| 国产综合久久久鬼色| 日韩大香蕉精品在线视频| 久久爱97| 日韩成人精品视频自拍| 亚洲一区二区三区AV无码| 91色情黑丝搞鸡在线观看一区二区三区三州| 丁香五月天激情综合| 亚洲 图片 欧美 色图| 欧美淫乱视频| 97人人夜夜精品视频| 美国一区二区免费视频| 嗯~啊~快点 死我视频| 啊啊啊好疼| 91丨九色丨国产丨人妻在线| 色五月首页| 大干人妻| 日本一级二级三级网站| 激情文学网伊人| 97综合在线| 韩国午夜理伦三级好看| 国产亚洲日本精品在线| 中文字幕大片三级狠狠干| 九一性生活免费视频| 大地资源在线观看中文第二页| 天躁夜夜躁2021| 欧美少妇性乱| 亚洲av噜噜噜噜噜噜| 男女一级A片大黄,一进一出| 白丝少妇一区二区| 91处女在线观看| 91操碰| 久久精品高清无码一区| 91丨豆花丨熟女| 日韩精品三区四区| 日韩97P| 色五月婷婷麻豆在| 黑人精品欧美一区二区蜜桃| 美女尤物人人操| 精品999日本| 日韩熟女操逼| 婷婷国产精品九区| 亚洲男人天堂网| 亚洲宅男天堂| 日日躁夜夜躁狠狠躁超爽| av天堂5| 亚洲国产精品久久久久婷婷老年| 亚洲国产婷婷在线播放| 91成人国产综合久久精品蜜月| 色欧美亚洲| 天综合网| 极品销魂美女一区二区 | 日韩性爱小视频| 天堂蜜桃无码视频一区二区| 久草看看看| 婷婷五月天影院| 欧美劲爆第一页| 婷婷尹人大香蕉免费| 成人一二三区| 国产九月婷婷| 欧美色网| 内射黑人| 超碰无码加勒比| 精品乱码久久久久| 亚欧无码在线| 曰本特级特黄特色黄色A级网站高清在线免费看| 黄色一区二区秘书性感| 亚洲人人夜夜澡人人爽| 人妻精品一区二区在线| 色婷婷日韩精品一区二区三区| 欧美刺激色黄片免费看| 校园春色 亚洲| 精品久久視頻在线| 亚洲精品三| 精品美女少妇一区二区| 中文字幕五区| 97超碰人人操人人操| 最新av在线| 日本国产欧美高清在线| 3级毛片一二| 操人妻少妇中文 | 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 99色在线| 网站A V在线| 伊人网在线视频| 久久久夜夜嗨免费视频| 天啪| 色大香蕉97N| 中文自拍欧美影视| 诱惑网综合| 91挑色欧美| 欧美顶级黄片AAAAA在线免费看| 丰满人妻一区二区三区四区| 亚洲不卡不卡中文字幕不卡| 激情五月天插| 99色热| 影音综合网| 人人干人人操人人..com| 久热最新在线杭州| 97超碰逼| 六月丁香婷| www.久久制服糖| 疯操AV| 亭亭丁香激情| 欧美疯狂做爰xxxx| 国语对白露脸XXXXXX| 综合激情一一91| 九九视品黄色| 一,爱啪啪,在线免费视频| 超碰2017| 久久久内射良家| 蜜色网色哟哟| 日本123区操B视频| 浓厚中出中文字幕在线| 91日产桃蜜| 97色涩| 美女刺激久久国产欧美| 在线视频免费播放一区| 好吊色综合| 国内成人圈中文字幕无码视频| 久操99| 国产免费久久久久| 天堂俺去俺来也www久久婷婷| 亚洲a色| nuu12国产麻豆精品| 色九九九| 丁香五月天社区| 91社操逼| 国产日韩精品suv| 果冻传媒A片麻豆熟妇人妻| 欧美伦乱爱| 伊人大香蕉在线| 国产伦精品一区二区三区在线观| 中文字幕人成乱码熟女香港| 久久久偷拍| 日韩有码回春沙龙第一页| 国产精品suv一区| 亚洲天堂东京热| 一起草av| 女人双腿搬开让男人桶| 亚洲国产一区二区入口| 国产精品美女久久久久久网站| 色欲久久99精品久久| 99热这里只有是精品10| 骚乳在线| 丝袜六区| 日本大片日本一区二区免费高清| 熟女突然公开看18禁影片| 亚洲欧洲综合成人av一区| 84YTCOM性无码| 欧美色网| 97爱亚洲| 欧美日韩传媒| 久久粉色| 嫩呦国产一区二区三区AV| 97欧美超碰| 91丝袜在线播放| 青青草一区二区高清无码视频| 破处bbq| www被窝色com| 亚洲AV不卡在线观看尤物| 亚洲天堂自拍| 97超碰香蕉| 亚洲国产精品无石码久久| JuliaAnnXXX888| 久久9精品| 青草一区二区| 狠狠超| 搡老女人老熟女91| 日本精品999| 9久在线视频只有精品| 亚洲中文字幕在现观看| 成人一二| 青青青国产手线观看视频2| 性爱网站一区二区| 97资源视频| 欧美一级国产一级| 新婚人妻扶着粗大强行坐下| 亚洲无码一区二区三区三州| 最新国产亚洲精品精品国产亚洲综合| 日韩,欧美,中文在线| 新版天堂中文资源8在线| 大香蕉乱伦视频网| 男人天堂一区二区| 神马福利久草| 综合 青草 伊久久 影院 综合| 中文字幕97色| 中国熟女91| 大逼色网站| 新亚洲无码| 人妻啪| 日亚韩精品视频二区三| 九九色婷婷| 中文字幕91综合| 丁香婷婷激情五月天无毒不卡| 操淫穴亚洲五月丁香 | 欧美青青草视频| 欧美三级偷拍| 乱欲视频| 中文字幕一区电影在线观看| 天天躁日日躁XXXXYY| 日韩有码一区三区| 大香蕉中文aV在线| 四虎影视永久在线观看精品免费网站| 国产丁香精品露脸视频 | 极品一区二区三区免费| 97伊人| 九九精品无码专区免费| 国语av最新自产拍在线观看| 激情六月天| 久久久久久久国产| 校园春色 亚洲| 国产肏逼网站| 亚洲精品国产精品乱码不99| 国产欧美伊人| 毛片麻豆91糖心精品毛情片| 激情欧美97|