分享至微信的页面怎么使用微信的api获取位置信息

2020-02-13  本文已影响0人  木头就是我呀

要实现一个如下功能:
在分享到微信的页面,怎么使用微信的接口获取定位信息

1.首先需要有微信开发者账号

微信开发者平台

2.找到开发者文档

3.绑定域名

4. 引入所需的JS文件

5.配置IP白名单

6.后台进行加密算法

package com.mutou.testApi.controller;

import com.alibaba.fastjson.JSON;
import com.mutou.testApi.dto.GetTicketDto;
import com.mutou.testApi.dto.GetTokenDto;
import com.mutou.testApi.plugins.CheckEmptyUtil;
import com.mutou.testApi.plugins.RedisTemplateService;
import com.mutou.testApi.plugins.Sha1Util;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author 杨喜存
 * @since 2020/2/12 3:46 PM
 */
@RestController
@ResponseBody
@RequestMapping("/test")
public class TestController {

  private String APP_ID = "your app_id";
  private String SECRET = "your secret";
  private String GRAND_TYPE = "client_credential";
  private String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?"
      + "grant_type="+GRAND_TYPE
      + "&appid="+APP_ID
      + "&secret="+SECRET;

  private String TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=";
  @Resource private RedisTemplateService redisTemplateService;

  @GetMapping("/get-signature")
  Map<String,String> test(@RequestParam("nonceStr") String nonceStr,
            @RequestParam("timestamp") String timestamp,
            @RequestParam("url") String url) throws NoSuchAlgorithmException {
    // springboot中使用RestTemplate代替httpClient请求
    RestTemplate restTemplate = new RestTemplate();
    // 缓存access_token
    String token = redisTemplateService.get("token",String.class);
    if(CheckEmptyUtil.isEmpty(token)){
      // 发送get请求 获取access_token 并缓存
      GetTokenDto resultDto = restTemplate.getForObject(TOKEN_URL, GetTokenDto.class);
      token = resultDto.getAccess_token();
      redisTemplateService.set("token", token, 2L, TimeUnit.HOURS);
    }
    // 将access_token拼接在获取ticket的接口上
    TICKET_URL = TICKET_URL+ token;
    // 缓存ticket
    String ticket = redisTemplateService.get("ticket",String.class);
    if(CheckEmptyUtil.isEmpty(ticket)){
      // 发送get请求 获取ticket 并缓存
      GetTicketDto getTicketDto = restTemplate.getForObject(TICKET_URL, GetTicketDto.class);
      ticket = getTicketDto.getTicket();
      redisTemplateService.set("ticket",ticket,2L,TimeUnit.HOURS);
    }

    // 按ascii升序进行排列
    String str1 =
        "jsapi_ticket="+ticket
            + "&noncestr="+nonceStr
            + "&timestamp="+timestamp
            + "&url="+url;
    System.out.println("jsapi_ticket:"+ticket);
    System.out.println("timestamp:"+timestamp);
    System.out.println("url:"+url);
    // 进行sha1加密
    String sha1Str = Sha1Util.getSha1(str1.getBytes());
    System.out.println(sha1Str);
    Map<String,String> result = new HashMap<>();
    result.put("url",url);
    result.put("token",token);
    result.put("jsapi_ticket",ticket);
    result.put("signature",sha1Str); // 主要 其他的返回值只是为了测试用
    // 返回
    return result;
  }
}

7. 前端代码

<template>
    <div>
        <a @click="onShareClick">点击分享</a>
    </div>
</template>

<script>
    export default {
        name: "TestShare",
        mounted() {
            this.getSignature()
        },
        methods: {
            getSignature() {
                // 时间戳
                let timestamp =  (new Date()).valueOf();
                timestamp = String(timestamp).substr(0,String(timestamp).length-3)
                // 随机字符串
                let nonceStr = timestamp;
                // url - 地址栏中的#前的url
                let url = encodeURIComponent(location.href.split('#')[0])
                // 全部参数
                let param = `?timestamp=${timestamp}&nonceStr=${nonceStr}&url=${url}`;
                this.$axios.get(`test/get-signature${param}`).then(res=>{
                    console.log(res.data)
                    let signature = res.data.signature

                    let wx = window.wx;
                    wx.config({
                        debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                        appId: 'your app_id', // 必填,公众号的唯一标识
                        timestamp: timestamp, // 必填,生成签名的时间戳
                        nonceStr: nonceStr, // 必填,生成签名的随机串
                        signature: signature,// 必填,签名
                        jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表
                    });
                    wx.ready(function(){
                        // alert('成功');
                        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; // 位置精度

                                alert("位置获取成功-"+latitude)
                            }
                        });
                    });
                    window.wx.error(function(res){
                        // alert('失败');
                    });
                    console.log(signature);
                }).catch(err=>{
                    console.log(err);
                })
            },
            onShareClick() {
                console.log('sss');
            }
        }
    }
</script>

8. 流程总结

上一篇下一篇

猜你喜欢

热点阅读