微信公众号开发指南Java(二)

        本文主要介绍微信公众号(服务号)开发的简要流程和常见问题,官方版的公众号开发文档请见地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432

2    开发基本配置
2.1    设置开发者ID和密码
申请到账号后,微信会给每个服务号分配一个唯一的开发者ID(AppID),开发者登录到微信公众平台,可以设置开发者密码(AppSecret)。AppID和AppSecret将作为服务号重要的识别参数与微信后台交互。
 
2.2    配置公众号服务器
公众号(服务号)如果需要配置菜单并和用户进行交互(如获取用户的openID/微信后台ID),则需要配置公众号服务器。公众号服务器由开发者提供,需要支持外网域名访问。
2.2.1    配置服务器地址
服务器地址配置样例如下:


    其中服务器地址(URL)将需要接收微信后台的验证访问,并作出正确的响应。其过程如下:
(1)    微信后台向此地址发送GET请求,并带有参数signature、timestamp、nonce和echostr。
(2)    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
(1)    将token、timestamp、nonce三个参数进行字典序排序。
(2)    将三个参数字符串拼接成一个字符串进行sha1加密。
(3)    开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
注:token即图中配置的令牌(Token)mydomainstockToken

2.2.2    示例代码
/**
 * 微信开放平台的服务器认证配置,用于Token验证
 * 
 * @return 请求结果数据
 */
@RequestMapping(value = "/wechatstock/wx.do", method = RequestMethod.GET)
@ResponseBody
public String wechatTokenAuth(HttpServletRequest request) {
    String response = null;
    try {
        LOGGER.debug("receive wechat token GET request.");
        // 校验微信后台请求数据
        String nonce = RequestUtils.getNeedString(request, "nonce", "nonce is empty!");
        String signature = RequestUtils.getNeedString(request, "signature", "signature is empty!");
        String timestamp = RequestUtils.getNeedString(request, "timestamp", "timestamp is empty!");
        LOGGER.debug("nonce is: {}", nonce);
        LOGGER.debug("signature is: {}", signature);
        LOGGER.debug("timestamp is: {}", timestamp);
        String[] array = new String[] { MobileConfig.getWechatToken(), timestamp, nonce };
        Arrays.sort(array);
        StringBuilder sb = new StringBuilder();
        for (String str : array) {
            sb.append(str);
        }
        String md = CrypUtil.encryptHashStr(sb.toString(), "SHA1");
        LOGGER.debug("md is: {}", md);
        if (!md.equalsIgnoreCase(signature)) {
            throw new Exception("md and signature not match!");
        } else {
            LOGGER.debug("md and signature match.");
        }
        // 将微信后台发过来的字符串返回,作为验签成功的标记
        response = RequestUtils.getString(request, "echostr");
        LOGGER.debug("response data: {}", response);
    } catch (Exception e) {
        LOGGER.error("wechat token validation failed!", e);
        response = e.getMessage();
    }
    return response;
}

2.3    获取access_token
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
    access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
2.3.1    access_token生成方式
(1)建议公众号开发者使用中控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

(2)目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

(3)Access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。

2.3.2    access_token获取方法
access_token的获取方法比较简单,只需向微信后台发起一个http get请求即可。

(1)接口调用请求说明
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

(2)参数说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret

(3)返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}

2.4    配置公众号菜单
获取access_token后,即可通过http post请求配置公众号菜单。
2.4.1    自定义菜单创建接口
(1)自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
(2)一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
(3)创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
2.4.2    自定义菜单接口可实现多种类型按钮
(1)click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
(2)view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
(3)scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
其他类型请见官方接口:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013

2.4.3    接口调用请求说明
http请求方式:POST(请使用https协议) 
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

示例:
{
    "button": [{
        "type": "view",
        "name": "我的首页",
        "url": "http://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe649dc08bf553be2&redirect_uri=https%3a%2f%2fwww.mydomain.com%2fwechatstock%2ftrade%2fsendform.do&response_type=code&scope=snsapi_base&state=123#wechat_redirect"
    },
    {
        "type": "view",
        "name": "沪深300",
        "url": "http://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe649dc08bf553be2&redirect_uri=https%3a%2f%2fwww.mydomain.com%2fwechatstock%2findex.do&response_type=code&scope=snsapi_base&state=123#wechat_redirect"
    },
    {
        "name": "联系我们",
        "sub_button": [{
            "type": "view",
            "name": "帮助中心",
            "url": "https://www.mydomain.com/wechatstock/faq/index.do"
        },
        {
            "type": "view",
            "name": "意见反馈",
            "url": "https://www.mydomain.com/wechatstock/feedback/feedbackform.do"
        }]
    }]
}

效果:


2.5    小结
本节的四个步骤是配置微信公众号开发的基本步骤。此时微信公众号已具备基本的开发环境,为后续的高级接口功能做好了准备。
 

猜你喜欢

转载自blog.csdn.net/hualei_c/article/details/87988978