この記事では、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; } }
/**
* Click type button は input type = 'button' と同様で、キーを指定し、取得したキーに従って対応する業務を処理します
*/
public class ClickButton extends Button {
private String type;
private String key;
public String getType() {
戻り値;
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 つのメイン メニューを保持するメニュー クラスを作成します/** * メニュー*/ public class Menu { private Button[] ボタン; public Button[] getButton() {戻るボタン; } public void setButton(Button[] button) { this.button = button; }}5 呼び出し資格情報クラスのトークンを作成します Tencent インターフェイスを呼び出すメイン メソッドを実行する準備をします/** * クーポン * */public class Token { //インターフェイス アクセスcredentials private String accessToken; //バウチャーの有効期間、単位: 秒 Private intexpiresin; Public String GetaccessStoken () { Return Accessstoken } Public void Setaclesstoken; AccessStoken) { This.access stoken = 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"; トークン token = null; String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
// 資格情報を取得するための GET リクエストを開始します 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) { // トークンの取得に失敗しました
トークン = null; } } return token; } /** * https リクエストを送信 * * @param requestUrl リクエストアドレス * @param requestMethod リクエストメソッド (GET, POST) * @param OutputStr 送信データ * @return JSONObject (via 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);
R httpsurlConnection conn = (httpsurlconnection) url.openconnection ();
conn.setusecacher (false); conn.setusecacher (false);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");
BufferedReaderbufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer Buffer = 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) トラストマネージャー
パッケージを作成します com.test.util;
import java.security.cert.CertificateException;
import java.security .cert.X509Certificate
import; javax.net.ssl.ertificate[]chain, String authType) throws CertificateException {
}
// サーバー側の証明書を確認します
public void checkServerTrusted(X509Certificate[]chain, String authType) throws CertificateException {
}
// 信頼できる X509 証明書配列を返します
publicカスタム メニュー管理クラスを作成します。 appId と appSecret を割り当て、main メソッドを実行して完了です。
パッケージ 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;
/**
* トラストマネージャー
*
*/
public class MenuManager {
private static Logger log = LoggerFactory.getLogger(MenuManager.class);
/**
* メニューマネージャークラス
*
*/
private static Menu getMenu() {
//サブメニューを定義します
ViewButton btn1 = new ViewButton();
btn1.setName("サブメニュー 1");
btn1.setType("view");
setUrl( "http://www.baidu.com");
ViewButton btn2 = new ViewButton();
btn2.setName("サブメニュー 2");
btn2.setType("view");
btn2。 setUrl("http://www.baidu.com");
ViewButton btn3 = 新しい ViewButton();
btn3.setName("サブメニュー 3");
btn3.setType("view" );
btn3.setUrl("http://www.baidu.com");
ViewButton btn4 = 新しい ViewButton();
btn4.setName("サブメニュー 4");
btn4.setType( "view");
btn4.setUrl("http://www.baidu.com");
ComplexButton mainBtn1 = new ComplexButton();
mainBtn1.setName("メインメニュー 1");
mainBtn1 .setSub_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});
メニュー メニュー = 新しいメニュー();
menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });
return menu;
}
public static void main(String[] args) {
// 一意の認証情報パブリック アカウントの
1
String appId = "";
//パブリック アカウントの一意の認証キー
String appSecret = "";
// インターフェイスを呼び出して取得します資格情報
トークン token = CommonUtil.getToken(appId, appSecret);
if (null != トークン) {
// メニューを作成します
boolean result = createMenu(getMenu(), token.getAccessToken());
// メニューの作成結果を決定します
if (result)
log.info("メニューが正常に作成されました!" ) ;
else
log.info("メニューの作成に失敗しました!");
}
}
/**
* メニューの作成
*
* @param メニュー メニュー インスタンス
* @param accessToken 資格情報
* @return true 成功 false 失敗
*/
public static boolean createMenu(Menu menu, String accessToken) {
ブール値 = false;
文字列 menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
文字列 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("メニューの作成に失敗しました errcode:{} errmsg:{}", errorCode, errorMsg );
}
}
結果を返します;
}
}
以上がWeChat パブリック アカウントのカスタム メニュー開発の経験の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。