WeChat에서 맞춤형 개인 메뉴를 구현하는 방법은 다음과 같습니다.
1. 글로벌 설명 <br /> 자세한 설명은 처음 두 기사를 참조하십시오.
2.이 기사에 대한 설명 <br />이 기사는 다섯 부분으로 나뉩니다.
* 공구 클래스 AccessTokenUtils의 캡슐화
* 사용자 정의 메뉴 및 개인화 된 메뉴 문서의 읽기 및 분석
* 메뉴 JSON을위한 해당 콩의 분석 및 구성
* 사용자 지정 메뉴 구현
* 개인화 된 메뉴 구현 WeChat 사용자 정의 메뉴 모든 유형의 메뉴가 제공됩니다. 이 기사의 끝 에서이 기사의 첫 4 개 기사를 포함한 모든 데모 소스 코드가 제공됩니다.
도구 클래스 accesstokenutils의 캡슐화
위의 기사는 AccessTokens의 취득 및 타이밍 저축에 대해 자세히 소개되었습니다. 여기서는 포장 된 AccessTokenUtils가 직접 제공됩니다. 구현 원칙과 문서 읽기는 제공되지 않습니다.
accesstokenutils.java
package com.gist.utils; import java.io.file; import java.io.fileInputStream; import java.io.fileoutputStream; import java.io.ioException; import java.io.inputStreamReader; import java.net.url; import javax.net.ssl.ssl.ssl.ssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.sssl.ssl.sslconnection; com.gist.bean.access_token; import com.google.gson.gson;/** * @author gao yuan </n> 이메일 : [email protected] </n> 블로그 http://blog.csdn.net/wgyscsf </n> * 작성 기간 2016-4-7 5:44:33 PM */public access an accept {/plubly access el anruce and ablog.csdn.net/wgyscsf </n> 정적 최종 Long Max_Time = 7200 * 1000; // WeChat은 최대 Access_Token 유효성 시간 (MS) 개인 정적 최종 문자열 태그 = "WeixinApitest"; // 태그 개인 정적 최종 문자열 appid = "wx889b020b366666b0b8"; "6DA7676BF394F0A9F15FBF06027856BB"; // key/ * *이 메소드는 Access_Token을 구현하고, 저장 및 2 시간 동안 만 저장합니다. 2 시간을 초과하면 다시 접수하십시오. 2 시간을 초과하지 않으면 직접 얻으십시오. 이 메소드는 *: public static string getAccessToken ()에 따라 다릅니다. * * 아이디어 : 획득 한 Access_Token과 현재 시간을 파일에 저장하십시오. * 추출 할 때 현재 시간과 스토리지에 기록 된 시간 간의 시차를 결정하십시오. Max_Time보다 큰 경우 다시 접수하고 원래 컨텐츠*를 교체하기 위해 파일에 획득 한 액세스를 저장하고 max_time보다 적은 경우 직접 얻으십시오. */ // 예외를 던지지 않고 전화하기 위해 모든 예외가 여기에 포착됩니다. 코드는 약간 길다. public static string getAvedAccess_token () {gson gson = new gson (); // 타사 jar, json 및 beans의 변환을 처리해야합니다. fileoutputStream fos = null; // output stream fileInputStream fis = null; // 입력 스트림 파일 = 새 파일 ( "temp_access_token.temp"); // access_token save {// 파일이 존재하지 않으면 if (! file.exists ()) {file.createnewfile (); }} catch (예외 e1) {e1.printstacktrace (); } // 파일 크기가 0이면 처음 사용하면 Access_Token을 저장한다는 것을 의미합니다. if (file.length () == 0) {try {maccess_token = getAccessToken (); // get accesstoken ac at.setaccess_token (maccess_token); at.setexpires_in (System.currentTimeMillis () + ""); // 보증금 시간을 설정하십시오. json = gson.tojson (at); fos = new fileoutputStream (file, false); // adpend fos.write ((json) .getBytes ()); // accessToken과 현재 시간을 파일 fos.close ()에 저장합니다. MacCess_token을 반환합니다. } catch (예외 e) {e.printstacktrace (); }} else {// 파일 내용 읽기 BYTE [] b = new Byte [2048]; int len = 0; try {fis = new FileInputStream (파일); len = fis.read (b); } catch (ioexception e1) {// todo 자동 생성 캐치 블록 e1.printstacktrace (); } 문자열 mjsonAccess_token = new String (b, 0, len); // 읽기 파일의 내용 access_token access_token = gson.fromjson (mjsonaccess_token, new Access_token (). getClass ()); if (access_token.getexpires_in ()! = null) {long savetime = long.parselong (access_token.getexpires_in ()); Long Nowtime = System.CurrentTimeMillis (); Long Remiantime = Nowtime -Savetime; // system.out.println (tag + "시차 :" + remiantime + "ms"); if (remiantime <max_time) {access_token at = gson.fromjson (mjsonaccess_token, new access_token (). getClass ()); maccess_token = at.getAccess_token (); MacCess_token을 반환합니다. } else {maccess_token = getAccessToken (); Access_token at = new Access_token (); at.setaccess_token (maccess_token); at.setexpires_in (System.CurrentTimeMillis () + ""); 문자열 json = gson.tojson (at); try {fos = new FileOutputStream (file, false); // append fos.write ((json) .getBytes ()); fos.close (); } catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } return maccess_token; }} else {return null; }} return maccess_token; } / * * weChat 서버 액세스 권한을 얻습니다. 이 부분은 getAccess_token ()과 일치하며 주석이 추가되지 않습니다. 문자열 reslut = null; try {url requrl = new URL (urlstring); httpsurlconnection httpsconn = (httpsurlconnection) requrl .openconnection (); inputStreamReader isr = new inputStreamReader (httpsConn.getInputStream ()); char [] chars = new char [1024]; reslut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut += new String (chars, 0, len); } isr.close (); } catch (ioexception e) {e.printstacktrace (); } gson gson = new gson (); access_token access_token = gson.fromjson (reslut, new Access_token (). getClass ()); if (access_token.getAccess_token ()! = null) {return access_token.getAccess_token (); } else {return null; }}}
사용자 정의 메뉴 및 개인화 된 메뉴 문서의 읽기 및 분석
• 사용자 정의 메뉴
◦ 메뉴 인터페이스를 만듭니다
◦ Custom 메뉴 쿼리 인터페이스
◦ Custom 메뉴 삭제 인터페이스
◦ Custom 메뉴 이벤트 푸시
◦ 개인화 된 메뉴 인터페이스
◦ 공식 계정의 메뉴 구성을 얻습니다
• 문서 주소 : http://mp.weixin.qq.com/wiki/0234e39a2025342c17a7d23595c6b40a.html
• 공식 웹 사이트 문서는 다음과 같은 설명을 제공합니다.
* 사용자 정의 메뉴 인터페이스는 다음과 같이 다양한 유형의 버튼을 구현할 수 있습니다. 1. 클릭 : 이벤트를 클릭하십시오 ...; 2.보기 : 점프 이벤트 ...; 3 .... (사용자 정의 메뉴 정보)
* 인터페이스 통화 요청 설명 http 요청 방법 : post (https 프로토콜을 사용하십시오) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token (사용자 정의 메뉴 소개)
* 클릭 및 뷰 요청 예제 { "버튼": [...]} (사용자 정의 메뉴 정보)
* 매개 변수 설명 ... (사용자 지정 메뉴 정보)
* 개인화 된 메뉴 작성 http 요청 방법 : Post (https 프로토콜 사용) https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=access_token (개인화 된 메뉴)
* 요청 예 : { "버튼": [...], "matchrule": {...}} (개인화 된 메뉴 정보)
* 매개 변수 설명 ... (개인화 된 메뉴 정보)
* 개발자는 사용자가 다음 조건을 통해 보는 메뉴를 설정할 수 있습니다 (개인화 된 메뉴 정보).
1. 사용자 그룹화 (사용자 그룹화의 도움으로 개발자의 비즈니스 요구를 완료 할 수 있습니다)
2. 성별
3. 휴대 전화 운영 체제
4. 지역 (WeChat 클라이언트의 사용자가 설정 한 지역)
5. 언어 (WeChat 클라이언트의 사용자가 설정 한 언어)
•이해하다:
◦ 다시 친숙한 게시물 요청이지만 전화에 대한 모호한 단어를 잘 이해하지 못합니다. 이전 기사에서 얻은 매개 변수 "access_token = access_token"을 사용해야한다는 것을 알고 있습니다. WeChat 문서의 요청 주소를 우리가 얻은 access_token으로 변경하고 URL을 방문하면 "{"errcode ": 44002,"errmsg ":"빈 게시물 데이터 힌트 : [gdveda0984vr23] "}을 보게됩니다. 아마도 빈 사후 요청 데이터를 의미 할 것입니다. 따라서 Post Request 형식을 통해 매개 변수를 WeChat 서버로 전달해야하며 매개 변수 형식은 아래에 다음과 같습니다. { "버튼": […]}이 형식으로 WeChat 서버로 매개 변수를 전달해야합니다.
◦ 매개 변수 설명과 관련하여 사용자 정의 메뉴 작성에는 7 개의 매개 변수가 있음을 알 수 있습니다. 개인화 된 메뉴 인터페이스 의이 7 가지 매개 변수 외에도 8 개의 매개 변수가 있습니다. 문서 의이 부분을 간단히 살펴보면이 8 개의 매개 변수가 개인화 된 메뉴의 일치 및 필터링에 사용된다는 것을 이해할 수 있습니다.
◦ 포스트 요청을 통해이 JSON 데이터 문자열을 WeChat 서버로 보내려면 WeChat 문서의 요구 사항에 따라 JSON을 구성해야하며 JSON에는 우리가 만든 다양한 유형의 버튼 이벤트가 포함되어 있습니다.
메뉴 JSON을위한 해당 콩의 분석 및 구성
사용자 정의 메뉴 JSON 분석 (개인화 된 메뉴 제외). 다음 코드는 WeChat 문서에서 제공 한 예입니다.
클릭 및보기 요청의 예
{ "button": [{ "type": "click", "name": "오늘의 노래", "키": "v1001_today_music"}, { "name": "menu", "sub_button": [{ "type": "view", "name": "search", "url": "http:///www.so.soso.soso.soso.soso.soso.soso.soso.soso. "type": "view", "name": "비디오", "URL": "http://v.qq.com/"}, { "type": "click", "name": "like us", "key": "v1001_good"}}}}. 분석 후이 JSON 데이터 문자열은 ""버튼 ": [{……}, {…}]", "[{…}, {{"name ":"sub_button ": [{}, {}]}]", "{type": "name", "vide" "url": "..."}, {}, {}, {} ".
그러나 실제로 볼 수있는 WeChat 메뉴를 기억할 수 있다면 이해하기가 더 쉬울 것입니다. 레벨 1 : 메뉴 (한 메뉴), 낮은 1 ~ 3 개의 부모 버튼; 레벨 2 : 부모 버튼 (1 ~ 3 개의 부모 버튼), 하위 1 ~ 5 개의 자식 버튼; 레벨 3 : 자식 버튼 (1 ~ 5 개의 자식 버튼).
이제 우리는 JSON과 우리가 이해하는 "메뉴"가 하나씩 일치 할 수 있음을 알 수 있습니다. 초점은 이제 각 레벨의 "레벨 이름"을 확인하는 방법이며, 이는 Java의 해당 Javabean 객체입니다.
동시에, 첫 번째 레벨 메뉴 아래에 여러 개의 상위 버튼이 있기 때문에 <부모 메뉴> 목록 형식입니다. 상위 버튼 아래에 여러 개의 하위 메뉴가있을 수 있으며, 이는 <submenu> 목록이기도합니다. 그러나 부모 버튼은 별도의 응답 버튼 일 수도 있습니다. 별도의 부모 버튼 객체입니다. 서브 버튼은 별도의 서브 버튼 객체입니다.
사용자 정의 메뉴에 대한 매개 변수 설명을 살펴보면 버튼이 첫 번째 수준 버튼 ( "버튼") 및 두 번째 레벨 버튼 ( "sub_button")으로 나뉘어 있음을 알 수 있습니다. 메뉴 응답 유형 ( "type"), 메뉴 제목 ( "이름"), 클릭 유형 매개 변수 ( "키"), 유형 매개 변수보기 ( "URL"), media_id 유형 및 View_Limited 유형 매개 변수 ( "media_id")와 같은 몇 가지 공통 데이터 유형도 있습니다.
• 데이터 추상화 (세터 없음, getter 작성) :
// 버튼 기본 클래스 공개 클래스 BaseButton {개인 문자열 유형; 개인 문자열 이름; 개인 문자열 키; 개인 문자열 URL; private String media_id;} // 하위 버튼 공개 클래스 Sonbutton은 BaseButton {private string sub_button;} // 부모 버튼 공개 클래스 아버지 버튼 {private string button; // 아마도 부모 버튼이 @serializedname ( "sub_button")에 직접 응답 할 수 있습니다. List <Sonbutton> Sonbuttons; // 여러 subbuttons} public class menu {@serializedname ( "button") private list <아버지 부트 턴> 아버지 부트 턴;}가있을 수 있습니다.위의 것은 완전한 사용자 정의 메뉴의 분석과 해당 Javabean의 구성입니다.
개인화 된 메뉴의 경우이 섹션의 문서를 보면 사용자 정의 메뉴와 거의 동일하며 여러 "구성"JSONS만이 다음과 같습니다. 형식은 다음과 같습니다. { "버튼": […], "matchrule": {…}}.
우리는 JSON과 "버튼"의 "일치"가 동일한 수준이며 분석 및 구현은 기본적으로 위와 동일하며 Javabean의 구현이 직접 제공됩니다.
// 일치하는 JSON Public Class Matchrule의 JSON에 해당하는 JSON {private String Group_ID; 개인 문자열 섹스; 개인 문자열 Client_Platform_type; 개인 문자열 국가; 개인 문자열 지방; 개인 문자열 도시; 개인 문자열 언어;} // modify menu.javapublic 클래스 메뉴 {@serializedname ( "button") Afrisebutton; Private Button; 사용자 정의 메뉴 구현
작업, 우리는 모든 wechat 버튼 응답 유형을 구현합니다.
작업 ( "M-0"은 상위 버튼을 의미합니다. "MN"은 MTH 부모 버튼, N 번째 자식 버튼 (M, N ≠ 0)을 의미합니다. 1-0 : 이름 : 클릭, 응답 이벤트 : 클릭 푸시 이벤트를 클릭하십시오. 2-0 : 이름 : 부모 버튼 2. 2-1 : 이름 :보기, 응답 이벤트 : 웹 페이지로 점프; 2-2 : 이름 : Scancode_push, 응답 이벤트 : Scancode_waitmsg, 응답 이벤트 : Scancode_waitmsg, 응답 이벤트 : Scancode 푸시 이벤트 및 "메시지 수신"프롬프트 상자가 팝업됩니다. 2-4 : 이름 : PIC_SYSPHOTO, 응답 이벤트 : 사진을 팝업하여 사진을 찍고 사진을 게시하십시오. 2-5 : 이름 : PIC_PHOTO_OR_ALBUM, 응답 이벤트 : 팝업 및 사진을 찍거나 앨범에 사진을 게시하십시오. 3-0 : 이름 : 부모 버튼 3. 3-1 : 이름 : PIC_WEIXIN, 응답 이벤트 : 팝업 WeChat 앨범 발신자; 3-2 : 이름 : location_select, 응답 이벤트 : 팝업 지리적 위치 선택기; 3-3 : 이름 : media_id, 응답 이벤트 : 배달 메시지 (문자 메시지 제외); 3-4 : 이름 : View_Limited, 응답 이벤트 : 그래픽 메시지 URL을 점프하십시오.
소스 코드 구현 (첫 번째 부분에서 참조 AccessTokenUtils.java : 공구 클래스 AccessTokenUtils의 캡슐화)
/ * * 사용자 정의 메뉴를 만듭니다. */@test public void createcommmenu () {String access_token = accesstokenutils.getAccessToken (); // get ac access_token; try {// URL URL url requrl을 만듭니다. new URL (urlstring); // 링크 가져 오기 httpsurlConnection httpsconn = (httpsurlConnection) requrl .openConnection (); httpsconn.setdooutput (true); // 응답 내용을 읽기 위해 연결의 출력 스트림을 가져옵니다. outputStreamWriter OSR = new OutputStreamWriter (httpsConn.getOutputStream ()); osr.write (getMenujson ()); //이 클래스의 외부 메소드를 사용하여 getMenujson () osr.close (); // 결과 inputStreamReader isr = new inputStreamReader (httpsConn.getInputStream ()); // 서버의 응답 내용을 읽고 표시 char [] char = new char [1024]; 문자열 reslut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut += new String (chars, 0, len); } system.out.println ( "반환 결과 :" + reslut); isr.close (); } catch (ioexception e) {e.printstacktrace (); } } public String getMenuJson() { Gson gson = new Gson();// json processing tool Menu menu = new Menu();// Menu class List<FatherButton> fatherButtons = new ArrayList<FatherButton>();// Parent button collection in the menu// ------------ // Parent button1 FatherButton fb1 = new FatherButton(); fb1.setName ( "클릭"); fb1.settype ( "클릭"); fb1.setkey ( "10"); // -------------------- // 부모 Button2 Acternbutton fb2 = New Acterbutton (); fb2.setName ( "부모 버튼 2"); 목록 <Sonbutton> sonbuttons2 = new ArrayList <Sonbutton> (); // 어린이 버튼 모음 // SubButton 2-1 Sonbutton SB21 = New Sonbutton (); sb21.setName ( "보기"); sb21.seturl ( "http://www.baidu.com"); sb21.settype ( "보기"); // SubButton 2-2 Sonbutton SB22 = New Sonbutton (); sb22.setname ( "scancode_push"); sb22.settype ( "scancode_push"); sb22.setkey ( "22"); // SubButton 2-3 Sonbutton SB23 = New Sonbutton (); sb23.setname ( "scancode_waitmsg"); sb23.settype ( "scancode_waitmsg"); sb23.setkey ( "23"); // SubButton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setname ( "pic_sysphoto"); sb24.settype ( "pic_sysphoto"); sb24.setkey ( "24"); // SubButton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setname ( "pic_sysphoto"); sb24.settype ( "pic_sysphoto"); sb24.setkey ( "24"); // SubButton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setname ( "pic_sysphoto"); sb24.setkey ( "24"); // SubButton 2-5 Sonbutton SB25 = New Sonbutton (); sb25.setname ( "pic_photo_or_album"); sb25.settype ( "pic_photo_or_album"); SB25. 세트 키 ( "25"); // 자식에 자식 버튼 추가 버튼 세트 SONBUTTONS2.ADD (SB21); sonbuttons2.add (sb22); sonbuttons2.add (sb23); sonbuttons2.add (sb24); sonbuttons2.add (sb25); // 어린이 버튼을 2-0 부모 버튼 설정 FB2.SetsonButtons (Sonbuttons2); // -------------------- // 부모 버튼 3 Acternbutton fb3 = New Acterbutton (); fb3.setName ( "presidy button3"); List <Sonbutton> sonbuttons3 = New ArrayList <Sonbutton> (); // SubButton 3-1 Sonbutton SB31 = New Sonbutton (); sb31.setname ( "pic_weixin"); sb31.settype ( "pic_weixin"); SB31. 세트 키 ( "31"); // SubButton 3-2 Sonbutton SB32 = New Sonbutton (); sb32.setName ( "locatSelect"); sb32.settype ( "location_select"); sb32.setkey ( "32"); // // subbutton 3-3 ---> Media_id가 필요하므로 테스트 할 수 없습니다. 이를 위해서는 자료 ID를 호출해야합니다. // Sonbutton SB33 = New Sonbutton (); // sb33.setName ( "media_id"); // sb33.settype ( "media_id"); // sb33.setmedia_id ( "???"); // // subbutton 3-4-> media_id가 필요하므로 테스트 할 수 없습니다. 이를 위해서는 자료 ID를 호출해야합니다. // Sonbutton SB34 = New Sonbutton (); // sb34.setName ( "View_Limited"); // sb34.settype ( "view_limited"); // sb34.setmedia_id ( "???"); // 어린이 버튼에 자식 버튼 추가 큐 SONBUTTONS3.ADD (SB31); sonbuttons3.add (sb32); // sonbuttons3.add (sb33); // sonbuttons3.add (sb34); // 어린이 버튼을 3-0 부모 버튼 큐 fb3.setsonbuttons (sonbuttons3)에 넣습니다. // ----------------------- // 부모 버튼을 부모 버튼에 추가하여 atpricebuttons.add (fb1); 아버지 비트 톤 .add (fb2); 아버지 비트 톤 .add (fb3); // 메뉴 막대 메뉴에 부모 버튼 큐를 추가합니다. 문자열 json = gson.tojson (메뉴); System.out.println (JSON); // 출력 테스트 JSON; } 개인화 된 메뉴 구현
• 작업 : 성별에 따라 다른 버튼을 표시합니다 (성별, 지역, 모바일 운영 체제 등으로 그룹화 할 수 있습니다).
• 코드 1을 수정합니다. 다른 WeChat 배경에 의해 구현되므로 인터페이스가 다릅니다. 그러나 여전히 사후 요청입니다. 코드를 변경할 필요가 없습니다. 원래 Urlstring을 교체하십시오.
// 스 플라이 싱 API 문자열 urlstring = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=" + access_token;
• 코드 2를 수정하십시오. 단지를 만들고 일치하는 규칙을 설정 한 다음 메뉴에 Matchrule을 추가하여 일치하는 규칙을 완료하십시오.
// ----- // 여기에서 개인화 된 메뉴 설정을 시작하여 matchrule matchrule = new matchrule (); matchrule.setsex ( "2"); // boys menu.setmatchrule (matchrule); // ---
소스 코드 다운로드 : http://xiazai.vevb.com/201606/yuanma/weixinapi(Vevb.com).rar
이 기사는 "Android WeChat Development Tutorial Summary"로 편집되었으며 "Java WeChat Development Tutorial Summary"는 모두가 배우고 읽을 수 있도록 환영합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.