首页 > 解决方案 > 为什么当我尝试在 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);

但我仍然遇到同样的错误。
那么是什么导致了这个问题以及我该如何解决它

标签: phpcurl

解决方案


假设其他一切都是正确的 - 这可能会解决问题。

<?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数据中看到您的哈希值(以及其他所有内容) - 由于它在那里看不到它,因此它完全拒绝了您的请求。


推荐阅读