06-WeChat公式アカウントのメニュー構成
目次
1.WeChat公式アカウントメニュー
まず、WeChat公式アカウントのメニューを構成する前に、WeChatプラットフォームがメニューのAPIをどのように定義するかを理解する必要があります。
詳細情報参照URLは次のとおりです。
https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html
呼び出されるWeChatリクエストは次のとおりです。
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
パラメータaccess_tokenはセクション05で取得されており、タイムアウトなしでaccess_tokenを使用してリクエストを呼び出します。
クリックしてリクエストの例を表示します(他のタイプについては、公式ドキュメントを参照してください)
{
"button": [
{
"key": "1",
"name": "一级菜单1",
"type": "click"
},
{
"name": "一级菜单2",
"type": "view",
"url": "http://www.baidu.com"
},
{
"name": "菜单",
"sub_button": [
{
"name": "二级菜单",
"type": "view",
"url": "http://fanyi.youdao.com/"
}
]
}
]
}
カタログ作成のリクエストは2つの部分に分けることができます
- 抽象メッセージ情報(メッセージ情報の客体化)
- 公式アカウントのディレクトリ構造を変更するリクエストを送信します
1.1。抽象的なメッセージ情報
メッセージ情報を抽象化する前に、メッセージを分析する必要があります
まず、タイプがクリックかビューかに関係なく、名前があるので、パブリックを抽出できます。
//这里讲下我为什么把这个类设置成抽象类
//当节点1(一级菜单1)和节点2(一级菜单2)是两种不同的类型。
//但是呢button中需要有两种不同的类型,所以就做了抽象类进行处理
public abstract class AbstractMenu {
// 抽取出来的公共参数
public String name;
// get set方法省略
}
そうすれば、状況に応じて、内側から外側に向かって1つずつ抽象化できます。
- まず、ビューオブジェクトとクリックオブジェクトである最下位の基本オブジェクトを作成します(異なるタイプが設定されている場合は、WeChat公式アカウントの詳細なドキュメントを参照してください)
// 由于是测试 所以方法的命名是不符合规范的
public class ClickButten extends AbstractMenu {
private String type= "click";
private String key;
// 省略get set方法
public ClickButten(String name,String key) {
super(name);
this.key = key;
}
}
public class ViewButten extends AbstractMenu {
private String type = "view";
private String url;
// 省略get set方法
public ViewButten(String name,String url) {
super(name);
this.url = url;
}
}
- 次に、サブメニューオブジェクトを作成します
public class SubButten extends AbstractMenu {
List<AbstractMenu> sub_button = new ArrayList<AbstractMenu>();
// 省略 get set方法
public SubButten(String name) {
super(name);
}
}
- サブメニューが作成された後、最大のメニューが作成されます
public class Button {
List<AbstractMenu> button = new ArrayList<AbstractMenu>();
// 省略 get set方法
}
- 最終検証プロセス
@Test
void TestMenu(){
Button button = new Button();
button.getButton().add(new ClickButten("一级菜单1","1"));
button.getButton().add(new ViewButten("一级菜单2","http://www.baidu.com"));
SubButten subButten = new SubButten("菜单");
subButten.getSub_button().add(new ViewButten("二级菜单","http://fanyi.youdao.com/"));
button.getButton().add(subButten);
//这块被坑了 使用的api是 net.sf.json.JSONObject 我一直以为使用的是org.json(原生的json包)
JSONObject jsonObject = JSONObject.fromObject(button);
System.out.println(jsonObject.toString());
}
postmanを使用して変更を呼び出します。効果図を以下に示します。
1.2。メニュー構成
リクエストメッセージを組み立ててから、呼び出して執り成しを送信することができます。
void Testpost() throws Exception {
// 菜单的url进行拼接
Button button = new Button();
button.getButton().add(new ClickButten("一级菜单1","1"));
button.getButton().add(new ViewButten("一级菜单2","http://www.baidu.com"));
SubButten subButten = new SubButten("菜单");
subButten.getSub_button().add(new ViewButten("二级菜单","http://fanyi.youdao.com/"));
button.getButton().add(subButten);
//这块被坑了 使用的api是 net.sf.json.JSONObject 我一直以为使用的是org.json(原生的json包)
JSONObject jsonObject = JSONObject.fromObject(button);
String ACCESS_TOKEN ="42_lh4kVHJDHUTQtHfUxrjGqGfKTJKcpqO7jxGmhIwdncmOb9NH8YJ_GhNTDDxzMb1EBGqm
SckUqs7mL6ozYr-f1JNnc3J7PmaGbnbXDl0BL6oBf9OMyGY3yensACdpnoF1zoMf2QxZArQUbVXOKYPbAEARFW";
URL url = new URL(MENU_URL.replace("ACCESS_TOKEN",ACCESS_TOKEN));
URLConnection urlConnection = url.openConnection();
//设置为可以发送数据的状态
urlConnection.setDoOutput(true);
//获取输出流
OutputStream outputStream = urlConnection.getOutputStream();
// 这个地方要特别的注意,在发送给微信中含有中文的时候编码需要设置成utf-8否则会报错
outputStream.write(jsonObject.toString().getBytes("utf-8"));
outputStream.close();
InputStream is = urlConnection.getInputStream();
byte [] b = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while((len=is.read(b))!= -1){
sb.append(new String(b,0,len));
}
System.out.println(sb.toString());
}
注:メニューの構成後、ユーザーがメニューをクリックするたびに、メッセージがバックグラウンドサーバーに送信されます。
次の図は、ボタンをクリックしたときにバックグラウンドに送信されたメッセージを示しています。返された情報MsgTypeとEventKeyに従ってメッセージを処理する必要があります。
{CreateTime=1614671191, EventKey=1, Event=CLICK, ToUserName=gh_7c94dc7e2130, FromUserName=orxnH5wNRLvz2DfNTopTGcL4y9ic, MsgType=event}
注:送信される情報は私が解析したものであり、実際に送信されるデータはxml形式です。