一、地理位置授权核心实现
1. 微信小程序授权流程
```javascript
// 1. 检查授权状态
wx.getSetting({
success(res) {
if (!res.authSetting[scope.userLocation]) {
// 2. 触发授权弹窗
wx.authorize({
scope: scope.userLocation,
success() {
getLocation(); // 授权成功获取坐标
},
fail() {
// 3. 用户拒绝授权时的引导
wx.showModal({
title: 位置服务提示,
content: 需要获取您的位置以提供精准配送服务,
success(modalRes) {
if (modalRes.confirm) {
wx.openSetting({ // 跳转设置页手动开启
success(settingRes) {
if (settingRes.authSetting[scope.userLocation]) {
getLocation();
}
}
});
}
}
});
}
});
} else {
getLocation();
}
}
});
// 获取经纬度函数
function getLocation() {
wx.getLocation({
type: wgs84, // 返回GPS坐标
success(res) {
const { latitude, longitude } = res;
// 调用后端接口解析详细地址
wx.request({
url: https://api.example.com/reverseGeocode,
data: { lat: latitude, lng: longitude },
success(apiRes) {
// 更新UI显示配送范围
updateDeliveryInfo(apiRes.data);
}
});
}
});
}
```
2. 授权优化策略
- 首次启动引导:在用户首次进入小程序时,通过弹窗说明位置授权的必要性
- 渐进式授权:先请求基础位置权限,在用户进入配送页面时再请求精确位置
- 错误处理:
```javascript
wx.getLocation({
fail(err) {
if (err.errMsg.includes(auth denied)) {
showFallbackUI(); // 显示手动输入地址的备选方案
}
}
});
```
二、万象源码部署要点(以Node.js为例)
1. 基础环境配置
```bash
安装依赖
npm install koa @koa/router koa-bodyparser koa-static
npm install @tencentcloud/tencentcloud-sdk-nodejs-lbs 腾讯地图SDK
```
2. 核心服务实现
```javascript
const Koa = require(koa);
const Router = require(@koa/router);
const LBS = require(@tencentcloud/tencentcloud-sdk-nodejs-lbs).v20200304;
const app = new Koa();
const router = new Router();
// 腾讯地图密钥配置
const clientConfig = {
credential: {
secretId: YOUR_SECRET_ID,
secretKey: YOUR_SECRET_KEY
},
region: ap-guangzhou,
profile: {
httpProfile: { endpoint: lbs.tencentcloudapi.com }
}
};
// 逆地址解析接口
router.get(/reverseGeocode, async (ctx) => {
const { lat, lng } = ctx.query;
const client = new LBS.Client(clientConfig);
const params = {
"Latitude": parseFloat(lat),
"Longitude": parseFloat(lng),
"GetPoi": 1 // 返回周边POI信息
};
try {
const res = await client.ReverseGeocoder(params);
ctx.body = {
address: res.Result.Address,
district: res.Result.AddressComponent.District,
deliveryTime: calculateDeliveryTime(lat, lng) // 调用配送时间计算
};
} catch (err) {
ctx.status = 500;
ctx.body = { error: 地图服务异常 };
}
});
// 配送时间计算(示例)
function calculateDeliveryTime(lat, lng) {
// 实际应调用路径规划API或基于网格的预计算
const distance = getDistance(lat, lng, STORE_LAT, STORE_LNG);
return Math.ceil(distance / 500) * 10; // 每500米10分钟
}
app.use(router.routes());
app.listen(3000, () => console.log(Server running on port 3000));
```
三、精准配送系统设计
1. 三级配送范围管理
```javascript
// 数据库模型示例(MongoDB)
const deliverySchema = new mongoose.Schema({
storeId: String,
ranges: [
{
type: { type: String, enum: [circle, polygon] },
center: { lat: Number, lng: Number }, // 圆形范围中心点
radius: Number, // 圆形半径(米)
polygon: [{ lat: Number, lng: Number }], // 多边形顶点
deliveryFee: Number,
minOrderAmount: Number,
estimatedTime: Number
}
]
});
```
2. 配送范围校验逻辑
```javascript
function isInDeliveryRange(userLoc, storeRanges) {
return storeRanges.some(range => {
if (range.type === circle) {
const distance = getDistance(
userLoc.lat, userLoc.lng,
range.center.lat, range.center.lng
);
return distance <= range.radius;
} else if (range.type === polygon) {
return pointInPolygon(userLoc, range.polygon);
}
});
}
// 射线法判断点是否在多边形内
function pointInPolygon(point, polygon) {
// 实现省略...
}
```
四、部署优化建议
1. 服务架构:
- 使用Nginx负载均衡
- 部署Redis缓存热门区域的配送信息
- 考虑使用Serverless处理地图API调用
2. 性能优化:
```javascript
// 使用LRU缓存配送范围数据
const LRU = require(lru-cache);
const rangeCache = new LRU({ max: 500, maxAge: 1000 * 60 * 5 }); // 5分钟缓存
router.get(/checkDelivery, async (ctx) => {
const cacheKey = `${ctx.query.storeId}_${ctx.query.lat}_${ctx.query.lng}`;
const cached = rangeCache.get(cacheKey);
if (cached) {
ctx.body = cached;
return;
}
// ...实际查询逻辑
rangeCache.set(cacheKey, result);
});
```
3. 安全措施:
- 对地图API调用进行频率限制
- 使用HTTPS加密传输位置数据
- 实现接口签名验证
五、常见问题处理
1. 用户拒绝授权:
- 提供手动输入地址的备选方案
- 记录用户选择,后续通过模板消息引导重新授权
2. 定位不准确:
```javascript
// 多源定位融合方案
async function getAccurateLocation() {
const [wxLoc, ipLoc] = await Promise.all([
wx.getLocation(),
getIPLocation() // 通过IP定位的备选方案
]);
// 根据信号强度、时间戳等选择最优结果
return chooseBetterLocation(wxLoc, ipLoc);
}
```
3. 地图服务异常:
- 实现降级方案,使用预存的网格化配送数据
- 设置熔断机制,当错误率超过阈值时暂停服务
六、法律合规要点
1. 在隐私政策中明确说明:
- 位置数据的收集目的(精准配送)
- 数据存储期限(建议不超过必要期限)
- 用户权利(查询、更正、删除等)
2. 实现数据最小化原则:
```javascript
// 仅存储必要的地理位置信息
const userLocation = {
lat: Math.round(originalLat * 100000) / 100000, // 保留5位小数
lng: Math.round(originalLng * 100000) / 100000,
updatedAt: new Date()
};
```
通过以上方案,可实现生鲜小程序从地理位置授权到精准配送的全流程优化。建议结合实际业务场景进行测试调整,特别是在高并发场景下的性能验证和异常处理机制完善。