php - 为什么当我尝试在 php 文件中使用 curl 时被禁止
问题描述
我正在尝试在网站上集成付款方式,我做的第一件事是尝试使用 curl 代码使用 git 控制台对其进行测试,它工作得很好,然后我尝试使用 PHP 执行 curl 命令。我创建了一个文件,然后我使用了这个代码:
<?php
$endpoint_url = 'https://secure.payinspect.com';
$params = [
'action'=>'SALE',
'order_id'=>'ORDER12345',
'order_amount'=>'1.99',
'order_currency'=>'USD',
'order_description'=>'Product',
'card_number'=>'4111111111111111',
'card_exp_month'=>'05',
'card_exp_year'=>'2020',
'card_cvv2'=>'000',
'payer_first_name'=>'John',
'payer_last_name'=>'Doe',
'payer_address'=>'BigStreet',
'payer_country'=>'US',
'payer_state'=>'CA',
'payer_city'=>'City',
'payer_zip'=>'123456',
'payer_email'=>'doe@example',
'payer_phone'=>'199999999',
'payer_ip'=>'123.123.123.123',
'term_url_3ds'=>'http://client.site.com/return.php',
'recurring_init'=>'N',
'hash'=>'e3dd86f469f40a5cfedf96a82ff257af'
];
$buff = [];
foreach ($params as $k => $v) {
array_push($buff, "{$k}={$v}");
}
$url = $endpoint_url . implode('&', $buff);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_close($ch);
if ($result===false){ print curl_error($curl); }
$response = json_decode($result, true);
echo $result;
?>
但我收到了这个错误:
Forbidden
You don't have permission to access
我用谷歌搜索了这个错误,我试图添加这一行
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36');
$result = curl_exec($ch);
但我仍然遇到同样的错误。
那么是什么导致了这个问题以及我该如何解决它
解决方案
假设其他一切都是正确的 - 这可能会解决问题。
<?php
$endpoint_url = 'https://secure.payinspect.com';
$params = [
'action'=>'SALE',
'order_id'=>'ORDER12345',
'order_amount'=>'1.99',
'order_currency'=>'USD',
'order_description'=>'Product',
'card_number'=>'4111111111111111',
'card_exp_month'=>'05',
'card_exp_year'=>'2020',
'card_cvv2'=>'000',
'payer_first_name'=>'John',
'payer_last_name'=>'Doe',
'payer_address'=>'BigStreet',
'payer_country'=>'US',
'payer_state'=>'CA',
'payer_city'=>'City',
'payer_zip'=>'123456',
'payer_email'=>'doe@example',
'payer_phone'=>'199999999',
'payer_ip'=>'123.123.123.123',
'term_url_3ds'=>'http://client.site.com/return.php',
'recurring_init'=>'N',
'hash'=>'e3dd86f469f40a5cfedf96a82ff257af'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint_url);
// -- this sets the request method to POST ----
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
// --- end ----
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_close($ch);
if ($result===false) { print curl_error($curl); }
$response = json_decode($result, true);
echo $result;
我不能肯定地说(这意味着这不是一个很好的答案),但是通过将参数添加到 URL 后缀,按照您当前的方式,您创建的是GET请求而不是POST请求。
接收服务很可能希望在POST数据中看到您的哈希值(以及其他所有内容) - 由于它在那里看不到它,因此它完全拒绝了您的请求。
推荐阅读
- vba - 如何优化以下 VBA/Excel 代码?
- amazon-web-services - 查询 DynamoDB 时出现空响应
- java - 将字符串转换为int数组后如何正确减去从字符串中取出的2个数字
- php - 我怎样才能在这里避免嵌套循环?使用 php
- angular - 当firebase中的数据发生变化时如何更新快照的本地副本?
- flutter - 如何删除颤振模拟器
- linux - Why Contiguous memory allocation is required in linux?
- r - 将字符 YYYY-MM-00 转换为 R 中的日期 YYYY-MM
- python - LaunchDarkly 带有 celery 的功能标志
- php - MySQL 查询特定客户及其交易详情