我正在使用第三方API将某些服务集成到我拥有的HTML表单中。
要使用API,您必须验证每个请求的哈希值和时间戳。 30分钟后,您的哈希和时间戳不再有效。为避免API出错,我决定每次提交表单时使用JavaScript和PHP动态设置值。
这是我用来生成哈希和时间戳信息的PHP文件。
<?php
if(isset($_REQUEST['action'])){
switch($_REQUEST['action']){
case 'getHash':
//Assign your variables the necessary values.
$base_url = "";//base_url value goes here. This is the location the request is sent to.
$account_id = "";//You must put your account_id here
$api_accesskey = "";//You must put your api_accesskey here
$success_url = "";//Your success URL goes here
$decline_url = "";//your decline URL goes here.
$timestamp = time();
//The $hash_string concatenates your three required parameters that
//will be hashed. If you are using transparent redirect you must
//also add your success and decline URLs.
$hash_string = $account_id.",".$api_accesskey.",".$timestamp.",".$success_url.",".$decline_url;
//The $hash_value is the variable you will post.
$hash_value = hash("sha256",$hash_string);
$hash_data = array(
'base_url' => $base_url,
'account_id' => $account_id,
'success_url' => $success_url,
'decline_url' => $decline_url,
'timestamp' => $timestamp,
'hash' => $hash_value,
);
$jsonHash = json_encode(array('success'=> true,'data' => $hash_data), JSON_FORCE_OBJECT);
print_r ($jsonHash);
break;
}
}
?>
这是我用来请求HTML表单信息的jQuery / JavaScript,然后将该信息提交给第三方API。
<script>
function getPaymentFormInformation(event) {
//this is the query string we send to hash.php to get our hash and config information
var post_data = {action: "getHash"};
$.ajax({
url: "hash.php",
data: post_data,
dataType: 'json',
type: "GET",
success: function(response ){
//assigning the response to a variable.
var json = response;
//assigning our values for submitting our request.
document.getElementById('account_id').value = json.data.account_id;
document.getElementById('success_url').value = json.data.success_url;
document.getElementById('decline_url').value = json.data.decline_url;
document.getElementById('timestamp').value = json.data.timestamp;
document.getElementById('hash').value = json.data.hash;
document.getElementById('paymentForm').action = json.data.base_url;
document.getElementById("paymentForm").submit();
},
error: function( error ){
// Log any error.
console.log( "ERROR:", "Request did not work." );
}
})
return false;
}
</script>
这在Chrome上完美运行,但是当我在firefox中运行它时,我对hash.php的AJAX请求每次都会失败。我搜索并搜索了有同样问题的人,我无法想出任何东西。
任何和所有帮助将不胜感激。
更新:
编辑:更新了我的代码段,以反映给出的答案中的建议更改。在Firefox中仍然遇到相同的行为。
更新:
我已经将我的错误捕获功能更改为我发现的另一个示例更详细。
error: function(jqXHR, exception) {
if (jqXHR.status === 0) {
alert('Not connect.\n Verify Network.');
} else if (jqXHR.status == 404) {
alert('Requested page not found. [404]');
} else if (jqXHR.status == 500) {
alert('Internal Server Error [500].');
} else if (exception === 'parsererror') {
alert('Requested JSON parse failed.');
} else if (exception === 'timeout') {
alert('Time out error.');
} else if (exception === 'abort') {
alert('Ajax request aborted.');
} else {
alert('Uncaught Error.\n' + jqXHR.responseText);
}
}
我现在得到:
未捕获的异常:内存不足
Firebug输出:
我已更新我的错误处理程序以输出到控制台而不是抛出警报。
我发送请求时会触发此行。
if (jqXHR.status === 0) {
console.log('Not connected.\n Verify Network.');
答案 0 :(得分:4)
您不是将json发送到服务器,只是一个普通的查询字符串(在编辑之前和之后),也不是在服务器端处理json;您可以通过超全局$_REQUEST
访问变量。
所以你需要删除:
contentType: 'application/json; charset=utf-8',
当您发送json时,您可能需要这样,以便jQuery将自动为您解析json字符串:
dataType: 'json',
现在您不必在成功处理程序中手动解析json。
答案 1 :(得分:0)
在获得信息以添加更强大的错误报告后,我能够查明问题。
我的错误脚本在if (jqXHR.status === 0)
失败了。我能够搜索此状态代码并找到解决方案。
JQXHR状态:0原因:当ajax功能时请求不会取消 叫做。解决方案:只需添加return false;打电话给 函数,即OnClientClick =&#34; AJAXMethod();返回false;&#34;
资料来源:Ajax jqXHR.status==0 fix error(第二回复)