【问题标题】:Oauth implementation in netsuite using php使用php在netsuite中实现Oauth
【发布时间】:2015-12-28 07:42:15
【问题描述】:

我尝试使用 PHP Toolkit 通过帐户 ID、用户名和密码访问 Netsuite。我可以使用上述凭据获取客户详细信息。我有访问令牌。但现在我尝试使用访问令牌访问 Netsuite。我需要 PHP 代码才能使用令牌访问 Netsuite,并且我想获取客户详细信息。

提前致谢

【问题讨论】:

  • 这太宽泛了,请发布您使用过的代码、您遇到的问题/错误等。
  • 我有代码可以使用不使用 Oauth 的凭据访问 Netsuite。我只需要使用 Oauth 的代码。

标签: php oauth netsuite


【解决方案1】:

这是我为 PHP -> 使用 Restlets 和 OAuth 的 NS 集成编写的一些代码:

define("NETSUITE_URL", 'https://rest.netsuite.com/app/site/hosting/restlet.nl');
define("NETSUITE_SCRIPT_ID", 'XXXXXX');
define("NETSUITE_DEPLOY_ID", 'XXXXXX');
define("NETSUITE_ACCOUNT", 'XXXXXX');
define("NETSUITE_CONSUMER_KEY", 'XXXXXX');
define("NETSUITE_CONSUMER_SECRET", 'XXXXXX');
define("NETSUITE_TOKEN_ID", 'XXXXXX');
define("NETSUITE_TOKEN_SECRET", 'XXXXXX');

function sendOrderToNS($details) {
    $data_string = json_encode($details);

    $oauth_nonce = md5(mt_rand());
    $oauth_timestamp = time();
    $oauth_signature_method = 'HMAC-SHA1';
    $oauth_version = "1.0";

    $base_string =
        "POST&" . urlencode(NETSUITE_URL) . "&" .
        urlencode(
            "deploy=" . NETSUITE_DEPLOY_ID
          . "&oauth_consumer_key=" . NETSUITE_CONSUMER_KEY
          . "&oauth_nonce=" . $oauth_nonce
          . "&oauth_signature_method=" . $oauth_signature_method
          . "&oauth_timestamp=" . $oauth_timestamp
          . "&oauth_token=" . NETSUITE_TOKEN_ID
          . "&oauth_version=" . $oauth_version
          . "&realm=" . NETSUITE_ACCOUNT
          . "&script=" . NETSUITE_SCRIPT_ID
        );
    $sig_string = urlencode(NETSUITE_CONSUMER_SECRET) . '&' . urlencode(NETSUITE_TOKEN_SECRET);
    $signature = base64_encode(hash_hmac("sha1", $base_string, $sig_string, true));

    $auth_header = "OAuth "
        . 'oauth_signature="' . rawurlencode($signature) . '", '
        . 'oauth_version="' . rawurlencode($oauth_version) . '", '
        . 'oauth_nonce="' . rawurlencode($oauth_nonce) . '", '
        . 'oauth_signature_method="' . rawurlencode($oauth_signature_method) . '", '
        . 'oauth_consumer_key="' . rawurlencode(NETSUITE_CONSUMER_KEY) . '", '
        . 'oauth_token="' . rawurlencode(NETSUITE_TOKEN_ID) . '", '  
        . 'oauth_timestamp="' . rawurlencode($oauth_timestamp) . '", '
        . 'realm="' . rawurlencode(NETSUITE_ACCOUNT) .'"';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, NETSUITE_URL . '?&script=' . NETSUITE_SCRIPT_ID . '&deploy=' . NETSUITE_DEPLOY_ID . '&realm=' . NETSUITE_ACCOUNT);
    curl_setopt($ch, CURLOPT_POST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: ' . $auth_header,
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string)
    ]);

    curl_exec($ch);
    curl_close($ch);
}

【讨论】:

  • 感谢您的回复。您的回答有助于进行下一步。我尝试了使用 Netsuite 脚本获取客户详细信息的代码。但是我从 OAuth 得到一个空的响应。这样,我们需要为每个独立的 Netsuite 帐户创建一个脚本。有什么方法可以在不在 Netsuite 帐户中创建脚本的情况下获取客户详细信息?
  • 非常感谢迈克尔。您的代码工作正常。我在传递数据时犯了错误。我错误地将数据作为字符串发送。我只添加了这两行。 $datastring = array('recordtype' => 'customer', 'id' => '5'); sendOrderToNS($datastring);
  • 是否有任何方法可以在不在 Netsuite 帐户中创建脚本的情况下获取客户详细信息?
  • 很好的例子,谢谢。不要忘记curl_close($ch);
  • 对于那些刚接触 TBA 的人来说很重要。 $auth_header 的顺序非常重要。 The OAuth spec says to sort lexigraphically, which is the default alphabetical sort for many libraries.
【解决方案2】:

我会发表评论,但还不能发表评论。 michoel 的回答是正确的,但是当 'realm=...' 是 $auth_header var 的一部分时,会引发“无效的登录尝试”错误。取出那根绳子就解决了这个问题。

【讨论】:

  • 这里也一样。 OAuth 规范说不包括realm。我必须删除它才能让它工作(在我的例子中是 Delphi 而不是 PHP)。
  • @Brian 你对 GET 请求做了什么?
【解决方案3】:

Netsuite TBA Restlets 在 2021.1 版本中将不再支持 SHA1,您必须将 PHP 代码更改为 从 $oauth_signature_method = 'HMAC-SHA1';到 $oauth_signature_method = 'HMAC-SHA256'; 和 从 $signature = base64_encode(hash_hmac("sha1", $base_string, $sig_string, true)); to $signature = base64_encode(hash_hmac("sha256", $base_string, $sig_string, true));

define("NETSUITE_URL", 'https://rest.netsuite.com/app/site/hosting/restlet.nl');
define("NETSUITE_SCRIPT_ID", 'XXXXXX');
define("NETSUITE_DEPLOY_ID", 'XXXXXX');
define("NETSUITE_ACCOUNT", 'XXXXXX');
define("NETSUITE_CONSUMER_KEY", 'XXXXXX');
define("NETSUITE_CONSUMER_SECRET", 'XXXXXX');
define("NETSUITE_TOKEN_ID", 'XXXXXX');
define("NETSUITE_TOKEN_SECRET", 'XXXXXX');

function sendOrderToNS($details) {
    $data_string = json_encode($details);

    $oauth_nonce = md5(mt_rand());
    $oauth_timestamp = time();
    $oauth_signature_method = 'HMAC-SHA256';
    $oauth_version = "1.0";

    $base_string =
        "POST&" . urlencode(NETSUITE_URL) . "&" .
        urlencode(
            "deploy=" . NETSUITE_DEPLOY_ID
          . "&oauth_consumer_key=" . NETSUITE_CONSUMER_KEY
          . "&oauth_nonce=" . $oauth_nonce
          . "&oauth_signature_method=" . $oauth_signature_method
          . "&oauth_timestamp=" . $oauth_timestamp
          . "&oauth_token=" . NETSUITE_TOKEN_ID
          . "&oauth_version=" . $oauth_version
          . "&realm=" . NETSUITE_ACCOUNT
          . "&script=" . NETSUITE_SCRIPT_ID
        );
    $sig_string = urlencode(NETSUITE_CONSUMER_SECRET) . '&' . urlencode(NETSUITE_TOKEN_SECRET);
    $signature = base64_encode(hash_hmac("sha256", $base_string, $sig_string, true));

    $auth_header = "OAuth "
        . 'oauth_signature="' . rawurlencode($signature) . '", '
        . 'oauth_version="' . rawurlencode($oauth_version) . '", '
        . 'oauth_nonce="' . rawurlencode($oauth_nonce) . '", '
        . 'oauth_signature_method="' . rawurlencode($oauth_signature_method) . '", '
        . 'oauth_consumer_key="' . rawurlencode(NETSUITE_CONSUMER_KEY) . '", '
        . 'oauth_token="' . rawurlencode(NETSUITE_TOKEN_ID) . '", '  
        . 'oauth_timestamp="' . rawurlencode($oauth_timestamp) . '", '
        . 'realm="' . rawurlencode(NETSUITE_ACCOUNT) .'"';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, NETSUITE_URL . '?&script=' . NETSUITE_SCRIPT_ID . '&deploy=' . NETSUITE_DEPLOY_ID . '&realm=' . NETSUITE_ACCOUNT);
    curl_setopt($ch, CURLOPT_POST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: ' . $auth_header,
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string)
    ]);

    curl_exec($ch);
    curl_close($ch);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多