2017-08-15 09:50:48 zxxz5201314 阅读数 1841
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8593 人正在学习 去看看 CSDN讲师

我的微信公众号是个人订阅号,个人订阅号不能认证,所以没有自定义菜单的权限。我使用的是微信公众平台提供的一个测试账号。
测试账号
测试号里面会提供一个appid和appsecret,同样需要接口配置。
配置接口

创建菜单:

package com.weixin.util;
import java.io.IOException;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSON;
import com.weixin.menu.Button;
import com.weixin.menu.ClickButton;
import com.weixin.menu.Menu;
import com.weixin.menu.ViewButton;

import net.sf.json.JSONObject;

public class HttpUtil {
    private static final String APPID = "APPID";
    private static final String APPSECRET = "APPSECRET";


    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    private static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
    /**
     * get请求
     * @param url
     * @return
     */
    public static JSONObject doGetStr(String url) throws ParseException, IOException{
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        JSONObject jsonObject = null;
            HttpResponse response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                String result = EntityUtils.toString(entity, "UTF-8");
                jsonObject = JSONObject.fromObject(result);
            }
        return jsonObject;
    }

    /**
     * post请求
     * @param url
     * @param outStr
     * @return
     */
    public static JSONObject doPostStr(String url,String outStr){
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        JSONObject jsonObject = null;
        httpPost.setEntity(new StringEntity(outStr, "UTF-8"));
        try {
            HttpResponse response = httpClient.execute(httpPost);
            String result = EntityUtils.toString(response.getEntity(), "UTF-8");
            jsonObject = JSONObject.fromObject(result);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return jsonObject;
    }

    /**
     * 通过判断获取AccessToken:本地-网络
     * @return
     * @throws IOException
     */
    public static String getAccessToken() throws IOException{
        String filePath = "E:/zx/access_token/access_token01.txt";
        String access_token = null;
        String read= ReadAndWriteTxt.readFile(filePath);
        if (read.equals("001")) {
            access_token = getAccessTokenHttp();
            String str = access_token+"++"+ReadAndWriteTxt.getTime;
            ReadAndWriteTxt.writeFile(filePath, str);
            System.out.println("new");
        }else if((ReadAndWriteTxt.getTime - Integer.valueOf(read.split("++")[1]).intValue()) > 7200){
            access_token = getAccessTokenHttp();
            String str = access_token+"++"+ReadAndWriteTxt.getTime;
            ReadAndWriteTxt.writeFile(filePath, str);
            System.out.println("update");
        }else {
            access_token = read.split("++")[0];
            System.out.println("show");
        }
        return access_token;
    }

    /**
     * 获取微信的AccessToken
     * @return
     * @throws ParseException
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    public static String getAccessTokenHttp() throws ParseException, IOException{
        String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);
        JSONObject jsonObject = doGetStr(url);
        Map<String, String> maps = null;
        if (jsonObject != null) {
            maps = (Map<String, String>) JSON.parse(jsonObject.toString());
        }
        String access_token = maps.get("access_token");
        return access_token;
    }

    /**
     * 初始化菜单
     * @return
     */
    public static Menu initMenu(){
        Menu menu = new Menu();
        ClickButton button11 = new ClickButton();
        button11.setName("click菜单");
        button11.setType("click");
        button11.setKey("11");

        ViewButton button21 = new ViewButton();
        button21.setName("view菜单");
        button21.setType("view");
        button21.setUrl("https://www.baidu.com/");

        ClickButton button31 = new ClickButton();
        button31.setName("扫码事件");
        button31.setType("scancode_push");
        button31.setKey("31");

        ClickButton button32 = new ClickButton();
        button32.setName("地理位置");
        button32.setType("location_select");
        button32.setKey("32");

        Button button = new Button();
        button.setName("菜单");
        button.setSub_button(new Button[]{button31,button32});

        menu.setButton(new Button[]{button11,button21,button});

        return menu;
    }

    public static int creatMenu(String token,String menu){
        int result = 0;
        String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);
        JSONObject jsonObject = doPostStr(url, menu);
        if (jsonObject != null) {
            result = jsonObject.getInt("errcode");
        }
        return result;
    }
}

写一个测试类

package com.weixin.text;

import java.io.IOException;


import com.weixin.util.HttpUtil;

import net.sf.json.JSONObject;

public class Test {

    public static void main(String[] args) throws IOException{
        String menu = JSONObject.fromObject(HttpUtil.initMenu()).toString();
        int result = HttpUtil.creatMenu(HttpUtil.getAccessToken(), menu);
        if (result == 0) {
            System.out.println("创建菜单成功");
        }else {
            System.out.println("错误码:"+result);
        }
    }

}

源码:
http://download.csdn.net/download/zxxz5201314/9933934
PS:终于审核过了。。。。

2019-12-04 10:52:02 weixin_43229729 阅读数 5
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8593 人正在学习 去看看 CSDN讲师

借鉴于:https://blog.csdn.net/u014740338/article/details/79670779

微信打开开发者模式后,以前通过微信后台配置的菜单就失效了,需要通过我们自己服务器后台配置(需要开发),还有一种比较简单的方法,就是通过微信提供的“微信公众平台接口测试工具”进行配置。下面重点说一下通过微信提供的测试工具进行配置的过程。

一、进入微信接口调试页面

接口参数:

access_token: 是公众号访问接口用的,需要填写要修改的公众号access_token。

body: 创建菜单的JSON串。示例如下:(创建一级菜单+二级菜单

 

{
	"button": [{
		"type": "view",
		"name": "技术查看",
		"url": "https://blog.csdn.net/weixin_43229729"
	},
	{
		"name": "学习",
		"sub_button": [{
			"type": "view",
			"name": "遇到的问题",
			"url": "https://blog.csdn.net/weixin_43229729"
		},
		{
			"type": "view",
			"name": "学习记录",
			"url": "https://blog.csdn.net/weixin_43229729"
		}]
	},
	{
		"type": "view",
		"name": "我的博客",
		"url": "https://blog.csdn.net/weixin_43229729"
	}]

}

body写好之后点击“检查问题”按钮。若创建成功会返回一下信息:

 

二,通过调用微信api进行设置(自定义菜单创建/查询/删除)

关于自定义菜单的查询和删除,直接看微信官方文档。

微信官网文档:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Deleting_Custom-Defined_Menu.html

2014-07-07 16:33:00 chuanwumi7056 阅读数 2
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8593 人正在学习 去看看 CSDN讲师

微信支持开发者在开发模式下通过post数据的方式自定义菜单,鉴于其菜单格式复杂,暂未定义其菜单实体类,具体数据格式请参看微信开发者文档。微信提供的功能有“自定义菜单创建接口”,“自定义菜单查询接口”,“自定义菜单删除接口”,本次仅实现“自定义菜单创建接口”。

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// WxMenuHelper 的摘要说明
/// </summary>
public class WxMenuHelper
{
    private static String menuUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
    public static WxErrorEntity UpdateWxMenu(String ACCESS_TOKEN, String menuData)
    {
        String finalUrl = menuUrl.Replace("ACCESS_TOKEN", ACCESS_TOKEN);
        String result = RequestHelper.sendPost(finalUrl, menuData);
        if (result == null || result == "")
        {
            throw new Exception("微信无返回数据");
        } 
        try
        {
            WxErrorEntity error = (WxErrorEntity)JsonHelper.FromJsonToModel(result, typeof(WxErrorEntity));
            if (error == null)
            {
                throw new Exception("数据解析异常,原因未知");
            }
            return error;
        }
        catch (Exception ex)
        {
            throw new Exception("数据解析异常," + ex.Message);
        }
    }
}

(1)参数ACCESS_TOKEN为前文中获取的access_token,请注意其过期问题及获取次数限制问题。

(2)参数menuData为实际发送的json数据。

(3)其结果类WxErrorEntity 在前文中有定义,此处不再详解。

哪位有好的微信菜单的抽象类定义欢迎分享下,邮箱:lufaxin_t@163.com.


转载于:https://my.oschina.net/u/1867097/blog/287992

2017-07-22 15:25:38 xiaobing_122613 阅读数 2272
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8593 人正在学习 去看看 CSDN讲师

微信公众平台开发模式自定义菜单接口API指南

 开发实现方法,请查看 

微信公众平台开发(58)自定义菜单

 

简介

开发者获取使用凭证(如何获取凭证)后,可以使用该凭证对公众账号的自定义菜单进行创建、查询和删除等操作。 自定义菜单接口可实现以下类型按钮:

click(点击事件):

用户点击click类型按钮后,微信服务器会通过消息接口(event类型)推送点击事件给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值进行消息回复

创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后,再次关注,则可以看到创建后的效果。

菜单创建

接口说明

通过POST一个特定结构体,实现在微信客户端创建自定义菜单。


请求说明

http请求方式:POST
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

请求示例

 {
     "button":[
     {	
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "type":"click",
           "name":"歌手简介",
           "key":"V1001_TODAY_SINGER"
      },
      {
           "name":"菜单",
           "sub_button":[
            {
               "type":"click",
               "name":"hello word",
               "key":"V1001_HELLO_WORLD"
            },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }

创建后效果:

参数说明

参数 是否必须 说明
button 按钮数组,按钮个数应为1~3个
sub_button 子按钮数组,按钮个数应为1~5个
type 按钮类型,目前有click类型
name 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节
key 类型为click必须 按钮KEY值,用于消息接口(event类型)推送,不超过128字节

返回说明

正确的Json返回结果:

{"errcode":0,"errmsg":"ok"}

错误的Json返回结果

{"errcode":40018,"errmsg":"invalid button name size"}

统一返回码说明

菜单查询

接口说明

查询当前使用的自定义菜单结构。

请求说明

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN

返回说明

对应创建接口,正确的Json返回结果:
{"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"click","name":"hello word","key":"V1001_HELLO_WORLD","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}

统一返回码说明

 

菜单删除

接口说明

取消当前使用的自定义菜单。

请求说明

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

返回说明

对应创建接口,正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}

统一返回码说明

 

请先确保公众账号已经拥有接口调用权限。

默认每个公众帐号都不能超过下面的频率限制。 当超出调用接口频率限制,调用对应接口将会收到如下错误信息:

{"errcode":45009,"errmsg":"api freq out of limit"}

接口调用频率限制

接口名称 频率限制
获取凭证接口 200(次/天)
自定义菜单创建接口 100(次/天)
自定义菜单查询接口 1000(次/天)
自定义菜单删除接口 100(次/天)

 

返回码说明

返回码 说明
-1 系统繁忙
0 请求成功
40001 验证失败
40002 不合法的凭证类型
40003 不合法的OpenID
40004 不合法的媒体文件类型
40005 不合法的文件类型
40006 不合法的文件大小
40007 不合法的媒体文件id
40008 不合法的消息类型
40009 不合法的图片文件大小
40010 不合法的语音文件大小
40011 不合法的视频文件大小
40012 不合法的缩略图文件大小
40013 不合法的APPID
40014 不合法的access_token
40014 不合法的access_token
40015 不合法的菜单类型
40016 不合法的按钮个数
40017 不合法的按钮个数
40018 不合法的按钮名字长度
40019 不合法的按钮KEY长度
40020 不合法的按钮URL长度
40021 不合法的菜单版本号
40022 不合法的子菜单级数
40023 不合法的子菜单按钮个数
40024 不合法的子菜单按钮类型
40025 不合法的子菜单按钮名字长度
40026 不合法的子菜单按钮KEY长度
40027 不合法的子菜单按钮URL长度
40028 不合法的自定义菜单使用用户
41001 缺少access_token参数
41002 缺少appid参数
41003 缺少refresh_token参数
41004 缺少secret参数
41005 缺少多媒体文件数据
41006 缺少media_id参数
41007 缺少子菜单数据
42001 access_token超时
43001 需要GET请求
43002 需要POST请求
43003 需要HTTPS请求
44001 多媒体文件为空
44002 POST的数据包为空
44003 图文消息内容为空
45001 多媒体文件大小超过限制
45002 消息内容超过限制
45003 标题字段超过限制
45004 描述字段超过限制
45005 链接字段超过限制
45006 图片链接字段超过限制
45007 语音播放时间超过限制
45008 图文消息超过限制
45009 接口调用超过限制
45010 创建菜单个数超过限制
46001 不存在媒体数据
46002 不存在的菜单版本
46003 不存在的菜单数据
47001 解析JSON/XML内容错误

 

源代码:

微信公众平台消息接口开发(9)自定义菜单

 


2015-07-17 12:08:00 weixin_33713503 阅读数 17
  • 微信公众平台应用开发(开发模式

    微信公众平台开发教程,该课程内容包括本地调试:业务逻辑测试、消息接收与响应、测试流程;符号表情,微信开发模式,消息加解密等。 讲师:刘运强,网名柳峰,计算机硕士研究生,畅销书《微信公众平台应用开发:方法、技巧与案例》作者。 本课程主要面向有一定Java基础、对微信公众平台开发感兴趣的人员,能够帮助他们入门微信公众平台开发,少走弯路。

    8593 人正在学习 去看看 CSDN讲师

简介

开发者获取使用凭证(如何获取凭证)后,可以使用该凭证对公众账号的自定义菜单进行创建、查询和删除等操作。 自定义菜单接口可实现以下类型按钮:

click(点击事件):

用户点击click类型按钮后,微信服务器会通过消息接口(event类型)推送点击事件给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值进行消息回复

创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后,再次关注,则可以看到创建后的效果。

菜单创建

接口说明

通过POST一个特定结构体,实现在微信客户端创建自定义菜单。

请求说明

http请求方式:POST  https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN  

请求示例

{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"click",
"name":"hello word",
"key":"V1001_HELLO_WORLD"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}

创建后效果:

创建后效果

参数说明

参数是否必须说明
button 按钮数组,按钮个数应为1~3个
sub_button 子按钮数组,按钮个数应为1~5个
type 按钮类型,目前有click类型
name 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节
key 类型为click必须 按钮KEY值,用于消息接口(event类型)推送,不超过128字节

返回说明

正确的Json返回结果:

{"errcode":0,"errmsg":"ok"}  

错误的Json返回结果

{"errcode":40018,"errmsg":"invalid button name size"}  

统一返回码说明

菜单查询

接口说明

查询当前使用的自定义菜单结构。

请求说明

http请求方式:GET  https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN  

返回说明

对应创建接口,正确的Json返回结果:  {"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"click","name":"hello word","key":"V1001_HELLO_WORLD","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}  

统一返回码说明

菜单删除

接口说明

取消当前使用的自定义菜单。

请求说明

http请求方式:GET  https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN  

返回说明

对应创建接口,正确的Json返回结果:  {"errcode":0,"errmsg":"ok"}  

统一返回码说明

请先确保公众账号已经拥有接口调用权限。

默认每个公众帐号都不能超过下面的频率限制。 当超出调用接口频率限制,调用对应接口将会收到如下错误信息:

{"errcode":45009,"errmsg":"api freq out of limit"}  

接口调用频率限制

接口名称频率限制
获取凭证接口 200(次/天)
自定义菜单创建接口 100(次/天)
自定义菜单查询接口 1000(次/天)
自定义菜单删除接口 100(次/天)

 

返回码说明

返回码说明
-1 系统繁忙
0 请求成功
40001 验证失败
40002 不合法的凭证类型
40003 不合法的OpenID
40004 不合法的媒体文件类型
40005 不合法的文件类型
40006 不合法的文件大小
40007 不合法的媒体文件id
40008 不合法的消息类型
40009 不合法的图片文件大小
40010 不合法的语音文件大小
40011 不合法的视频文件大小
40012 不合法的缩略图文件大小
40013 不合法的APPID
40014 不合法的access_token
40014 不合法的access_token
40015 不合法的菜单类型
40016 不合法的按钮个数
40017 不合法的按钮个数
40018 不合法的按钮名字长度
40019 不合法的按钮KEY长度
40020 不合法的按钮URL长度
40021 不合法的菜单版本号
40022 不合法的子菜单级数
40023 不合法的子菜单按钮个数
40024 不合法的子菜单按钮类型
40025 不合法的子菜单按钮名字长度
40026 不合法的子菜单按钮KEY长度
40027 不合法的子菜单按钮URL长度
40028 不合法的自定义菜单使用用户
41001 缺少access_token参数
41002 缺少appid参数
41003 缺少refresh_token参数
41004 缺少secret参数
41005 缺少多媒体文件数据
41006 缺少media_id参数
41007 缺少子菜单数据
42001 access_token超时
43001 需要GET请求
43002 需要POST请求
43003 需要HTTPS请求
44001 多媒体文件为空
44002 POST的数据包为空
44003 图文消息内容为空
45001 多媒体文件大小超过限制
45002 消息内容超过限制
45003 标题字段超过限制
45004 描述字段超过限制
45005 链接字段超过限制
45006 图片链接字段超过限制
45007 语音播放时间超过限制
45008 图文消息超过限制
45009 接口调用超过限制
45010 创建菜单个数超过限制
46001 不存在媒体数据
46002 不存在的菜单版本
46003 不存在的菜单数据
47001 解析JSON/XML内容错误

转载于:https://www.cnblogs.com/lihuanliu/p/4654077.html

没有更多推荐了,返回首页