目录

一、前言

二、百度地图开放平台配置

三、在IDEA中完成配置

四、用微信小程序测试

五、常见问题处理方法


一、前言

本博客主要记录本人在完成Day09基于百度地图开放平台实现校验收货地址是否超出配送范围的相关配置以及遇到的相关问题

二、百度地图开放平台配置

百度地图开放平台官网如下:

百度地图-百万开发者首选的地图服务商,提供专属的行业解决方案

由于在学习苍穹外卖之前我就注册过百度地图开放平台的账号,所以注册这一块我就不再赘述了。成功登录之后点击右上角账号名字左边的“控制台”

然后点击左侧的“应用管理”,再点击“我的应用”,然后点击“创建应用”

“应用名称”自己填,我就直接填苍穹外卖,然后“应用类型”选择“服务端”(亲测可行,一开始看见下面的提示还准备纠结选浏览器端还是微信小程序端),下面的“启用服务”不用动

拉到下面,“校验方式”不要动就选IP白名单,然后把“0.0.0.0/0”填写到白名单框中(由于我之前创过一个应用是sn校验方式,一开始我改成了sn校验方式,这种方式就没有IP白名单这个框了,但是实际到后面yml文件配置除了要ak还要加上sk,可能sk还要注入,反正我没搞出来)。都搞完就可以点击“提交”

创建好的效果如图

三、在IDEA中完成配置

这部分可以直接按照给出的参考答案来导入代码

在application.yml中配置店家地址(我是用的自己学校的地址,亲测可行),然后ak就是把刚刚创建好的应用的ak复制过来

回到OrderServiceImpl中注入配置项(上面的全局变量orders是跳过微信支付搞的,如果和你的代码不太一样不要奇怪)

导入的代码如下

    @Value("${sky.shop.address}")
    private String shopAddress;
    @Value("${sky.baidu.ak}")
    private String ak;

在OrderServiceImpl的最后导入checkOutOfRange方法,刚导进去爆红导一下包就行(选alibaba的fastjson),导入的代码可以在参考答案中找到,也可以用我下面给的,一样的

导入的代码如下

    /**
     * 检查客户的收货地址是否超出配送范围
     * @param address
     */
    private void checkOutOfRange(String address) {
        Map map = new HashMap();
        map.put("address",shopAddress);
        map.put("output","json");
        map.put("ak",ak);

        //获取店铺的经纬度坐标
        String shopCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        JSONObject jsonObject = JSON.parseObject(shopCoordinate);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("店铺地址解析失败");
        }

        //数据解析
        JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");
        String lat = location.getString("lat");
        String lng = location.getString("lng");
        //店铺经纬度坐标
        String shopLngLat = lat + "," + lng;

        map.put("address",address);
        //获取用户收货地址的经纬度坐标
        String userCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        jsonObject = JSON.parseObject(userCoordinate);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("收货地址解析失败");
        }

        //数据解析
        location = jsonObject.getJSONObject("result").getJSONObject("location");
        lat = location.getString("lat");
        lng = location.getString("lng");
        //用户收货地址经纬度坐标
        String userLngLat = lat + "," + lng;

        map.put("origin",shopLngLat);
        map.put("destination",userLngLat);
        map.put("steps_info","0");

        //路线规划
        String json = HttpClientUtil.doGet("https://api.map.baidu.com/directionlite/v1/driving", map);

        jsonObject = JSON.parseObject(json);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("配送路线规划失败");
        }

        //数据解析
        JSONObject result = jsonObject.getJSONObject("result");
        JSONArray jsonArray = (JSONArray) result.get("routes");
        Integer distance = (Integer) ((JSONObject) jsonArray.get(0)).get("distance");

        if(distance > 5000){
            //配送距离超过5000米
            throw new OrderBusinessException("超出配送范围");
        }
    }

找到submitOrder这个用户下单的方法(就是这个实现类的第一个方法),在下图位置加上调用校验方法的代码

导入代码如下

        //检查用户的收货地址是否超出配送范围
        checkOutOfRange(addressBook.getCityName() + addressBook.getDistrictName() + addressBook.getDetail());

四、用微信小程序测试

用微信小程序提交订单,我的店家地址改成了广东广州,这里下单地址我就搞了北京来测试,点击“去支付”,此时微信小程序的页面是不会变化的,我们要通过IDEA控制台或者是微信小程序的控制台来判断测试是否成功

测试成功的话IDEA控制台会出现异常信息:超出配送范围

测试成功的话微信小程序控制台也会出现超出配送范围的

五、常见问题处理方法

第一个问题:如果IDEA控制台出现异常信息:店铺地址解析失败,如果你选择的不是IP白名单而是sn校验方式,建议直接删掉应用重新创建一个用IP白名单的应用。因为我一开始就是用sn校验方式,发现要多配置个sk然后可能还有其他的配置问题(反正我没搞出来,按照我的流程亲测没有问题)

第二个问题:超出配送范围,IDEA控制台和微信小程序控制台都会出现报错信息,但是微信小程序的前端页面点击完“去支付”实际是没有任何变化的,如何优化使微信小程序页面出现提示信息

如下图,我们找到common包下的vendor.js,然后按Ctrl + F然后搜索submitOrderSubmit

下拉在拨打电话注释前面,图中框起来的分号前面加上一个回调函数

加上回调函数的代码长这样,导入代码下面会给出

导入代码如下

.catch(function (error) {
        // 处理错误响应
        console.error('请求失败:', error);
        uni.showToast({
          title: error.msg || '请求失败',
          icon: 'none'
        });
      })

重新编译微信小程序代码,然后在提交订单页面点击”去支付“,就会跳出“超出配送范围的提示信息”

更多推荐