微信公衆番号取得アクセス_tokenとカスタムメニューの作成

15009 ワード

音楽好きの犬ブログ

アクセスの取得token


アクセスの取得token微信公衆番号公式ドキュメント
1、access_token簡単な説明
access_tokenは公衆番号のグローバル唯一のインタフェース呼び出し証明書であり、公衆番号が各インタフェースを呼び出す際にaccessを使用する必要がある.token、access_を取得tokenの後、毎回インタフェースを呼び出して取得するのではなく、値を保存する必要があります.サーバはexpire_を返します.in(有効時間、単位秒)、expire_in期限切れ後にインタフェースを呼び出してaccessをリフレッシュするtokenの値.
呼び出しインタフェースでaccessを取得するtoken、パラメータAppIDとAppSecretが必要です.AppIDとAppSecretは「微信公衆プラットフォーム-開発-基本構成」ページで入手できます(開発者になる必要があり、アカウントに異常はありません).
インタフェース呼び出し要求の説明:
https : GET
/**
*  grant_type    access_token client_credential
*  appid     
*  secret     , appsecret
*/
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

2、アクセスの取得tokenの例
クラスWxServiceでは、appid、appsecret、およびaccess_を取得します.tokenのURLは静的定数に設定されます.マイクロ信号インタフェースを呼び出してaccessを取得するためのプライベートクラスメソッドを提供する.tokenおよびexpires_in、値を保存します.保存された値を取得するための共通クラスメソッドをもう1つ提供します.保存された値が空または時間が切れた場合、提供されたプライベートクラスメソッドを呼び出して値を取得します.
Javaサンプルコード
// ACCESS_TOKEN URL
private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
//appID
private static final String APPID = "wx503297a5bc732744";
//appsecret
private static final String APPSECRET = "ab7c6be47ffe47ef4b44d13502afc60a";

メソッドの例
/**
 *  AccessToken
 */
private static void getCurrentAccessToken() {
    String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET",APPSECRET);
    try {
        // GET 
        String jsonStr = NetManagerUtil.net(url,null,"GET");
        // json 
        JSONObject jsonObject = JSON.parseObject(jsonStr);
        AccessToken accessToken = new AccessToken(jsonObject.getString("access_token"), jsonObject.getString("expires_in"));
        cuttentAccessToken = accessToken;
    } catch (Exception e) {
        e.printStackTrace();
    }

}

public static String getAccessToken() {
    // token token token
    if (cuttentAccessToken == null || cuttentAccessToken.isExpires()) {
        getCurrentAccessToken();
    }
    return cuttentAccessToken.getToken();
}

「getCurrentAccessToken」メソッドでは、「NetManagerUtil」クラスの「net」メソッドを使用してネットワーク要求「JSONObject」を実行するために「fastjson」をインポートする必要があるjarパッケージAccessTokenは、access_を格納するための新しいpojoクラスです.tokenと有効期限「cuttentAccessToken」は、「AccessToken」タイプの静的プライベート変数です.
(1)「NetManagerUtil」クラスの「net」メソッドを記述してネットワーク要求を行う
NetManagerUtilクラスの静的定数
public static final String DEF_CHATSET = "UTF-8";
public static final int DEF_CONN_TIMEOUT = 30000;
public static final int DEF_READ_TIMEOUT = 30000;

ネットワークリクエストメソッド
/**
 *
 * @param strUrl  
 * @param params  
 * @param method  
 * @return   
 * @throws Exception
 */
public static String net(String strUrl, Map params,String method) throws Exception {
    HttpURLConnection conn = null;
    BufferedReader reader = null;
    String rs = null;
    try {
        StringBuffer sb = new StringBuffer();
        //GET 
        if(method==null || method.equals("GET")){
            if (params!= null) {
                strUrl = strUrl+"?"+urlencode(params);
            }
        }
        URL url = new URL(strUrl);
        // 
        conn = (HttpURLConnection) url.openConnection();
        // 
        if(method==null || method.equals("GET")){
            conn.setRequestMethod("GET");
        }else{
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
        }
        // 
        conn.setUseCaches(false);
        // 
        conn.setConnectTimeout(DEF_CONN_TIMEOUT);
        conn.setReadTimeout(DEF_READ_TIMEOUT);
        // 
        conn.setInstanceFollowRedirects(false);
        // 
        conn.connect();
        //POST 
        if (params!= null && method.equals("POST")) {
            try {
                // 
                DataOutputStream out = new DataOutputStream(conn.getOutputStream());
                out.writeBytes(urlencode(params));
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        // 
        InputStream is = conn.getInputStream();
        reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
        String strRead = null;
        while ((strRead = reader.readLine()) != null) {
            sb.append(strRead);
        }
        System.out.println(sb.toString());
        rs = sb.toString();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            reader.close();
        }
        if (conn != null) {
            conn.disconnect();
        }
    }
    return rs;
}

// map 
public static String urlencode(Mapdata) {
    StringBuilder sb = new StringBuilder();
    for (Map.Entry i : data.entrySet()) {
        try {
            sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

(2)pom.xmlにfastjsonをインポートするjarパッケージ

  com.alibaba
  fastjson
  1.1.41
  compile


(3)AccessTokenという名前のpojoクラスを新規作成し,変数や構築方法,tokenの期限切れを判断する方法を追加する.
/**
 *  token
 */
private String token;
/**
 *  
 */
private String expiresTimeout;

public String getToken() {
    return token;
}

public void setToken(String token) {
    this.token = token;
}

public String getExpiresTimeout() {
    return expiresTimeout;
}

public void setExpiresTimeout(String expiresTimeout) {
    this.expiresTimeout = expiresTimeout;
}

/**
 *  
 * @param token     token
 * @param expiresIn  
 */
public AccessToken(String token, String expiresIn) {
    this.token = token;
    this.expiresTimeout = System.currentTimeMillis() + Integer.parseInt(expiresIn) * 1000 +"";
}

/**
 *  
 * @return
 */
public boolean isExpires() {
    return System.currentTimeMillis() > Long.parseLong(this.expiresTimeout);
}

(4)WxServiceクラスに静的プライベート変数を追加する
private static AccessToken cuttentAccessToken;

3、アクセスの取得tokenテスト
WxTestという名前のテストクラスを新規作成し、取得アクセスを作成します.tokenの試験方法で試験を行う
/**
 *  token
 */
@Test
public void getToken() {
    System.out.println(WxService.getAccessToken());
    System.out.println(WxService.getAccessToken());
}

カスタムメニューの作成


カスタムメニュー微信公衆番号公式ドキュメントの作成
1、カスタムメニューの簡単な説明
カスタムメニューは最大3つの1級メニューを含み、各1級メニューは最大5つの2級メニューを含む.一級メニューは最大4つの漢字、二級メニューは最大7つの漢字である.テスト時に公衆アカウントへの注目を取り消してから再度注目すると、作成後の効果が見られます.
カスタムメニューのボタンの種類は、click、view、scancode_など多くあります.push、scancode_waitmsgなど;メニューの作成はclick、viewの2つの例で行われ、他のボタンで入力されたjsonデータフォーマットはカスタムメニューを参照して微信公衆番号の公式ドキュメントを作成します.
インタフェース呼び出し要求の説明:
http :POST( https )
[https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN](https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN)

2、json文字列に対応するオブジェクトパッケージ
clickおよびviewのリクエスト例:
 {
 "button":[
 {    
      "type":"click",
      "name":" ",
      "key":"V1001_TODAY_MUSIC"
  },
  {
       "name":" ",
       "sub_button":[
       {    
           "type":"view",
           "name":" ",
           "url":"http://www.soso.com/"
        },
        {
             "type":"miniprogram",
             "name":"wxa",
             "url":"http://mp.weixin.qq.com",
             "appid":"wx286b93c14bbf93aa",
             "pagepath":"pages/lunar/index"
         },
        {
           "type":"click",
           "name":" ",
           "key":"V1001_GOOD"
        }]
   }]
 }

この例では、作成ボタンがjson文字列を入力する必要があり、buttonキーがボタンに対応する配列(一級メニュー)があり、ボタン配列にはsub_buttonキーに対応するサブボタン配列(二次メニュー);したがって、最外層はWxButtonクラスとして作成できます.クラスには属性が1つしかありません.属性名はbutton、タイプはListです.観察によると、各ボタンにはnameフィールドがあるため、BaseButton抽象クラスが作成され、クラスには名前とStringのプロパティが1つしか提供されません.各異なるタイプのボタンはBaseButtonクラスから継承され、異なるタイプのpojoクラスを構築します.メニューに二次メニューが含まれている場合は、クラスを作成してBaseButtonから継承し、sub_という名前を指定します.buttonのListタイプのプロパティは、一級メニューを表し、サブメニューを含む場合を表す.
抽象クラス「BaseButton」の作成
/**
 *  
 */
private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public BaseButton(String name) {
    this.name = name;
}

ClickタイプのClickButtonクラスを作成し、BaseButtonから継承
/**
 *  
 */
private String type = "click";
/**
 *  
 */
private String key;

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getKey() {
    return key;
}

public void setKey(String key) {
    this.key = key;
}

public ClickButton(String name, String key) {
    super(name);
    this.key = key;
}

ボタンタイプがViewのViewButtonクラスを作成し、BaseButtonから継承
/**
 *  
 */
private String type = "view";
/**
 *  
 */
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;
}

public ViewButton(String name, String url) {
    super(name);
    this.url = url;
}

サブメニューのあるメニューを作成します.クラス名はSubButtonで、BaseButtonから継承されます.
private List sub_button = new ArrayList<>();

public List getSub_button() {
    return sub_button;
}

public void setSub_button(List sub_button) {
    this.sub_button = sub_button;
}

public SubButton(String name) {
    super(name);
}

WxButtonという名前のクラスを作成し、最終的なjson文字列を生成するクラス
private List button = new ArrayList<>();

public List getButton() {
    return button;
}

public void setButton(List button) {
    this.button = button;
}

3、パッケージのpojoを利用してカスタムメニューを作成する
「CreatButtonUtil」という名前のクラスが一般的で、メニューの作成のためにmainメソッドでcreatWxButtonプライベートクラスメソッドを呼び出します.
(1)必要な文字を静的定数として定義する
private static final String CREAT_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";

private static final String ONE_MENU_TITLE = " ";
public static final String ONE_MENU_TITLEKEY = " KEY";

private static final String TWO_MENU_TITLE = " ";
private static final String TWO_MENU_SUBTITLE_ONE = " ";
private static final String TWO_MENU_SUBTITLE_ONEURL = "http://www.epochyoosure.com/fangan/";
private static final String TWO_MENU_SUBOTITLE_TWO = " ";
private static final String TWO_MENU_SUBTITLE_TWOURL = "http://www.epochyoosure.com/a/youxuechanpin/";
private static final String TWO_MENU_SUBTITLE_THREE = " ";
private static final String TWO_MENU_SUBTITLE_THREEURL = "http://www.epochyoosure.com/zixun/";

private static final String THREE_MENU_TITLE = " ";
private static final String THREE_SUBTITLE_ONE = " ";
private static final String THREE_SUBTITLE_ONEKEY = " KEY";
private static final String THREE_SUBTITLE_TWO = " ";
private static final String THREE_MENU_SUBTITLE_THREEURL = "http://www.epochyoosure.com/index.html";

(2)「creatWxButton」プライベートクラスメソッドを作成し、メソッドでメニューオブジェクトを作成し、オブジェクトをjson文字列に変換し、「NetManagerUtil」が提供するpostメソッド要求ネットワークを呼び出し、必要なパラメータを入力し、メニューを作成する
private static void creatWxButton() {
    // 
    ClickButton oneButton = new ClickButton(ONE_MENU_TITLE,ONE_MENU_TITLEKEY);
    // 
    SubButton twoButton = new SubButton(TWO_MENU_TITLE);
    // 
    ViewButton oneSubButton = new ViewButton(TWO_MENU_SUBTITLE_ONE,TWO_MENU_SUBTITLE_ONEURL);
    ViewButton twoSubButton = new ViewButton(TWO_MENU_SUBOTITLE_TWO,TWO_MENU_SUBTITLE_TWOURL);
    ViewButton threeSubButton = new ViewButton(TWO_MENU_SUBTITLE_THREE,TWO_MENU_SUBTITLE_THREEURL);
    twoButton.getSub_button().add(threeSubButton);
    twoButton.getSub_button().add(twoSubButton);
    twoButton.getSub_button().add(oneSubButton);
    // 
    SubButton threeButton = new SubButton(THREE_MENU_TITLE);
    // 
    ClickButton subButtonOne = new ClickButton(THREE_SUBTITLE_ONE,THREE_SUBTITLE_ONEKEY);
    ViewButton subButtonTwo = new ViewButton(THREE_SUBTITLE_TWO,THREE_MENU_SUBTITLE_THREEURL);
    threeButton.getSub_button().add(subButtonOne);
    threeButton.getSub_button().add(subButtonTwo);
    // button 
    WxButton wxButton = new WxButton();
    wxButton.getButton().add(oneButton);
    wxButton.getButton().add(twoButton);
    wxButton.getButton().add(threeButton);
    // json
    String jsonStr = JSONObject.toJSONString(wxButton);
    // token
    String url = CREAT_MENU_URL.replace("ACCESS_TOKEN", WxService.getAccessToken());
    // 
    NetManagerUtil.post(url,jsonStr);
}

(3)クラス「NetManagerUtil」クラスにpostメソッドを追加
/**
 * pust  
 * @param url   url
 * @param data  data
 * @return  json 
 */
public static String post(String url,String data){
    try {
        URL urlObj = new URL(url);
        // 
        URLConnection connection = urlObj.openConnection();
        // , 
        connection.setDoOutput(true);
        // 
        connection.setUseCaches(false);
        // 
        connection.setConnectTimeout(DEF_CONN_TIMEOUT);
        connection.setReadTimeout(DEF_READ_TIMEOUT);
        // 
        OutputStream outputStream = connection.getOutputStream();
        // 
        if (data != null) {
            outputStream.write(data.getBytes());
        }
        outputStream.close();
        // 
        InputStream is = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
        String strRead = null;
        StringBuffer sb = new StringBuffer();

        while ((strRead = reader.readLine()) != null) {
            sb.append(strRead);
        }
        System.out.println(sb.toString());
        return sb.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

(4)このクラスのmainメソッドで「creatWxButton」メソッドを呼び出す
public static void main(String[] args) {
    creatWxButton();
}

(5)mainメソッドの実行
コンソールに"{"errcode":0,"errmsg":"ok"}"を印刷すると、作成に成功します.
公衆番号でカスタムメニューをクリックすると、カスタムメニューイベントが受信されます.一部のボタンタイプでは、ユーザーの操作に応答するためにイベントを処理する必要があります.その後、メッセージイベントの受信と返信は継続的に更新されます.