1

我正在尝试使用 CURL 实现VISA Developer Foreign Exchange API ,但是当我发送请求时,我收到 Authentication Error 消息。我正在本地测试 API,这是我的实现。

$data_string = $_POST;                                                                                   
$ch = curl_init('https://sandbox.api.visa.com/forexrates/v1/foreignexchangerates');   
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', "Accept:application/json", "Authorization:".base64_encode("usernamestring:passwordstring")));
curl_setopt($ch, CURLOPT_URL, "https://sandbox.api.visa.com/forexrates/v1/foreignexchangerates");  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data_string));
curl_setopt($ch, CURLOPT_POST, 1); 
$results = curl_exec($ch);

他们还生成一个 .pem 证书,我不确定我是否必须将其用于 Foreign Exchnage API 请求,但请您看看我是否做错了什么?

4

2 回答 2

1

这个 api 是双向认证的,要调用这个 api,你需要在开发者平台上为此 api 创建一个应用程序,然后需要在授权标头中传递你的用户名密码。userid并且password特定于您创建的应用程序,可以在您的应用程序详细信息页面中看到。

除了授权标头之外,您还需要发送密钥和证书文件。密钥文件将在应用程序创建期间创建,并将下载到您的系统。

使用按平台为 PHP 提供的示例代码。要访问示例代码,您需要为此 api 创建一个应用程序。

于 2016-09-16T14:00:14.527 回答
0

您需要在用户 ID/密码部分传递私钥(在创建项目时下载的 .pem 文件)和证书密钥(凭证中的 .pem 文件)。

使用 PHP 中提供的示例代码或尝试以下代码。

$userId = ""; /*Your user id*/
$password = ""; /*Your password*/
$postBody = array(); /*Your POST body*/
$authString = $userId.':'.$password;
$authStringBytes = utf8_encode($authString);
$authloginString = base64_encode($authStringBytes);
$authHeader= "Authorization:Basic ".$authloginString;
$header = (array("Accept: application/json", "Content-Type: application/json", $authHeader));
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_URL, "https://sandbox.api.visa.com/forexrates/v1/foreignexchangerates");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postBody));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSLCERT, 'PATH_TO_CERT_FILE');
curl_setopt($ch, CURLOPT_SSLKEY, 'PATH_TO_PRIVATE_KEY_FILE');
$results = curl_exec($ch);
curl_close($ch);
print_r(json_decode($results));
于 2020-03-03T06:47:03.007 回答