关于微信公众号地图开发篇2:开发篇

1:在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js

2:通过config接口注入权限验证配置

                                 //将公众号的唯一标识,生成签名的时间戳  ,生成签名的随机串  ,签名,传给微信服务器以便校验配置
                                  wx.config({  
                                         debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以                                                                   在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。  
                                         appId: $("#appId").val(), // 必填,公众号的唯一标识
                                         timestamp:$("#timestamp").val(),// 必填,生成签名的时间戳  
                                         nonceStr: $("#nonceStr").val(),// 必填,生成签名的随机串  
                                         signature: $("#signature").val(),// 必填,签名  
                                         jsApiList: [ 'checkJsApi', 'openLocation','getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表 

                                           //在这个网址的最下面https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
                                      });

3:获取2中需要必填数据的思路,整理如下:

  3.1 :获取access_token

  3.2:获取jsapi_ticket。

     备注jsapi_ticket是公众号用于调用微信JS接口的临时票据,效期7200秒。由于获取jsapi_ticket的api调 用次数非常有 限,频         繁刷新jsapi_ticket会导致api调用受限,影响自身业务,根据需要开发者必须在自己的服务全局缓存 jsapi_ticket 。

  3.3 生成签名

   签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的     URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格       式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加     密,字段名和字段值都采用原始值,不进行URL 转义。生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调     用微信JS接口的临时票据。

4:生成签名的算法,完整代码如下:

 4.1 获取获取access_token

  public class GetAccessTokenUtil {
    // 网页授权接口
    public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?                           grant_type=client_credential&appid=APPID&secret=SECRET";
    public static Map getAccessToken(String appid, String appsecret) {
        String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret);
        HttpClient client = null;
        Map result = new HashMap();
        String accessToken = null;
        try {
            client = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(requestUrl);
            ResponseHandler responseHandler = new BasicResponseHandler();
            String response = client.execute(httpget, responseHandler);
            JSONObject OpenidJSONO = JSONObject.fromObject(response);
            accessToken = String.valueOf(OpenidJSONO.get("access_token"));
            result.put("accessToken", accessToken);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.getConnectionManager().shutdown();
        }
        return result;
    }
}

4.2:获取jsapi_ticket。

public class JsapiTicketUtil {
    // 网页授权接口
    public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";

    public static Map JsapiTicket(String accessToken) {
        String requestUrl = GetPageAccessTokenUrl.replace("ACCESS_TOKEN", accessToken);
        HttpClient client = null;
        Map result = new HashMap();
        try {
            client = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(requestUrl);
            ResponseHandler responseHandler = new BasicResponseHandler();
            String response = client.execute(httpget, responseHandler);
            JSONObject OpenidJSONO = JSONObject.fromObject(response);
            String errcode = String.valueOf(OpenidJSONO.get("errcode"));
            String errmsg = String.valueOf(OpenidJSONO.get("errmsg"));
            String ticket = String.valueOf(OpenidJSONO.get("ticket"));
            String expires_in = String.valueOf(OpenidJSONO.get("expires_in"));
            result.put("errcode", errcode);
            result.put("errmsg", errmsg);
            result.put("ticket", ticket);
            result.put("expires_in", expires_in);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.getConnectionManager().shutdown();
        }
        return result;
    }
}

4.3:生成签名

public class SignatureUtil {
     public final static String Url = "xxxxxxx/sosHelp.html"; //你所在引入微信js的界面,或者说开发的界面
     public static Map sign(String jsapi_ticket) {
            Map result = new HashMap();
            String nonce_str = create_nonce_str(); 
            String timestamp = create_timestamp();
        
            
            // 注意这里参数名必须全部小写,且必须有序
            String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+nonce_str+"×tamp="+timestamp+"&url="+Url;
            String signature = DigestUtils.sha1Hex(str);
            
            result.put("url", Url);
            result.put("jsapi_ticket", jsapi_ticket);
            result.put("nonceStr", nonce_str);
            result.put("timestamp", timestamp);
            result.put("signature", signature);
            return result;
        }
     
     public static String create_nonce_str() {
            return UUID.randomUUID().toString();
     }
     
     public static String create_timestamp() {
            return Long.toString(System.currentTimeMillis() / 1000);
    }

}

4.4 调用

 @RequestMapping(value = "/getConfig", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    public Map getConfig(HttpServletRequest request) throws Exception {
        //获取token appid是微信公众号的AppID,appsecret是公众号的appsecret
        Map accessToken = GetAccessTokenUtil.getAccessToken(appid,appsecret);
        //获取jsapiTicket
        Map jsapiTicket = JsapiTicketUtil.JsapiTicket(accessToken.get("accessToken"));
        //获取签名
        Map sign = SignatureUtil.sign(jsapiTicket.get("ticket"));
        sign.put("appid", appid);
        System.out.println(accessToken.toString());
        System.out.println(jsapiTicket.toString());
        System.out.println(sign.toString());
        return sign;

    }

你可能感兴趣的:(关于微信公众号地图开发篇2:开发篇)