Maison > Article > Applet WeChat > Résumé de l'expérience dans le développement de menus personnalisés pour les comptes publics WeChat
Cet article partage le résumé de l'expérience de développement de menus personnalisés pour les comptes publics 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; } }
/**
* Le bouton de type de clic est similaire au type d'entrée = 'bouton' Spécifiez la clé pour traiter l'entreprise correspondante en fonction de la clé capturée
*
.*/
public class ClickButton extends Button {
type de chaîne privée ;
clé de chaîne privée ;
chaîne publique getType() {
type de retour ;
}
public void setType(String type) {
this.type = type;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
3 Créer un bouton qui correspond au type. Pour parler franchement, cela signifie créer un conteneur de menu principal
/**
* Bouton de type composé
*
*/
public class ComplexButton extends Button {
bouton privé[ ] sub_button;
bouton public[] getSub_button() {
return sub_button;
}
public void setSub_button( Button[] sub_button) {
this.sub_button = sub_button;
}
}
4 Créez une classe de menu pour contenir trois menus principaux
/**
*Menu
*/
public class Menu {
bouton privé[] bouton;
bouton public[] getButton() {
bouton de retour ;
}
public void setButton(Bouton Bouton[]) {
this.button = bouton;
}
}
5 Créez le jeton de classe d'informations d'identification d'appel pour préparer l'exécution de la méthode principale pour appeler l'interface Tencent
/**
*Bon d'achat
*
*/
public class Token {
//Identifiant d'accès à l'interface
private String accessToken;
// Période de validité des informations d'identification, unité : secondes
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;
}
}
Je décris uniquement la classe dans le code suivant. Voir les commentaires pour les fonctions de code spécifiques.
6 Préparez-vous à appeler l'interface Tencent
(1) Créez une classe d'outils commune
/**
*Outils généraux
*
*/
classe publique CommonUtil {
journal de l'enregistreur statique privé = LoggerFactory.getLogger(CommonUtil.class);
/**
* Obtenir les informations d'identification d'accès à l'interface
*
* Informations d'identification @param appid
* Clé @param appsecret
* @return
*/
jeton statique public getToken (String appid, String appsecret ) {
// Acquisition d'informations d'identification (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);
// Lancer une requête GET pour obtenir les informations d'identification
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) {
// Échec de l'obtention du jeton
token = null;
}
>
jeton de retour ;
}
/**
* Envoyer la requête https
*
* @param requestUrl adresse de requête
* @param requestMethod méthode de requête (GET, POST)
* @param outputStr données soumises
* @return JSONObject (obtenir la valeur d'attribut de l'objet json via JSONObject.get(key))
*/
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr ) {
JSONObject jsonObject = null;
try {
// Créez un objet SSLContext et initialisez-le avec le gestionnaire de confiance que nous avons spécifié
TrustManager[ ] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security .SecureRandom( ));
// Récupère l'objet SSLSocketFactory à partir de l'objet SSLContext ci-dessus
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL( requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput (true);
conn.setUseCaches(false);
// Définir la méthode de requête (GET/POST)
conn.setRequestMethod(requestMethod);
// Écrit des données dans le flux de sortie lorsque outputStr n'est pas nul
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// Faites attention au format d'encodage
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// Lire le contenu renvoyé à partir du flux d'entrée
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);
}
// Libérer les ressources
bufferedReader.close() ;
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect( );
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("Délai d'expiration de la connexion : {} ", ce);
} catch (Exception e) {
log.error("https request exception: {}", e);
}
return jsonObject ;
}
}
(2) Créer un gestionnaire de confiance
package com.test.util;
importer java.security.cert.CertificateException;
importer java.security.cert.X509Certificate;
importer javax.net.ssl.X509TrustManager;
/**
*Gestionnaire de confiance
*
*/
classe publique implémentée par MyX509TrustManager > }
// Vérifier le certificat côté serveur
public void checkServerTrusted (chaîne X509Certificate[], String authType) lance CertificateException {
🎜>
// Renvoie un tableau de certificats X509 de confiance public 7 Après avoir terminé le travail ci-dessus, vous pouvez créer un menu personnalisé. Créez une classe de gestion de menu personnalisée. Attribuez appId et appSecret et exécutez la méthode principale, c'est fait. package com.test.menu;importer org.slf4j.Logger;importer org.slf4j.LoggerFactory;importer net.sf. json.JSONObject;importer com.test.bean.Button;importer com.test.bean.ComplexButton;importer com.test.bean.Menu;importer com.test.bean.Token;importer com.test.bean.ViewButton;importer com.test.util.CommonUtil; /** *Cours de gestionnaire de menus * */classe publique MenuManager { journal de l'enregistreur statique privé = LoggerFactory.getLogger(MenuManager.class); /** * Définir la structure du menu * @return */ Menu statique privé getMenu() { //Définir le sous-menu ViewButton btn1 = new ViewButton(); btn1.setName( " Sous-menu 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 ("vue"); btn3.setUrl("http://www.baidu.com"); ViewButton btn4 = new ViewButton();btn4 .setName("Sous-menu 4"); btn4.setType("view"); btn4.setUrl("http://www.baidu.com" );
ComplexButton mainBtn1 = new ComplexButton(); mainBtn1.setName("Menu principal 1"); mainBtn1.setSub_button(new Button[] { btn1, btn2});/ /WeChat stipule jusqu'à cinq sous-menus ComplexButton mainBtn2 = new ComplexButton(); mainBtn2.setName("Main Menu 2"); mainBtn2 .setSub_button(new Button [] { btn3}); ComplexButton mainBtn3 = new ComplexButton(); mainBtn3.setName("Menu principal 3"); mainBtn3 .setSub_button(nouveau bouton [] {btn4}); Menu menu = new Menu(); menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 }); return menu; } public static void main(String[] args) { // Le seul identifiant pour le compte public 1
// Créer un menu
boolean result = createMenu(getMenu(), token.getAccessToken());
// Juger le résultat de la création du menu
if (result )
log.info("Menu créé avec succès!");
else
log.info("Échec de la création du menu!");
}
}
/**
* Créer un menu
*
* @param menu instance de menu
* @param accessToken identifiant
* @return true success faux échoué
*/
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);
// Convertit l'objet menu en chaîne json
String jsonMenu = JSONObject.fromObject(menu).toString();
// Lancer une requête POST pour créer un menu
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("Échec de la création du menu errcode :{} errmsg:{}", errorCode, errorMsg);
}
}
résultat de retour;
}
}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!