feat: security hardening, wechat pay v3 platform cert integration, companion certification revocation, and audit closed-loop

这个提交包含在:
xcbyy
2026-10-16 17:38:17 +08:00
父节点 3bf38db8b6
当前提交 78117bb4e1
共有 58 个文件被更改,包括 12971 次插入 和 952 次删除

83
pwuniapp/common/location.js 普通文件
查看文件

@@ -0,0 +1,83 @@
// pwuniapp/common/location.js
// 同城生活陪伴小程序统一地图与定位能力服务层
// 默认腾讯位置服务 Key(可在管理后台【安全合规-平台系统配置-地图定位服务】动态更新维护)
// 申请地址:https://lbs.qq.com
export const DEFAULT_TENCENT_MAP_KEY = '';
/**
* 计算两个经纬度坐标之间的球面距离(千米/km)
* @param {number} lat1 纬度1
* @param {number} lon1 经度1
* @param {number} lat2 纬度2
* @param {number} lon2 经度2
* @returns {string} 格式化后的距离(例如 "1.2km" 或 "350m")
*/
export function calculateDistance(lat1, lon1, lat2, lon2) {
if (!lat1 || !lon1 || !lat2 || !lon2) return '同城';
const toRad = (d) => (d * Math.PI) / 180;
const R = 6371; // 地球平均半径(km)
const dLat = toRad(lat2 - lat1);
const dLon = toRad(lon2 - lon1);
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const d = R * c;
if (d < 1) {
return `${Math.round(d * 1000)}m`;
}
return `${d.toFixed(1)}km`;
}
/**
* 唤起地图选点 (chooseLocation)
* 封装权限申请与平台兼容处理
* @returns {Promise<{name: string, address: string, latitude: number, longitude: number}>}
*/
export function chooseMapLocation() {
return new Promise((resolve, reject) => {
// #ifdef MP-WEIXIN || APP-PLUS
uni.chooseLocation({
success: (res) => {
resolve({
name: res.name || '',
address: res.address || '',
latitude: res.latitude,
longitude: res.longitude
});
},
fail: (err) => {
reject(err);
}
});
// #endif
// #ifndef MP-WEIXIN || APP-PLUS
reject(new Error('当前运行环境不支持原生地图选点'));
// #endif
});
}
/**
* 获取当前用户地理位置经纬度 (getLocation)
* @returns {Promise<{latitude: number, longitude: number}>}
*/
export function getUserLocation() {
return new Promise((resolve, reject) => {
uni.getLocation({
type: 'gcj02', // 国测局坐标系,腾讯地图/高德地图通用
success: (res) => {
resolve({
latitude: res.latitude,
longitude: res.longitude
});
},
fail: (err) => {
reject(err);
}
});
});
}