Maison  >  Article  >  Applet WeChat  >  Résumé de l'expérience dans le développement de menus personnalisés pour les comptes publics WeChat

Résumé de l'expérience dans le développement de menus personnalisés pour les comptes publics WeChat

高洛峰
高洛峰original
2017-03-22 16:10:451928parcourir

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


String appId = "";

//Clé de certificat unique du compte public

String appSecret = "";

// Appelez l'interface pour obtenir les identifiants

Token token = CommonUtil.getToken(appId, appSecret);

if (null != token) {

// 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn