Google Maps API sessiontoken未按预期工作 请求未合并计费
Google Places API sessiontoken 未触发会话合并计费问题
根据官方规则,autocomplete API携带sessiontoken参数、后续同token调用placeDetails API时,同一会话关联请求应合并为单次计费,但实际使用中出现独立计费的情况,你的sessiontoken传参逻辑、调用后刷新token的逻辑从日志看是正确的,不存在必传配置项遗漏,问题基本由以下几个原因导致:
- 控制台统计延迟:Google Cloud控制台的实时用量面板不会做会话合并计算,会话计费的后台批处理最长有48小时延迟,请求刚发送完成时查看会显示为独立请求,等待2天后查看正式计费报表,会自动合并为单会话计费项,这是最常见的误判原因。
- 会话超时:单个sessiontoken的有效生命周期从首次发起autocomplete请求开始计算,最长为3分钟,若用户从输入第一个字符到选中地点触发placeDetails请求的间隔超过3分钟,会话会自动失效,所有请求按独立项计费。
- SKU不匹配:会话合并计费仅对应「Autocomplete 按会话计费」SKU,如果你账号侧开通的是旧版按单请求计费的Autocomplete SKU,即使传了sessiontoken也不会触发合并计费;另外如果placeDetails请求中请求了会话包不包含的高级字段(比如联系方式、营业时间类字段),对应字段部分会单独计费。
- 会话复用错误:若调用完placeDetails之后继续用同一个token发起新的autocomplete请求,会触发会话拆分,后续请求全部独立计费,你补充的日志中placeDetails调用完成后立即更换新token的操作是符合要求的。
第一组测试请求日志如下:
I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=s&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8&location=37.4220309%2C-122.0839848&radius=5000&strictbounds=true I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=st&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8&location=37.4220309%2C-122.0839848&radius=5000&strictbounds=true I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=sta&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8&location=37.4220309%2C-122.0839848&radius=5000&strictbounds=true I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=stat&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8&location=37.4220309%2C-122.0839848&radius=5000&strictbounds=true I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=stati&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8&location=37.4220309%2C-122.0839848&radius=5000&strictbounds=true I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=statio&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8&location=37.4220309%2C-122.0839848&radius=5000&strictbounds=true I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=station&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8&location=37.4220309%2C-122.0839848&radius=5000&strictbounds=true I/flutter (12295): Get URI: https://maps.googleapis.com/maps/api/place/details/json?place_id=ChIJr3mngX66j4ARcUF6Ln6aAmk&key=<API_KEY>&sessiontoken=d7f1f97f-621d-45cf-b8fd-38d74c976fd8 I/flutter (12295): Instance of 'PlaceDetails'
上述调用场景按规则应计为1次请求,但Google控制台API用量统计中该组请求被显示为9次独立请求。
编辑补充:新增两组包含placeDetails API调用的搜索日志,每次placeDetails调用完成后均已刷新sessiontoken参数。
I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=sta&key=<API_KEY>&sessiontoken=3dd4163e-c5aa-4504-a652-0c7861704efa&location=22.863185%2C87.3552233&radius=5000&strictbounds=true I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=stat&key=<API_KEY>&sessiontoken=3dd4163e-c5aa-4504-a652-0c7861704efa&location=22.863185%2C87.3552233&radius=5000&strictbounds=true I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=station&key=<API_KEY>&sessiontoken=3dd4163e-c5aa-4504-a652-0c7861704efa&location=22.863185%2C87.3552233&radius=5000&strictbounds=true I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/details/json?place_id=<PLACE_DETAILS>&key=<API_KEY>&sessiontoken=3dd4163e-c5aa-4504-a652-0c7861704efa I/flutter (17558): Instance of 'PlaceDetails' I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=sch&key=<API_KEY>&sessiontoken=a204cfe5-0824-4e2c-8fe6-5382ef542e76&location=22.863185%2C87.3552233&radius=5000&strictbounds=true I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=scho&key=<API_KEY>&sessiontoken=a204cfe5-0824-4e2c-8fe6-5382ef542e76&location=22.863185%2C87.3552233&radius=5000&strictbounds=true I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=schoo&key=<API_KEY>&sessiontoken=a204cfe5-0824-4e2c-8fe6-5382ef542e76&location=22.863185%2C87.3552233&radius=5000&strictbounds=true I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/autocomplete/json?input=school&key=<API_KEY>&sessiontoken=a204cfe5-0824-4e2c-8fe6-5382ef542e76&location=22.863185%2C87.3552233&radius=5000&strictbounds=true I/flutter (17558): Get URI: https://maps.googleapis.com/maps/api/place/details/json?place_id=<PLACE_DETAILS>&key=<API_KEY>&sessiontoken=a204cfe5-0824-4e2c-8fe6-5382ef542e76 I/flutter (17558): Instance of 'PlaceDetails'
排查步骤
- 先等待48小时后导出正式计费明细报表,不要参考实时用量面板的数据
- 统计测试场景下从首次输入到选点的耗时,若超过3分钟,在输入侧加逻辑:用户输入停顿超过3分钟未选点时自动生成新的sessiontoken
- 进入控制台Places API配置页,确认已启用按会话计费的SKU,同时核对placeDetails请求的fields参数,移除不需要的高级计费字段
- 测试时控制单组autocomplete+placeDetails请求在3分钟内完成,排除超时影响
内容的提问来源于stack exchange,提问作者Tapas Pal
相关产品推荐
相关产品推荐

