创建Webhook对接Google Ads线索表单与Salesforce后测试数据无记录如何解决
排查及修复方案
- 入参结构不匹配问题
你当前的doPost方法直接声明入参为List<Map<String,String>> user_column_data,但Google Ads发送的请求体是完整的JSON对象,user_column_data只是这个顶级对象下的一个属性,Salesforce无法直接将请求体反序列化为你声明的入参,会直接报400错误,请求根本不会进入你的业务逻辑。
修正方式:改为从RestContext中读取原始请求体自行解析,示例如下:
@RestResource(urlMapping='/Lead/*') global with sharing class MyRestResource { @HttpPost global static String doPost() { // 读取原始请求体 String requestBody = RestContext.request.requestBody.toString(); Map<String, Object> reqMap = (Map<String, Object>) JSON.deserializeUntyped(requestBody); List<Map<String,Object>> userColumnData = (List<Map<String,Object>>) reqMap.get('user_column_data'); Map<String, String> user_data = new Map<String,String>(); for( Map<String,Object> field_data : userColumnData){ user_data.put( (String)field_data.get('column_id'), (String)field_data.get('string_value') ); } Lead lead = new Lead(); lead.Status = 'New'; // 补充必填字段LastName,Lead标准对象LastName为必填项,你之前的代码漏了赋值,会导致插入失败 lead.LastName = user_data.get('LAST_NAME'); lead.FirstName = user_data.get('FIRST_NAME'); lead.Company = user_data.get('COMPANY_NAME'); lead.Phone = user_data.get('PHONE_NUMBER'); lead.Email = user_data.get('EMAIL'); lead.City = user_data.get('CITY'); lead.State = user_data.get('REGION'); try{ insert lead; return lead.Id; } catch (exception e){ // 打印完整异常信息方便排查 System.debug('插入Lead失败: ' + e.getMessage() + e.getStackTraceString()); RestContext.response.statusCode = 500; return '插入失败: ' + e.getMessage(); } } }
字段权限校验
确认Site Guest用户对Lead对象的以下字段拥有编辑权限:FirstName、LastName、Company、Phone、Email、City、State、Status,缺少任意字段的编辑权限都会导致插入失败。请求路径校验
确认你在Google Ads中配置的Webhook地址格式正确,标准格式为:https://你的Salesforce站点域名/services/apexrest/Lead,不要遗漏/services/apexrest/前缀。调试建议
- 先使用Postman工具模拟发送你提供的测试JSON到上述接口,确认接口返回正常、Lead成功插入后,再用Google Ads的测试功能发送请求
- 在Salesforce设置中开启针对Site Guest用户的调试日志,可查看请求的完整执行过程和异常信息
内容的提问来源于stack exchange,提问作者chrisHG
相关产品推荐
相关产品推荐

