2016-03-08 17:43:26 mylutte 阅读数 272
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

简介

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

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 按钮数组,按钮个数应为2~3个
sub_button 子按钮数组,按钮个数应为2~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"}
2017-03-22 12:53:38 chenmoimg_ 阅读数 3782
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

一、登录到开放平台,进入开发者中心。

这里写图片描述

二、点击自定义菜单选择创建菜单,发现需要 access_token 和 应用 id。

这里写图片描述

三、去获取 access_token,应用 id 在 微信企业号开发平台《应用中心》的对应应用里。但是获取 access_token 还需要 corpid 和 corpsecret。

这里写图片描述

四、获取 access_token 还需要 corpid 和 corpsecret。要去权限管理创建一个管理组,填写必须的信息,就能获取。注意:一定要给管理组赋添加自定义菜单应用的权限,否则会报 60001 的错误。

这里写图片描述

五、在线下创建 create.php ,直接运行:

<?php
//填写管理组里的 CorpID 和 Secret
$res=file_get_contents("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=CorpID&corpsecret=Secret");
$str=json_decode($res,true);
$url="https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=".$str['access_token']."&agentid=xxx";
$post_data='{
   "button":[
       {
           "type":"click",
           "name":"今日歌曲",
           "key":"V1001_TODAY_MUSIC"
       },
       {
           "name":"菜单",
           "sub_button":[
               {
                   "type":"view",
                   "name":"搜索",
                   "url":"http://www.soso.com/"
               },
               {
                   "type":"click",
                   "name":"赞一下我们",
                   "key":"V1001_GOOD"
               }
           ]
      }
   ]
}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   //因为uri
是https的,所以要跳过证书验证。
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
$output = curl_exec($ch);
curl_close($ch);
print_r($output);
?>

六、ok!!!就是这么简单,自定义菜单创建成功。

这里写图片描述

注意:

  添加自定义菜单只针对创建的应用,而不是企业小助手。如果你给企业小助手进行添加自定义菜单操作,是没有任何卵用的。
2016-06-16 16:09:46 yezhenxu1992 阅读数 1357
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

思路流程如下: 首先通过测试号的信息(appid和secret)获取到接口调用凭据(access_token),然后调用创建自定义菜单的接口。往该微信的URL地址 post 我们想要创建的菜单信息(body), 然后剩下的微信服务器自动帮我们更新好了菜单(你可以先取消关注测试号,再关注测试号,就可以立即看到更新后的菜单。)

步骤1:查看公众号开发者文档

http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html

1) (创建自定义菜单)接口调用请求说明: http请求方式:POST(请使用https协议)
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

因此,我们必须先获取到access_token !

2) 如何获取access_token? 查看文档
http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html

access_token接口调用请求说明如下图所示:
这里写图片描述

其中,appid和secret为测试号的用户及密码,在测试号主页的测试号信息中。

这里写图片描述

步骤2: 在服务器上创建一个menu.js 文件,代码内容如下:


var https = require('https');
var request = require('request');
var Promise = require('promise');  //promise用于流程控制,即保证先获取到access_token,在调用创建自定义菜单接口

var appId = 'wx482687a49f5f45b3'; //记得换成你自己测试号的信息
var appSecret = 'aca22799b4549eaeaaacf6b652605c1a';

function getToKen(appId, appSecret) {        

    return new Promise(function (resolve, reject) {

        var url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appId + '&secret=' + appSecret;
        request({
            uri : url
        }, function (err, res, data) {
            var result = JSON.parse(data);
            console.log("result.access_token=", result);

            resolve(result.access_token);  //把获取的access_token返回去
        });

    });

}

   //menu为创建自定义菜单的具体内容,也就是post到微信服务器的body
var menu = {          
    "button" : [{
            "name" : "我的账号",
            "sub_button" : [{
                    "type" : "click",
                    "name" : "test1",
                    "key" : "V1001_MY_ACCOUNT"
                }, {
                    "type" : "click",
                    "name" : "test2",
                    "key" : "V1002_BID_PROJECTS"
                }, {
                    "type" : "click",
                    "name" : "test3",
                    "key" : "V1003_RETURN_PLAN"
                }, {
                    "type" : "click",
                    "name" : "test4",
                    "key" : "V1004_TRANS_DETAIL"
                }, {
                    "type" : "click",
                    "name" : "test5",
                    "key" : "V1005_REGISTER_BIND"
                }
            ]
        }, {
            "type" : "view",
            "name" : "百度",
            "url" : "http://www.baidu.com/"
        }, {

            "type" : "view",
            "name" : "个人博客",
            "url" : "http://blog.csdn.net/yezhenxu1992/"

        }
    ]
};

var post_str = new Buffer(JSON.stringify(menu));   //先将menu转成JSON数据格式,在赋给post_srt数组

//console.log("JSON.stringify(menu)=", JSON.stringify(menu));
//console.log("post_str.toString()=", post_str.toString());
//console.log("post_str.length", post_str.length);


//调用getToken函数,getToken函数执行完,接下来才执行then函数中的匿名函数,其中,access_token为返回来的参数。
//对promise控制流程的原理操作不熟悉的家伙,请移步度娘,这个技术特别重要!尤其是在基于事件、异步IO的nodejs中,很多时候, 代码的执行顺序并非顺序执行,所以很有必要控制代码的流程。

getToKen(appId, appSecret).then(function (access_token)) {  
    var post_options = {
        host : 'api.weixin.qq.com',
        port : '443',
        path : '/cgi-bin/menu/create?access_token=' + access_token,
        method : 'POST',
        headers : {
            'Content-Type' : 'application/x-www-form-urlencoded',
            'Content-Length' : post_str.length
        }
    };

    var post_req = https.request(post_options, function (response) {
            var responseText = [];
            var size = 0;
            response.setEncoding('utf8');
            response.on('data', function (data) {
                responseText.push(data);
                size += data.length;
            });
            response.on('end', function () {
                console.log("responseText=", responseText);
            });
        });

    post_req.write(post_str);   // 把menu数据post到微信服务器,剩下的微信自动帮我们搞定了。
    post_req.end();
});

运行代码,node menu.js

取消关注测试号,再关注测试号, 一切大功告成! 微信,还真是挺有意思,继续向前……

2015-02-28 13:45:38 afanxingzhou 阅读数 7316
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

1.很多同学都吐槽,搞了个服务号,自然要好好发挥自定义菜单这个得天独厚的功能。
但在开发者模式下,要么通过本地代码上传,但这个很容易失败;
要么编辑好菜单的JSON数据,使用在线生成的办法,但这会遇到一个问题,如果使用记事本保存的JSON代码,粘贴到网页上经常出现invalid key size的错误,原因在于记事本是gb2312编码,网页是utf8编码,况且这个方法也非常容易出错。

那么最好用的自定义菜单生成方式是什么?

首先,搜索“微社区”,立即开通;
进入“管理中心”——“我的公众号”,添加自己的微信公众号,添加公众号
接着,完成添加后,选择“自定义菜单”,右边选择需要修改菜单的公众号,点击“确定”。
修改菜单
在这里可按说明修改!
这是目前我发现的在开发者模式下修改自定义菜单最便捷的方法,与大家共享!更多微信公众平台开发知识,请查看我的专栏哦!有问题可直接加Q:724122005:)

==========2016年4月18日更新=============
以上自定义生成已不可用,
可在此 : http://www.xjabc.net/weixinjiekoukaifa/menu.php 生成。

2017-08-15 09:50:48 zxxz5201314 阅读数 1841
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

我的微信公众号是个人订阅号,个人订阅号不能认证,所以没有自定义菜单的权限。我使用的是微信公众平台提供的一个测试账号。
测试账号
测试号里面会提供一个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:终于审核过了。。。。

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