Dieser Artikel enthält eine Zusammenfassung der Erfahrungen bei der Entwicklung benutzerdefinierter Menüs für öffentliche WeChat-Konten
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。 自定义菜单操作流程其实很简单 ,就是执行一段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; } }
/**
* Die Schaltfläche „Klicktyp“ ähnelt dem Eingabetyp = „Schaltfläche“. Geben Sie den Schlüssel an, um das entsprechende Geschäft basierend auf dem erfassten Schlüssel zu verarbeiten*/
öffentliche Klasse ClickButton erweitert Button {
privater String-Typ;
privater String-Schlüssel;
öffentlicher String getType() {
Rückgabetyp;
}
public void setType(String type) {
this.type = type;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
3 Erstellen Sie eine Schaltfläche, die dem Typ entspricht. Vereinfacht ausgedrückt bedeutet dies, dass Sie einen Hauptmenücontainer
/**
* Schaltfläche „Verbindungstyp“
*
*/
öffentliche Klasse „ComplexButton erweitert 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 Erstellen Sie eine Menüklasse für drei Hauptmenüs /** * Menü */public class Menu { private Button[] button; public Button[] getButton() { Return-Taste; } public void setButton(Button[] button) { this.button = button; }}5 Erstellen Sie das Token der aufrufenden Anmeldeinformationsklasse, um die Ausführung der Hauptmethode zum Aufrufen der Tencent-Schnittstelle vorzubereiten/** * Gutschein * */public class Token {//Anmeldeinformationen für den Schnittstellenzugriff private String accessToken; // Gültigkeitsdauer der Anmeldeinformationen, Einheit: Sekunden private int ExpiresIn ; public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this .accessToken = accessToken; } public int getExpiresIn() { return expiresIn; } public void setExpiresIn( int ExpiresIn) { this.expiresIn = ExpiresIn; }}Ich beschreibe die Klasse nur im folgenden Code. Siehe Kommentare für bestimmte Codefunktionen. 6 Bereiten Sie den Aufruf der Tencent-Schnittstelle vor (1) Erstellen Sie eine gemeinsame Werkzeugklasse/** * Allgemeine Werkzeuge * */öffentliche Klasse CommonUtil { private static Logger log = LoggerFactory.getLogger(CommonUtil.class); /** * Anmeldeinformationen für den Schnittstellenzugriff abrufen * * @param appid-Anmeldeinformationen * @param appsecret key * @return */ public static Token getToken(String appid, String appsecret ) { // Zugangsdatenerfassung (GET) String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET ";Token token = null; String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret); // Initiieren Sie eine GET-Anfrage, um Anmeldeinformationen zu erhalten JSONObject jsonObject = httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try {
token = new Token(); token.setAccessToken(jsonObject.getString("access_token")); token.setExpiresIn(jsonObject.getInt("expires_in") ); } Catch (JSONException e) { // Token konnte nicht abgerufen werden token = null; } } return token; } /** * https-Anfrage senden * * @param requestUrl-Anfrageadresse * @param requestMethod-Anfragemethode (GET, POST) * @param outputStr übermittelte Daten * @return JSONObject (rufen Sie den Attributwert des JSON-Objekts über JSONObject.get(key) ab) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr ) { JSONObject jsonObject = null; try { // Erstellen Sie ein SSLContext-Objekt und initialisieren Sie es mit dem von uns angegebenen Trust-Manager TrustManager[ ] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security .SecureRandom( )); // Holen Sie sich das SSLSocketFactory-Objekt aus dem obigen SSLContext-Objekt SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = neue URL( requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput (true);
conn.setUseCaches(false);
// Anforderungsmethode festlegen (GET/POST)
conn.setRequestMethod(requestMethod);
// Daten in den Ausgabestream schreiben, wenn OutputStr nicht null ist
if (null != OutputStr) {
OutputStream outputStream = conn.getOutputStream();
// Achten Sie auf das Codierungsformat
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// Den zurückgegebenen Inhalt aus dem Eingabestream lesen
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8" );
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ( (str = bufferedReader. readLine()) != null) {
buffer.append(str);
}
// Ressourcen freigeben
bufferedReader.close() ;
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect( );
jsonObject = JSONObject.fromObject(buffer.toString());
} Catch (ConnectException ce) {
log.error("Connection timeout: {} ce);
return jsonObject ; }}(2) Trust Manager erstellen Paket com.test.util;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;/** * Trust Manager * */ öffentliche Klasse MyX509TrustManager implementiert >}
// Serverseitiges Zertifikat prüfen
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// Gibt ein Array vertrauenswürdiger X509-Zertifikate zurück
public 7 Nach Abschluss der oben genannten Arbeiten können Sie ein benutzerdefiniertes Menü erstellen. Erstellen Sie eine benutzerdefinierte Menüverwaltungsklasse. AppId und appSecret zuweisen und die Hauptmethode ausführen, fertig.
Paket com.test.menu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import 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;
/**
* Menümanagerklasse
*
*/
public class MenuManager {
private static Logger log = LoggerFactory.getLogger(MenuManager.class);
/**
* Menüstruktur definieren
* @return
*/
private static Menu getMenu() {
//Untermenü definieren
ViewButton btn1 = new ViewButton();
btn1.setName( " Untermenü 1");
btn1.setType("view");
btn1.setUrl("http://www.baidu.com");
ViewButton btn2 = new ViewButton();
btn2.setName("Submenu 2");
btn2.setType("view");
btn2.setUrl ("http ://www.baidu.com");
ViewButton btn3 = new ViewButton();
btn3.setName("Submenu 3");
btn3.setType ("view");
btn3.setUrl("http://www.baidu.com");
ViewButton btn4 = new ViewButton();
btn4 .setName("Submenu 4");
btn4.setType("view");
btn4.setUrl("http://www.baidu.com" );
ComplexButton mainBtn1 = new ComplexButton();
mainBtn1.setName("Hauptmenü 1");
mainBtn1.setSub_button(new Button[] { btn1, btn2});/ /WeChat legt bis zu fünf Untermenüs fest
ComplexButton mainBtn2 = new ComplexButton();
mainBtn2.setName("Main Menu 2");
mainBtn2 .setSub_button(new Button [] { btn3});
ComplexButton mainBtn3 = new ComplexButton();
mainBtn3.setName("Main Menu 3");
mainBtn3 .setSub_button(new Button [] {btn4});
Menu menu = new Menu();
menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });
Return-Menü;
}
public static void main(String[] args) {
// Der einzige Berechtigungsnachweis für öffentliches Konto
1
String appId = "";
//Eindeutiger Zertifikatsschlüssel des öffentlichen Kontos
String appSecret = "";
// Schnittstelle aufrufen, um die Anmeldeinformationen zu erhalten
Token token = CommonUtil.getToken(appId, appSecret);
if (null != token) {
// Menü erstellen
boolean result = createMenu(getMenu(), token.getAccessToken());
// Ergebnis der Menüerstellung beurteilen
if (result )
log.info("Menü erfolgreich erstellt!");
else
log.info("Menüerstellung fehlgeschlagen!");
}
}
/**
* Menü erstellen
*
* @param-Menü-Menüinstanz
* @param accessToken-Anmeldeinformationen
* @return true success false fehlgeschlagen
*/
public static boolean createMenu(Menu menu, String accessToken) {
boolean result = 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);
// Konvertieren Sie das Menüobjekt in einen JSON-String
String jsonMenu = JSONObject.fromObject(menu).toString();
// Initiieren Sie eine POST-Anfrage, um ein Menü zu erstellen
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("Fehler beim Erstellen des Menüs errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
Ergebnis zurückgeben;
}
}
Das obige ist der detaillierte Inhalt vonZusammenfassung der Erfahrungen bei der Entwicklung benutzerdefinierter Menüs für öffentliche WeChat-Konten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!