zoukankan      html  css  js  c++  java
  • 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)

    在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础:

    1、微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口。

    2、微信开发之通过代理调试本地项目,该文章详细讲解了如何调试本地项目,使用工具的详细安装与配置。

    3、微信开发之使用java获取签名signature(贴源码,附工程),该文详细讲些了如何获取签名,代码十分详细。

    对于初学者,可能还不知道订阅号、服务号、和企业号的区别,博主之前也是一直没有弄清楚,因此查阅资料整理了一篇博客供大家阅读:微信服务号、订阅号和企业号的区别(运营和开发两个角度)。建议有时间得猿友还是阅读一下为好。

    上面的文章内容虽然有点多而且繁琐,看完之后不敢说已经入门,但是初步了解,自己写实例是没有问题的。不积跬步无以至千里,希望猿友们耐心继续下去!!!!!!

    上面的文章内容虽然有点多而且繁琐,看完之后不敢说已经入门,但是初步了解,自己写实例是没有问题的。不积跬步无以至千里,希望猿友们耐心继续下去!!!!!!

     上面的文章内容虽然有点多而且繁琐,看完之后不敢说已经入门,但是初步了解,自己写实例是没有问题的。不积跬步无以至千里,希望猿友们耐心继续下去!!!!!!

    期间可能会遇到一些坑,欢迎与博主评论交流

    有了上面的基础,接下来博主将分享一个具体的微信开发实例,获取用户当前的地理位置。

    一、结果演示

    这里写图片描述 这里写图片描述 这里写图片描述 这里写图片描述

    二、代码及代码讲解

    本工程使用的环境是Eclipse + maven + springmvc,下面附上关键代码,springmvc和web.xml相关配置和maven相关依赖就不一一列举,最后会附上工程供大家下载。

    2.1、获取签名工具类(httpclient和sha1加密)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    package com.luo.util;
     
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.UUID;
    import net.sf.json.JSONObject;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.ParseException;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.HttpUriRequest;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.protocol.HTTP;
    import org.apache.http.util.EntityUtils;
     
    public class HttpXmlClient {
     
        public static String post(String url, Map<String, String> params) {
            DefaultHttpClient httpclient = new DefaultHttpClient();
            String body = null;
            HttpPost post = postForm(url, params);
            body = invoke(httpclient, post);
            httpclient.getConnectionManager().shutdown();
            return body;
        }
     
        public static String get(String url) {
            DefaultHttpClient httpclient = new DefaultHttpClient();
            String body = null;
            HttpGet get = new HttpGet(url);
            body = invoke(httpclient, get);
            httpclient.getConnectionManager().shutdown();
            return body;
        }
     
        private static String invoke(DefaultHttpClient httpclient,
                HttpUriRequest httpost) {
            HttpResponse response = sendRequest(httpclient, httpost);
            String body = paseResponse(response);
            return body;
        }
     
        private static String paseResponse(HttpResponse response) {
            HttpEntity entity = response.getEntity();
            String charset = EntityUtils.getContentCharSet(entity);
            String body = null;
            try {
                body = EntityUtils.toString(entity);
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return body;
        }
     
        private static HttpResponse sendRequest(DefaultHttpClient httpclient,
                HttpUriRequest httpost) {
            HttpResponse response = null;
            try {
                response = httpclient.execute(httpost);
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return response;
        }
     
        private static HttpPost postForm(String url, Map<String, String> params) {
     
            HttpPost httpost = new HttpPost(url);
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
     
            Set<String> keySet = params.keySet();
            for (String key : keySet) {
                nvps.add(new BasicNameValuePair(key, params.get(key)));
            }
     
            try {
                httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
     
            return httpost;
        }
     
        public static void main(String[] args) {
     
            //获取access_token
            Map<String, String> params = new HashMap<String, String>();
            params.put("corpid","wx5f24fa0db1819ea2");
            params.put("corpsecret","uQtWzF0bQtl2KRHX0amekjpq8L0aO96LSpSNfctOBLRbuYPO4DUBhMn0_v2jHS-9");
            String xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/gettoken",params);
            JSONObject jsonMap  = JSONObject.fromObject(xml);
            Map<String, String> map = new HashMap<String, String>();
            Iterator<String> it = jsonMap.keys(); 
            while(it.hasNext()) { 
                String key = (String) it.next(); 
                String u = jsonMap.get(key).toString();
                map.put(key, u); 
            }
            String access_token = map.get("access_token");
            System.out.println("access_token=" + access_token);
     
            //获取ticket
            params.put("access_token",access_token);
            xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket",params);
            jsonMap  = JSONObject.fromObject(xml);
            map = new HashMap<String, String>();
            it = jsonMap.keys(); 
            while(it.hasNext()) { 
                String key = (String) it.next(); 
                String u = jsonMap.get(key).toString();
                map.put(key, u); 
            }
            String jsapi_ticket = map.get("ticket");
            System.out.println("jsapi_ticket=" + jsapi_ticket);
     
            //获取签名signature
            String noncestr = UUID.randomUUID().toString();
            String timestamp = Long.toString(System.currentTimeMillis() / 1000);
            String url="http://mp.weixin.qq.com";
            String str = "jsapi_ticket=" + jsapi_ticket +
                    "&noncestr=" + noncestr +
                    "&timestamp=" + timestamp +
                    "&url=" + url;
            //sha1加密
            String signature = SHA1(str);
            System.out.println("noncestr=" + noncestr);
            System.out.println("timestamp=" + timestamp);
            System.out.println("signature=" + signature);
            //最终获得调用微信js接口验证需要的三个参数noncestr、timestamp、signature
        }
     
           /**
         * @author:罗国辉
         * @date: 2015年12月17日 上午9:24:43
         * @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;
        }
    }

    2.2、controller代码(尽可能仔细阅读下面的每一行代码,特别是url部分)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    package com.luo.controller;
     
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.UUID;
    import javax.servlet.http.HttpServletRequest;
    import net.sf.json.JSONObject;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
     
    import com.luo.util.HttpXmlClient;
     
    @Controller 
    public class UserController { 
     
        @RequestMapping("/")   
        public ModelAndView getIndex(HttpServletRequest request){ 
     
            ModelAndView mav = new ModelAndView("index"); 
            //获取access_token
            Map<String, String> params = new HashMap<String, String>();
            params.put("corpid","wx7099477f2de8aded");
            params.put("corpsecret","4clWzENvHVmpcyuA4toys0URkfYanIqWtxZ5plbisn6Cd5AVTF0thpaK6UAhjIvN");
            String xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/gettoken",params);
            JSONObject jsonMap  = JSONObject.fromObject(xml);
            Map<String, String> map = new HashMap<String, String>();
            Iterator<String> it = jsonMap.keys(); 
            while(it.hasNext()) { 
                String key = (String) it.next(); 
                String u = jsonMap.get(key).toString();
                map.put(key, u); 
            }
            String access_token = map.get("access_token");
     
            //获取ticket
            params.put("access_token",access_token);
            xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket",params);
            jsonMap  = JSONObject.fromObject(xml);
            map = new HashMap<String, String>();
            it = jsonMap.keys(); 
            while(it.hasNext()) { 
                String key = (String) it.next(); 
                String u = jsonMap.get(key).toString();
                map.put(key, u); 
            }
            String jsapi_ticket = map.get("ticket");
     
            //获取签名signature
            String noncestr = UUID.randomUUID().toString();
            String timestamp = Long.toString(System.currentTimeMillis() / 1000);
            //获取请求url
            String path = request.getContextPath();
            //以为我配置的菜单是http://yo.bbdfun.com/first_maven_project/,最后是有"/"的,所以url也加上了"/"
            String url = request.getScheme() + "://" + request.getServerName() +  path + "/"
            String str = "jsapi_ticket=" + jsapi_ticket +
                    "&noncestr=" + noncestr +
                    "&timestamp=" + timestamp +
                    "&url=" + url;
            //sha1加密
            String signature = HttpXmlClient.SHA1(str);
            mav.addObject("signature", signature);  
            mav.addObject("timestamp", timestamp);  
            mav.addObject("noncestr", noncestr);  
            mav.addObject("appId", "wx7099477f2de8aded");
            System.out.println("jsapi_ticket=" + jsapi_ticket);
            System.out.println("noncestr=" + noncestr);
            System.out.println("timestamp=" + timestamp);
            System.out.println("url=" + url);
            System.out.println("str=" + str);
            System.out.println("signature=" + signature);
            return mav;   
     
        }   
    }

    2.3、前端js代码(尽可能仔细阅读下面的每一行代码)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <html>
    <head>
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script>
        wx.config({
            debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: '${appId}', // 必填,企业号的唯一标识,此处填写企业号corpid
            timestamp: parseInt("${timestamp}",10), // 必填,生成签名的时间戳
            nonceStr: '${noncestr}', // 必填,生成签名的随机串
            signature: '${signature}',// 必填,签名,见附录1
            jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });
        wx.ready(function(){
        });
     
        wx.error(function(res){
        });
    </script>
    </head>
    <body>
    <button id="getBBS" style="1000px;height:600px;font-size:150px;" onclick="submitOrderInfoClick();">获取地理位置</button>
    </body>
    <script type="text/javascript">
    function submitOrderInfoClick(){
      wx.getLocation({
            success: function (res) {
                alert("小宝鸽获取地理位置成功,经纬度为:(" + res.latitude + "," + res.longitude + ")" );
            },
            fail: function(error) {
                AlertUtil.error("获取地理位置失败,请确保开启GPS且允许微信获取您的地理位置!");
            }
        });
    }
    </script>
    </html>

    三、源码下载

    http://download.csdn.net/detail/u013142781/9400470

     

     
  • 相关阅读:
    前端性能优化总结
    Vue style 深度作用选择器 >>> 与 /deep/(sass/less)
    NPM依赖包版本号~和^的区别及最佳实践
    umi部分使用总结
    FIS 插件机制
    从0到1发布一个npm包
    页面性能监控之performance
    1和new Number(1)有什么区别
    实现一个hoverDelay延迟hover
    触发浏览器回流的属性方法一览表
  • 原文地址:https://www.cnblogs.com/wangtj-19/p/5896649.html
Copyright © 2011-2022 走看看