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!