1

我正在使用SageOne API PHP 库。它工作正常,但如果我尝试使用getor会出现错误post

错误是,

只有变量应该通过第 130 行的引用 sage.api.php 传递

我的get请求代码是

$client = new SageOne(SAGE_CLIENT_ID, SAGE_CLIENT_SECRET);
$client->setAccessToken("c7c7547xxxxxxxxxxxx8efa4f5df08f750df");
$data = array( );
$result = "";
$client = $client->get('/products', $data);

我不知道怎么了。

完整代码

require 'sage.api.php';
define('SAGE_CLIENT_ID', "fa1e8c1b114347a356d2");
define('SAGE_CLIENT_SECRET', "faaa7b353521f823ba13e3a20e72dd057c3a5fd1");

$client = new SageOne(SAGE_CLIENT_ID, SAGE_CLIENT_SECRET);
$callbackURL = 'xxxxx/addonmodules.php?module=sageone';
// We need to build the authorise url and redirect user to authorise our app
if(!$_GET['code']){

    $authoriseURL = $client->getAuthoriseURL($callbackURL);

    // redirect user
    header("Location: ".$authoriseURL);


    exit;


// We now have the authorisation code to retrieve the access token
} else {

$accessToken = $client->getAccessToken($_GET['code'], $callbackURL);

$token= $accessToken['access_token'];
$end = 'public';
$data ='';
$result = $client->get($end, $data);
echo '<pre>';
print_r($result);

来自 sage.api.php 的代码片段

    class SageOne { ...

...
public function get($endpoint, $data=false){
        return $this->call($endpoint, 'get', $data);
    }
...

// error line 130 from this code

    private function buildSignature($method, $url, $params, $nonce){

        // uc method and append &
        $signature = strtoupper($method).'&';

        // percent encode bit of url before ? and append &
        $signature .= rawurlencode(array_shift(explode('?', $url))).'&';

        // percent encode any params and append &
        if (is_array($params)){

            // sort params alphabetically
            $this->ksortRecursive($params);

            // build query string from params, encode it and append &
            $signature .= str_replace(
                array('%2B'), 
                array('%2520'), 
                rawurlencode(http_build_query($params, '', '&'))
            ).'&';

        // params can be string
        } else {

            // build query string from params, encode it and append &
            $signature .= rawurlencode($params).'&';
        }

        // add 'nonce' - just use an md5
        $signature .= $nonce;

        // now generate signing key
        $signingKey = rawurlencode($this->signingSecret).'&'.rawurlencode($this->accessToken);

        // encode using sha 1, then base64 encode       
        $finalSignature = base64_encode(hash_hmac('sha1', $signature, $signingKey, true));

        return $finalSignature;

    }

这是我能看到所有重要代码的最短时间

4

2 回答 2

0

这是由于试图将函数或方法的结果直接返回给另一个函数或方法......结果没有引用。

因此,例如:

$obj->method(doSomething(), 'asdf', 'qwerty');

doSomething()该错误意味着您应该在传递它之前分配它的值。

$result = doSomething();
$obj->method($result, 'asdf', 'qwerty');

另请参阅:只有变量应该通过引用传递

于 2015-07-23T16:36:11.423 回答
0

$client->get()可以定义一个函数(在本例中为)以通过引用接收其参数。这意味着它可以直接修改这些参数。因此,如果您调用$client->get($a, $b),该函数可能会更改 和 的$a$b

显然,它只能改变变量的值,所以当一个函数通过引用接收参数时,你必须传递一个变量,而不是字符串、整数或直接调用另一个函数。

因此,如果函数$client->get()通过引用接收其第一个参数,则以下任何一项都不起作用:

$client->get('string', $data);
$client->get(15, $data); // int
$client->get(other_function_call(), $data);
$client->get(12.5, $data); // float
$client->get(array(), $data);

你必须这样做:

$a = 'string';
$client->get($a, $data);

$a = 其他任何东西,无论是字符串、int 还是函数调用。关键是(这在错误消息中非常清楚地说明)您必须传递一个变量。因此,将您想要传递的任何内容保存为变量,然后传递它。

于 2015-07-23T18:29:39.230 回答