JAVA版 微信企业号开发 个人总结(微信网页授权例子,微信企业号精准定位,误差5-10米)

来源:互联网 发布:网络加盟店排行榜 编辑:程序博客网 时间:2024/05/25 19:59

总路线

主要内容:案例微信网页授权,企业号精准定位(误差5-10米)
一、 access_token获取
二、 获取js-sdk的权限,票据jsapi_ticket
三、js-sdk的signature
四、js-sdk前台配置,获取精准的经纬度
五、额外附加 java定时器

一、 access_token获取

原理:获取公众号的corpid和corpsecret,对https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的corpid&corpsecret=你的corpsecret进行get请求,返回获取access_token,注意access_token的有效时间为7200秒,而请求access_token的次数是有限的,需要用定时器定时获取(后续讲述定时器,也可以用其他方法代替)

    /**     * http GET请求封装     *      * @param url     * @return     */    public static JSONObject doGet(String url) {        DefaultHttpClient httpClient = new DefaultHttpClient();        HttpGet get = new HttpGet(url);        JSONObject obj = new JSONObject();        try {            HttpResponse response = httpClient.execute(get);            HttpEntity entity = response.getEntity();            if (entity != null) {                String result = EntityUtils.toString(entity, "utf-8");                obj = JSONObject.parseObject(result);            }        } catch (Exception e) {            e.printStackTrace();        }        return obj;    }    /**     * 获取accesstoken,保存access_token     *      * @return     */    public static String getToken() {        String access_token = "";        String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=你的corpid&corpsecret=你的corpsecret";        JSONObject obj = doGet(url);        if (obj != null) {            access_token = obj.getString("access_token");            //这里进行数据存储accesstoken或者全局缓存accesstoken            //---------            //----------        }        return access_token;    }

二、 获取js-sdk的权限,票据jsapi_ticket

原理,通过access_token来换取jsapi_ticket

    /**     * 获取js-sdk的权限,票据ticket     *      * @return     */    public static String ticket() {        String access_token = getToken();// 建议从数据库中获取,或者全局缓存中获取,这只是个本地的例子        JSONObject obj1 = doGet("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + access_token);        if (obj1 != null) {            String jsapi_ticket = obj1.getString("ticket");// 全局缓存jsapi_ticket            //这里进行数据存储jsapi_ticket或者全局缓存jsapi_ticket            //---------            //----------            return jsapi_ticket;        }        return "fail";    }

三、js-sdk的signature

(后台)原理,java后台进行signature(主要进行sha1加密)
后台进行sha1加密,用json格式返回前端,然前端进行处理

/**     * 按照固定的排序方式进行sha1加密     *      * @param url     *            传递进来的url参数     * @return     */    public static JSONObject signature(String url) {        JSONObject obj = new JSONObject();        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMddhh"); // 时间戳格式化,必须取10位        String timestamp = sdFormat.format(new Date());// 当前时间戳        String noncestr = getRandom(9);// 9位随机数        String signature = "jsapi_ticket=" + WxUtil.ticket();// 获取数据        signature += "&" + "noncestr=" + noncestr;        signature += "&" + "timestamp=" + timestamp;        signature += "&" + "url=" + url;        signature = SHA1(signature);        obj.put("timestamp", timestamp);        obj.put("signature", signature);        obj.put("noncestr", noncestr);        System.out.println("\n" + obj);        return obj;    }    /**     * @description: SHA、SHA1加密方法 @parameter: str:待加密字符串 @return: 加密串     **/    public static String SHA1(String str) {        try {            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); // 如果是SHA加密只需要将"SHA-1"改成"SHA"即可            digest.update(str.getBytes());            byte messageDigest[] = digest.digest();            // Create Hex String            StringBuffer hexStr = new StringBuffer();            // 字节数组转换为 十六进制 数            for (int i = 0; i < messageDigest.length; i++) {                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);                if (shaHex.length() < 2) {                    hexStr.append(0);                }                hexStr.append(shaHex);            }            return hexStr.toString();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        return null;    }    /**     * 生成一定位数的随机数     *      * @param length     * @return     */    public static String getRandom(int length) {        String allChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";        StringBuffer sb = new StringBuffer();        Random random = new Random();        for (int i = 0; i < length; i++)            sb.append(allChar.charAt(random.nextInt(allChar.length())));        return sb.toString();    }

四、js-sdk前台配置,获取精准的经纬度

前台,用js进行微信js-sdk的配置
原理:ajax获取wx.config所需要的配置信息,配置成功后进行使用微信自带的定位功能获取经纬度,然后把获得的经纬度通过百度地图的坐标转换api的接口,从而获得在百度地图上获得比较精准的地理位置
执行顺序
wx.config>wx.ready
注意:js中的代码,注意必须先引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.1.0.js 和jq文件

var flag = false;var long = '';var lat = '';wx.ready(function() {                getLocation();            });            function signature() {                $.ajax({                    url: '9',                    data: { 'url': "当前页面url,不包括url#后面的"},                    type: "get",                    dataType: 'json',                    success: function(data) {                    // 可以参考微信企业号开发平台的js-sdk文档                        wx.config({                            appId: '你的cropid', // 必填,公众号的唯一标识                            timestamp: data.timestamp, // 必填,生成签名的时间戳                            nonceStr: data.noncestr, // 必填,生成签名的随机串                            signature: data.signature, //必填,签名                            jsApiList: ['openLocation', 'getLocation', 'chooseImage', 'uploadImage'] // 必填,需要使用的JS接口列表                        });                        flag = true;                    },                    error: function(data) {                        alert('fail');                    }                });            }            //使用微信自带的定位            function getLocation() {                if(flag) {                    wx.getLocation({                        type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'                        success: function(res) {                            var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90                            var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。                            var speed = res.speed; // 速度,以米/每秒计                            var accuracy = res.accuracy; // 位置精度                            changeLocation(longitude, latitude);                        }                    });                } else {                    alert("flag not true");                    signature();                    getLocation();                }            }            //坐标转换API,Web服务API(百度api)            function changeLocation(Long, Lat) {                $.ajax({                    url: "http://api.map.baidu.com/geoconv/v1/?coords=" + Long + "," + Lat + "&from=1&to=5&ak=你的密钥",                    type: "get",                    dataType: 'jsonp',                    success: function(data) {                        long = data.result[0].x;                        lat = data.result[0].y;                        //chooseImg();                    },                    error: function(data) {                        alert('fail');                    }                });            }

五、额外附加 定时器

配置xml文件
使用注解进行定时调度,注意cron是时间

@Componentpublic class TimeTask {    /**     *      * 秒 0-59 , - * /      * 分 0-59 , - * /      * 小时 0-23 , - * /      * 日期 1-31 , - * ? / L W C      * 月份 1-12 或者 JAN-DEC , - * /      * 星期 1-7 或者 SUN-SAT , - * ? / L C #      * 年(可选)留空, 1970-2099 , - * /     * cron = "0 0 0/1 * * ?"相当于每小时进行一次操作     * @throws Exception     */    @Scheduled(cron = "0 0 0/1 * * ?")    public void task() throws Exception {        System.out.println("---------------------task start--------------------");        //调用你的获取access_token的方法,调用你的获取jsapi_ticket的方法        System.out.println("---------------------task end--------------------");    }}

相关xml的配置
这里写图片描述

相关代码:

<beans xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=http://www.springframework.org/schema/task      http://www.springframework.org/schema/task/spring-task-3.2.xsd">   <!-- 设置定时任务 -->    <task:annotation-driven/>    </beans>
1 0
原创粉丝点击