• 最新文档:微信、企业号+地理位置定位+地图展示


    概述

    公司有需求,通过企业号打卡项目,需要用到企业微信定位

    详细

    前言

         demo是基于微信、企业号平台的一个定位,地图展示项目

        后台使用springboot架构搭建的与微信交互的服务,使用httpclient连接池,调用微信接口,并且使用到Sha-1加密签名。

        客户端使用微信提供的js-sdk,遵守微信认证规则,授权使用微信开放接口

        

        使用微信、企业号定位并展示效果图:

    20190717191206.jpg

            前期准备:

    image.png

    image.png

    一、项目结构

    image.png

    二、服务端实现步骤

        1、项目初始化获取access_token(access_token作为企业号与微信交互的令牌,项目初始化时可通过调用微信接口,换取access_token,并在本地缓存,有效期两小时)

        代码示例:

    1. public static void refreshAccessToken() {
    2. if(access_token_time !=0 && System.currentTimeMillis() < access_token_time ) return;
    3. Map<String, String> params = new HashMap<String, String>();
    4. params.put("corpid", CORPID);
    5. params.put("corpsecret",CORPSECRET);
    6. String resJson = HttpClientUtil.doGet(
    7. "https://qyapi.weixin.qq.com/cgi-bin/gettoken", params);
    8. WeChatAccessTokenResres = JSONObject.toJavaObject(JSONObject.parseObject(resJson), WeChatAccessTokenRes.class);
    9. access_token = res.getAccess_token();
    10. access_token_time = System.currentTimeMillis()+6900;
    11. }

      2、换取jsapi_ticket(使用微信的sdk,需要使用access_token换取jsapi_ticket作为票据,有效期也是两小时)

    代码示例:

    1. public static void getJsapiTicket() {
    2. if(jsapi_ticket_time !=0 && jsapi_ticket_time > System.currentTimeMillis()) return;
    3. String resJson = HttpClientUtil.doGet(
    4. "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token="
    5. + access_token, null);
    6. JSONObject jsonRes = JSONObject.parseObject(resJson);
    7. jsapi_ticket = (String) jsonRes.get("ticket");
    8. jsapi_ticket_time = System.currentTimeMillis()+6900;
    9. }

    3、生成签名:  signature(拿到了jsapi_ticket,后需要访问的url,时间戳,jsapi_ticket,拼成字符串使用sha-1加密算法生成签名)

    代码示例:

    1. public static String getSignature(String noncestr, String timestamp,
    2. String url) throws NoSuchAlgorithmException,
    3. UnsupportedEncodingException {
    4. String item = "jsapi_ticket="+jsapi_ticket + "&noncestr=" + noncestr + "×tamp="
    5. + timestamp + "&url=" + url;
    6. MessageDigest crypt = MessageDigest.getInstance("SHA-1");
    7. crypt.reset();
    8. crypt.update(item.getBytes("UTF-8"));
    9. String signature = byteToHex(crypt.digest());
    10. return signature;
    11. }

    4、拿到签名后,需要将 时间戳,签名回调 给前端

        代码示例:

    1. @RequestMapping("getSignature")
    2. @ResponseBody
    3. public Map<String,String> getSignature(String url){
    4. WechatConfigs.refreshAccessToken();
    5. WechatConfigs.getJsapiTicket();
    6. String noncestr = WechatConfigs.creatNoncestr();
    7. String timestamp = WechatConfigs.getTimeStamp();
    8. String signature ="";
    9. try {
    10. signature = WechatConfigs.getSignature(noncestr, timestamp, url);
    11. } catch (NoSuchAlgorithmException e) {
    12. // TODO Auto-generated catch block
    13. e.printStackTrace();
    14. } catch (UnsupportedEncodingException e) {
    15. // TODO Auto-generated catch block
    16. e.printStackTrace();
    17. }
    18. Map<String,String> result = new HashMap<String, String>();
    19. result.put("noncestr", noncestr);
    20. result.put("timestamp", timestamp);
    21. result.put("signature", signature);
    22. return result;
    23. }
    三、前端实现步骤

        1、类库引用

    <script type="text/javascript" src="./js/jweixin-1.2.0.js"></script>

       2、初始化获取签名,时间戳,随机字符串

        代码示例:

    1. var url =window.location.href;
    2. var noncestr = "";
    3. var timestamp = "";
    4. var signature = "";
    5. debugger;
    6. $.ajax({
    7. url:"../demo/getSignature",
    8. type:"post",
    9. data:{url:url},
    10. dataType:"json",
    11. async:false,
    12. success:function(res){
    13. noncestr = res.noncestr;
    14. timestamp = res.timestamp;
    15. signature = res.signature;
    16. }
    17. });

     3、微信初始化配置

        代码示例:

    1. wx.config({
    2. beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
    3. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    4. appId: '', // 必填,企业微信的corpID
    5. timestamp:timestamp, // 必填,生成签名的时间戳
    6. nonceStr: noncestr, // 必填,生成签名的随机串
    7. signature: signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法
    8. jsApiList: ['openLocation','getLocation'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
    9. });

    4、调用微信js-sdk接口

    代码示例:

    1. wx.getLocation({
    2. type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
    3. success: function (res) {
    4. debugger;
    5. var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
    6. var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180
    7. var speed = res.speed; // 速度,以米/每秒计
    8. var accuracy = res.accuracy; // 位置精度
    9. wx.openLocation({
    10. latitude: latitude, // 纬度,浮点数,范围为90 ~ -90
    11. longitude: longitude, // 经度,浮点数,范围为180 ~ -180
    12. name: '武汉', // 位置名
    13. address: '', // 地址详情说明
    14. scale: 16, // 地图缩放级别,整形值,范围从1~28。默认为16
    15. });
    16. }
    17. });
    四、运行项目,在微信,企业号,访问url

     

    image.png

  • 相关阅读:
    《Java 进阶之路》 下--推荐书籍
    Xshell连接不上虚拟机的解决办法
    git init报错:‘git‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    Oracle Primavera Unifier文档管理器(Document Manager)
    mongodb
    (数据科学学习手札159)使用ruff对Python代码进行自动美化
    【C语言】字符串逆序
    国庆作业1
    Python处理Excel表格
    Mybatis工具—反射工具(MetaClass)
  • 原文地址:https://blog.csdn.net/hanjiepo/article/details/133251260