我在WP网站上使用Gravity Forms。我的表单使用Pardot Pardot通过ajax发送到form handlers。我遇到了Pardot处理表单6x的问题,没有其他错误。研究表明,这是因为Pardot不支持CORS或JSONP,因此在使用ajax提交时会陷入循环。它处理提交但从未"完成"当表单处理程序的成功URL设置为引用URL时。它在放弃之前尝试6次,处理提交的数据并每次发送新的潜在客户通知电子邮件。
Pardot help docs提出以下解决方案:
可以通过将表单处理程序的成功和错误URL分别设置为执行成功和错误回调的JavaScript URL来模拟JSONP响应。
我不完全确定这意味着什么或如何处理它。我已经做了一些stackoverflowing和谷歌搜索,但我似乎无法绕过如何做到这一点。有人可以帮助澄清这个概念或指出我正确的方向吗?
谢谢!
答案 0 :(得分:3)
编辑:所以,经过几天的战斗,我会发布我的最终解决方案,这可能会帮助其他人尝试使用JSONP与Pardot沟通。 这是一个三部分问题:
要将表单数据发送到表单处理程序,您需要对字段名称和值进行URI编码。
(使用JQuery的示例。在指定dataType时,'?callback ='由ajax()添加:'jsonp'):
var data = { 'field1' = 'value1', 'field' = 'value2' };
var uriEncodedParams = $.param(data);
var targetUrl = <Pardot Form Handler URL> + '?' + uriEncodedParams;
$.ajax({
url: targetUrl,
dataType: 'jsonp',
jsonpCallback: 'callback'
});
window.callback = function (data) {...}
见@ nickjag的回答:
将成功位置和错误位置设置为后端的端点。
由于pardot不会转发你传入的任何GET参数,你必须使用一些默认值,即回调函数名称(因此指定jsonpCallback并且在我的请求中没有成功)。
使用时我遇到控制台错误(Uncaught SyntaxError: Unexpected token :
)问题:
return "{ 'result' : 'success' }"
因为它是一个JSON对象而JSONP需要一个带有JavaScript的文件。因此,要返回的格式应为:return "callback({ 'result' : 'success' })"
再次Pardot不转发GET参数,JQuery生成的回调函数名称没有传播,我无法返回正确的JavaScript代码。如果没有提供,则默认使用函数名称“callback”。
答案 1 :(得分:1)
Pardot建议在您自己的服务器上创建2个静态URL,以返回简单的JSON响应。
例如:
mysite.com/pardot-success
返回:{"result":"success"}
mysite.com/pardot-error
返回:{"result":"error"}
然后,您将使用这两个网址作为Pardot表单处理程序设置的成功和错误重定向网址。
然后可以使用JSONP向您的Pardot表单处理程序发出AJAX请求,JSONP将从其中一个URL包装并返回JSON响应(取决于结果)。
您的AJAX响应数据将包含您的JSON结果(成功或错误)。
答案 2 :(得分:0)
这里的所有答案确实有助于我继续使用该解决方案,但我的要求是使所有内容只能通过Salesforce正常运行。因此,对于只使用Salesforce后端架构寻找答案的任何人,我希望这会有所帮助。为了使它正常工作,我不得不对Ajax调用进行一些不同的构造:
var data = { 'username': username };
var uriEncodedParams = $.param(data);
var targetUrl = 'https://my.pardot.url' + '?' + uriEncodedParams;
$.ajax({
url: targetUrl,
type: 'GET',
dataType: 'jsonp',
crossDomain: true
});
window.callback = function(data) {
performMoreActions(data);
}
我的服务器是用Apex(Salesforce的编程语言)构建的,如下所示:
@RestResource(urlMapping='/pardot/success/*')
global without sharing class Pardot_SuccessProxy {
@HttpGet
global static void Pardot_SuccessProxy() {
RestContext.response.addHeader('Content-Type', 'application/json');
RestContext.response.responseBody = (Blob.valueOf('callback({ "result" : "success" })'));
}
}
然后,我通过Salesforce网站在以下URL上公开此REST Web服务:
https://my-domain.server-domain.force.com/services/apexrest/pardot/success
https://my-domain.server-domain.force.com/services/apexrest/pardot/error
然后在Pardot表单处理程序UI中,分别将成功位置和错误位置字段设置为这些URL。
这与该问题的其他答案非常相似,但完全取自Salesforce方法。这可能与OPs技术堆栈无关,但对于将来寻找答案的人们应该有所帮助。