微信提供了wx.getLocation、wx.chooseLocation、wx.openLocation等一系列地理位置接口,方便公众号和小程序实现附近门店、配送地址、天气展示等功能。但位置信息属于敏感个人信息,按照个人信息保护法和微信平台自身的要求,采集位置信息前必须有清晰的隐私政策说明,并且要在用户明示同意后才能调用相关接口。很多项目在迭代过程中,位置接口调用散落在各个页面,隐私政策却很久没有同步更新,这就埋下了合规隐患。与其人工逐页排查,不如写一个检查工具自动化完成这项工作。

合规检查工具的核心原理
这类工具的本质是做一次静态扫描加一次规则比对。静态扫描负责从项目源码中找出所有调用地理位置相关API的位置,包括直接的wx.getLocation调用,也包括经过二次封装的间接调用。规则比对则负责核对三件事:隐私政策文本中是否明确提及了位置信息的收集目的、方式和范围;调用位置接口之前是否存在授权判断逻辑;是否使用了wx.authorize或自定义弹窗向用户征求同意。
具体到检测层面,工具需要维护一份敏感API清单。这份清单除了微信官方的位置接口外,还应包含常见的封装函数名,比如getLocationSync、fetchPosition等团队内部习惯命名。扫描时采用AST解析而非简单的字符串匹配,可以避免注释掉的代码和字符串常量被误报。如果没有AST环境,退化为正则匹配也能接受,但要处理多行注释和模板字符串的干扰。
比对的另一半是隐私政策文本。工具可以接收一个Markdown或纯文本格式的隐私政策文件,检查其中是否出现位置、地理位置、精确位置、附近等关键词,并检查这些关键词所在的段落是否包含收集目的的描述。这种文本校验做不到语义级别的准确,但作为第一道防线已经足够发现大部分缺失场景。
工具的设计与实现
工具整体分成四个模块:配置加载模块负责读取敏感API清单和隐私政策文件路径;代码扫描模块负责遍历项目目录并解析源码;规则校验模块负责执行各项检测规则;报告生成模块负责输出JSON和HTML两种格式的结果。下面用Node.js给出一个可用的基础实现。
const fs = require('fs');
const path = require('path');
// 敏感API清单,可按团队习惯扩充
const SENSITIVE_APIS = [
'wx.getLocation',
'wx.chooseLocation',
'wx.openLocation',
'wx.startLocationUpdate',
'wx.onLocationChange',
'getLocationSync', // 常见封装
'fetchPosition' // 常见封装
];
// 隐私政策必须覆盖的关键词
const POLICY_KEYWORDS = ['位置', '地理位置', '附近', '定位'];
function scanFile(filePath) {
const content = fs.readFileSync(filePath, 'utf-8');
const hits = [];
const lines = content.split('\n');
lines.forEach((line, idx) => {
// 跳过注释行,减少误报
if (line.trim().startsWith('//') || line.trim().startsWith('*')) return;
SENSITIVE_APIS.forEach(api => {
if (line.includes(api)) {
hits.push({ file: filePath, line: idx + 1, api, code: line.trim() });
}
});
});
return hits;
}
function checkPolicy(policyPath) {
const text = fs.readFileSync(policyPath, 'utf-8');
return POLICY_KEYWORDS.filter(k => !text.includes(k));
}
function run(projectDir, policyPath) {
const hits = [];
const walk = (dir) => {
fs.readdirSync(dir).forEach(name => {
const full = path.join(dir, name);
if (fs.statSync(full).isDirectory()) return walk(full);
if (/\.(js|ts|wxml|vue)$/.test(name)) hits.push(...scanFile(full));
});
};
walk(projectDir);
const missingKeywords = checkPolicy(policyPath);
return { total: hits.length, hits, missingKeywords };
}
const result = run('./src', './privacy-policy.md');
console.log(JSON.stringify(result, null, 2));上面这段代码已经能跑通基本流程,但实际使用时还建议做两点增强。第一是在扫描命中后,向上回溯查找该函数作用域内是否存在scope.userLocation的授权判断,如果存在则降低风险等级,标记为已做授权。第二是把结果输出为HTML报告,按风险等级分组展示,方便直接发给业务和法务同学复核。
对于小程序项目,还可以额外调用微信官方的隐私接口检测能力。自基础库2.32.3起,微信提供了wx.getPrivacySetting查询用户对隐私协议的授权状态,配合wx.requirePrivacyAuthorize触发授权弹窗。工具可以检查项目中是否正确接入了这两个接口,作为平台侧合规的检测项。
常见合规风险点与检测规则
根据实际项目经验,位置信息合规最容易出问题的场景集中在三处。一是页面加载时静默调用位置接口,没有任何弹窗提示,这属于最高风险级别,规则上应直接判定为不通过。二是隐私政策中有位置条款但表述含糊,比如只写了用于提供更好的服务,没有说明具体用途和是否共享给第三方,这类文本命中关键词但缺少目的描述,可以标记为中风险。三是用户拒绝授权后反复弹出索取位置权限,这需要在扫描时识别fail回调中的重试逻辑,检测是否存在短时间内多次调用的情况。
对应的检测规则可以设计成一张清单,便于维护和扩展。
| 检测项 | 判定条件 | 风险等级 |
|---|---|---|
| 调用位置接口但隐私政策无位置条款 | 扫描命中且政策关键词缺失 | 高 |
| 调用位置接口前无授权判断 | 命中行所在作用域无scope.userLocation检查 | 高 |
| 隐私政策有条款但缺少收集目的 | 关键词命中但段落无目的描述 | 中 |
| 未接入微信隐私授权接口 | 缺少wx.requirePrivacyAuthorize调用 | 中 |
| 拒绝授权后重复索取 | fail回调中存在重试调用 | 低 |
把这套规则集成到CI流程里效果最好。每次提交代码时自动执行扫描,命中高风险项直接阻断合并,中低风险项以警告形式提示。这样合规检查就不再依赖上线前的人工抽查,而是变成开发环节的常态化约束。
工具的落地建议
最后谈几点落地时的注意事项。扫描规则一定要结合团队实际维护,尤其是封装函数的命名,建议在代码规范中约定所有位置相关的封装统一加上Location或Position后缀,工具的识别准确率会大幅提升。隐私政策文件建议与代码同仓库管理,政策更新时同步提交,工具扫描时自然能拿到最新版本。
另外要注意工具的边界。静态扫描无法覆盖运行时动态拼接的调用,也判断不了后端接口是否偷偷存储了位置数据,这部分需要配合抓包测试和服务端日志审计。工具的价值在于把绝大多数肉眼可见的问题前置拦截,剩下少数复杂场景再由人工复核,两者的组合才是完整的合规保障体系。