首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中使用ChannelAdvisor REST不以CURL方式工作的请求

在PHP中使用ChannelAdvisor REST不以CURL方式工作的请求
EN

Stack Overflow用户
提问于 2016-01-17 20:33:08
回答 2查看 1.6K关注 0票数 1

我想使用ChannelAdvisor REST SOAP凭据流与集成。

根据他们的文档,我在PostMan ( Chrome中的rest客户端)中设置了如下内容:

当我完成其余部分时,rest服务器返回预期的响应:

因此,我尝试用以下类在PHP中复制这个结果:

代码语言:javascript
复制
<?php

class ChannelAdvisorREST {

    /**
     * ChannelAdvisor constants & properties
     */
    const BASE_URL = 'https://api.channeladvisor.com/v1';
    private $config;

    /**
     * Class constructor
     */
    public function __construct()
    {
        $this->config = \Config::get('channeladvisor');
    }

    // TEST
    public function test($accountId)
    {
        // var_dump($this->config);

        var_dump(self::getAccessToken($accountId));
    }
    // TEST

    /**
     * Method to get access token from rest server.
     *
     * @param $accountId
     * @return string
     */
    private function getAccessToken($accountId)
    {
        return self::curlPOST('/oauth2/token', [
            'client_id' => $this->config['api_app_id'],
            'grant_type' => 'soap',
            'scope' => 'inventory',
            'developer_key' => $this->config['api_developer_key'],
            'password' => $this->config['api_password'],
            'account_id' => $accountId
        ]);
    }

    /**
     * Method to generate a HTTP POST request
     *
     * @param $endpoint
     * @param $fields
     * @return string
     */
    private function curlPOST($endpoint, $fields = array())
    {
        // Open connection
        $ch = curl_init();

        // Set the url, number of POST vars, POST data
        curl_setopt($ch, CURLOPT_USERPWD, $this->config['api_app_id'] .':'. $this->config['api_shared_secret']);
        curl_setopt($ch, CURLOPT_URL, self::BASE_URL . $endpoint);
        curl_setopt($ch, CURLOPT_POST, count($fields));
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields, '', '&'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/x-www-form-urlencoded'
        ));

        // Execute post request
        $result = curl_exec($ch);

        // Close connection
        curl_close($ch);

        // Finished
        return $result;
    }
}

当我在这个类上执行test($accId)方法时,我会得到以下响应:

布尔假

你知道为什么它不像PostMan测试那样工作吗?

我已经核实了所有的配置/文件等等.都是正确的,和我的PostMan测试一样。这个类是从我的原始代码(在Laravel4.2中创建的,但这个问题与Laravel无关)的一个简短的版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-17 22:26:11

我发现了这个问题。这个问题是由于我的php没有配置curl.cainfo造成的。

通过向我的curlPOST方法添加如下调试代码,我发现了这一点:

代码语言:javascript
复制
private function curlPOST($endpoint, $fields = array())
{
    // Open connection
    $ch = curl_init();

    // Set the url, number of POST vars, POST data
    curl_setopt($ch, CURLOPT_USERPWD, $this->config['api_app_id'] .':'. $this->config['api_shared_secret']);
    curl_setopt($ch, CURLOPT_URL, self::BASE_URL . $endpoint);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields, '', '&'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/x-www-form-urlencoded'
    ));
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    $verbose = fopen('php://temp', 'w+');
    curl_setopt($ch, CURLOPT_STDERR, $verbose);

    // Execute post request
    $result = curl_exec($ch);

    // Debug error
    if ($result === FALSE) {
        printf("cUrl error (#%d): %s<br>\n", curl_errno($ch), htmlspecialchars(curl_error($ch)));
        rewind($verbose);
        $verboseLog = stream_get_contents($verbose);
        echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";
    }
    @fclose($verbose);

    // Close connection
    curl_close($ch);

    // Finished
    return $result;
}

这将输出以下错误消息:

代码语言:javascript
复制
cUrl error (#60): SSL certificate problem: unable to get local issuer certificate
Verbose information:
* Hostname was found in DNS cache
* Hostname in DNS cache was stale, zapped
*   Trying 216.27.89.14...
* Connected to api.channeladvisor.com (216.27.89.14) port 443 (#7)
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 7
boolean false

这帮我找到了我的php的问题。

票数 0
EN

Stack Overflow用户

发布于 2016-01-17 20:46:58

有两件事:

  1. 确保您发送的标头与浏览器发送的标题相同。例如,我没有在您的代码中看到授权头,而这个头对于在服务器端授权请求可能是非常关键的。此外,对于范围,您使用‘库存’而不是‘订单库存’。在这个练习中要非常严格。
  2. 测试post数据不是在数组中,而是按照自己的要求写下查询字符串,这样您就可以知道通过CURL将数组转换为查询字符串没有问题(注意,两者都有可能实现CURL、array和query-string)。

所以最容易测试的是:

代码语言:javascript
复制
client_id=1234&grant_type=soap&scope=order%20inventory...etc add other variables...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34843312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档