이 기사는 WeChat 공개 계정용 사용자 정의 메뉴 개발 경험 요약을 공유합니다
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。 自定义菜单操作流程其实很简单 ,就是执行一段Java程序 将你公众账号的appid和封装的菜单发送到腾讯服务器,腾讯服务器会根据你请求参数appid和封装的菜单添加到对应的公众账号,一定要罗嗦一句, 在Java 程序中执行一次 main 方法就可以,下次修改重新执行,不过会有缓存,取消重新关注就可以了。 1 新建按钮基类 public class Button { //按钮名称 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 2,根据业务需求新建不同的按钮类 /** * view类型的按钮 点击跳转链接 * */ public class ViewButton extends Button { private String type; private String url; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
/**
* 클릭형 버튼은 입력형 = '버튼'과 유사하게 캡쳐된 키를 기준으로 해당 업무를 처리합니다.*/
public class ClickButton은 Button을 확장합니다 {
비공개 문자열 유형;
비공개 문자열 키;
공개 문자열 getType() {
반환 유형;
}
공개 무효 setType(문자열 유형) {
this.type = 유형;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
3 유형과 일치하는 버튼을 만들려면 직설적으로 기본 메뉴 컨테이너
/**
* 복합형 버튼
*
*/
public class ComplexButton extends Button {
private Button[] sub_button ; public Button[] getSub_button() { return sub_button; } public void setSub_button(Button[] sub_button) {this.sub_button = sub_button; }}4 3개의 메인 메뉴를 담는 메뉴 클래스 생성 /* * * 메뉴 */공개 클래스 메뉴 { 비공개 버튼[] 버튼; 공개 버튼[] getButton() { 복귀 버튼 ; } public void setButton(Button[] 버튼) { this.button = 버튼; }} 5 Tencent 인터페이스 /** * 상품권 * */공개 클래스를 호출하기 위한 기본 메소드 실행을 준비하기 위해 호출 자격 증명 클래스 토큰을 생성합니다. 토큰 { //인터페이스 액세스 자격 증명 private String accessToken; // 자격 증명 유효 기간, 단위: 초 private intexpiresIn; public String getAccessToken( ) { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } public int getExpiresIn() { returnexpiresIn; } public void setExpiresIn(intexpiresIn) { this .expiresIn =expiresIn; }}다음 코드에서는 클래스만 설명합니다. 특정 코드 기능에 대한 설명을 참조하세요. 6 Tencent 인터페이스 호출 준비 (1) 공통 도구 클래스 생성/** * 일반 도구 * */public class CommonUtil { private static Logger log = LoggerFactory.getLogger(CommonUtil.class); /** * 인터페이스 액세스 자격 증명 가져오기 * * @param appid 자격 증명 * @param appsecret key * @return */ public static Token getToken(String appid, String appsecret ) { // 자격증명 취득(GET) String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET "; 토큰 토큰 = null; String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret); // 자격 증명을 얻기 위해 GET 요청 시작 JSONObject jsonObject = httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try {
토큰 = 새 토큰(); token.setAccessToken(jsonObject.getString("access_token")); token.setExpiresIn(jsonObject.getInt("expires_in") ); } catch (JSONException e) { // 토큰 획득 실패 토큰 = null; } } 토큰 반환; } /** * https 요청 보내기 * * @param requestUrl 요청 주소 * @param requestMethod 요청 메소드(GET, POST) * @param outputStr 제출된 데이터 * @return JSONObject (JSONObject.get(key)를 통해 json 객체의 속성 값을 가져옴) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr ) { JSONObject jsonObject = null; try { // SSLContext 객체를 생성하고 지정한 신뢰 관리자로 초기화합니다. TrustManager[ ] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security .SecureRandom( )); // 위의 SSLContext 객체에서 SSLSocketFactory 객체를 가져옵니다. SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = 새 URL( requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput (true);
conn.setUseCaches(false);
// 요청 방법 설정(GET/POST)
conn.setRequestMethod(requestMethod);
// outputStr이 null이 아닌 경우 출력 스트림에 데이터 쓰기
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 인코딩 형식에 주의하세요
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 입력 스트림에서 반환된 콘텐츠를 읽습니다.
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8") ;
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer 버퍼 = new StringBuffer();
while (( str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 리소스 해제
bufferedReader .close() ;
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect() ;
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("연결 시간 초과: {}" , ce);
} catch(예외 e) {
log.error("https 요청 예외: {}", e);
}
return jsonObject ;
}
}
(2) 신뢰 관리자 생성
package com.test.util;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* 신뢰관리자
*
*/
public class MyX509TrustManager Implements > }
// 서버측 인증서 확인
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 신뢰할 수 있는 X509 인증서 배열을 반환합니다
public 7 위 작업을 완료한 후 사용자 정의 메뉴를 생성할 수 있습니다. 사용자 정의 메뉴 관리 클래스를 만듭니다. appId 및 appSecret을 할당하고 기본 메서드를 실행합니다.
패키지 com.test.menu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
net.sf를 가져옵니다. json.JSONObject;
import com.test.bean.Button;
import com.test.bean.ComplexButton;
import com.test.bean.Menu;
import com.test.bean.Token;
import com.test.bean.ViewButton;
import com.test.util.CommonUtil;
/**
* 메뉴 매니저 클래스
*
*/
공용 클래스 MenuManager {
개인 정적 로거 로그 = LoggerFactory.getLogger(MenuManager.class);
/**
* 메뉴 구조 정의
* @return
*/
private static Menu getMenu() {
//하위 메뉴 정의
ViewButton btn1 = new ViewButton();
btn1.setName( " 하위 메뉴 1");
btn1.setType("view");
btn1.setUrl("http://www.baidu.com");
ViewButton btn2 = new ViewButton();
btn2.setName("하위 메뉴 2");
btn2.setType("view");
btn2.setUrl("http ://www.baidu.com");
ViewButton btn3 = new ViewButton();
btn3.setName("하위 메뉴 3");
btn3.setType ("view");
btn3.setUrl("http://www.baidu.com");
ViewButton btn4 = new ViewButton();
btn4 .setName("하위 메뉴 4");
btn4.setType("view");
btn4.setUrl("http://www.baidu.com" );
ComplexButton mainBtn1 = new ComplexButton();
mainBtn1.setName("메인 메뉴 1");
mainBtn1.setSub_button(new Button[] { btn1, btn2});/ /WeChat은 최대 5개의 하위 메뉴를 규정합니다
ComplexButton mainBtn2 = new ComplexButton();
mainBtn2.setName("Main Menu 2");
mainBtn2 .setSub_button(new Button [] { btn3});
ComplexButton mainBtn3 = new ComplexButton();
mainBtn3.setName("메인 메뉴 3");
mainBtn3 .setSub_button(new Button [] {btn4});
메뉴 메뉴 = new Menu();
menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });
return menu;
}
public static void main(String[] args) {
// 공개 계정의 유일한 자격 증명
1
String appId = "";
//공개 계정 고유 인증서 키
String appSecret = "";
// 자격 증명을 얻기 위해 인터페이스를 호출합니다.
Token token = CommonUtil.getToken(appId, appSecret);
if (null != token) {
// 메뉴 생성
boolean result = createMenu(getMenu(), token.getAccessToken());
// 메뉴 생성 결과 판단
if (result )
log.info("메뉴가 생성되었습니다!");
else
log.info("메뉴 생성에 실패했습니다!");
}
}
/**
* 메뉴 만들기
*
* @param 메뉴 메뉴 인스턴스
* @param accessToken 자격 증명
* @return 진정한 성공 거짓 실패
*/
public static boolean createMenu(메뉴 메뉴, String accessToken) {
부울 결과 = false ;
String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
String url = menu_create_url.replace(" ACCESS_TOKEN", accessToken);
// 메뉴 객체를 json 문자열로 변환
String jsonMenu = JSONObject.fromObject(menu).toString();
// 메뉴 생성을 위한 POST 요청 시작
JSONObject jsonObject = CommonUtil.httpsRequest(url, "POST", jsonMenu);
if (null != jsonObject) {
int errorCode = jsonObject.getInt("errcode");
String errorMsg = jsonObject.getString("errmsg");
if (0 == errorCode) {
result = true ;
} else {
result = false;
log.error("메뉴 오류 코드를 생성하지 못했습니다:{} errmsg:{}", errorCode, errorMsg);
}
}
결과 반환;
}
}
위 내용은 WeChat 공개 계정을 위한 맞춤형 메뉴 개발 경험 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!