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

总路线

主要内容:案例微信网页授权,企业号精准定位(误差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是时间

@Component
public 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值