【问题标题】:Oauth implementation in netsuite using php and method GET使用 php 和方法 GET 在 netsuite 中实现 Oauth
【发布时间】:2020-12-14 22:19:45
【问题描述】:

这个答案对我来说很好,但只能使用 POST 方法

Oauth implementation in netsuite using php

我正在尝试使用相同的技术,但使用 GET 方法并让它工作,这是我的代码

<?php
//date_default_timezone_set('America/New_York');

define("NETSUITE_URL", 'https://5240409-sb1.restlets.api.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');

define("NETSUITE_CLIENT", 'XXXXXX');

function sendOrderToNS($details) {
    $oauth_nonce = md5(mt_rand());
    $oauth_timestamp = time();

    $oauth_signature_method = 'HMAC-SHA1';
    $oauth_version = "1.0";

    $base_string =
        "GET&" . 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
          . "&script=" . NETSUITE_SCRIPT_ID
          . "&client=" . NETSUITE_CLIENT
        );
    $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) .'"';

        var_dump($auth_header);

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL, NETSUITE_URL . '?&script=' . NETSUITE_SCRIPT_ID . '&deploy=' . NETSUITE_DEPLOY_ID . '&client=' . NETSUITE_CLIENT);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: ' . $auth_header,
        'Content-Type: application/json'
    ]);

    $result = curl_exec($ch);

    var_dump($result);

    curl_close($ch);
}

sendOrderToNS();

我收到以下错误:

"{"error" : {"code" : "INVALID_LOGIN_ATTEMPT", "message" : "Invalid login attempt."}}"

我很确定这个错误是针对格式错误的签名,但我不知道我做错了什么

【问题讨论】:

  • 怎么了?
  • 错误是什么?
  • 抱歉,我将编辑问题并添加我收到的错误消息
  • 嘿伙计,你整理好了吗?我有同样的问题!生成那个糟糕的身份验证标头太复杂了
  • @EzequielFernandez 是的,问题在于参数的顺序,它需要按字母顺序排列

标签: php oauth netsuite


【解决方案1】:

问题出在查询参数上,它需要按字母顺序排列,所以不是

$base_string =
        "GET&" . 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
          . "&script=" . NETSUITE_SCRIPT_ID
          . "&client=" . NETSUITE_CLIENT
        );

我不得不这样做

$base_string =
        "GET&" . urlencode(NETSUITE_URL) . "&" .
        urlencode(
            "client=" . NETSUITE_CLIENT
          . "&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
          . "&script=" . NETSUITE_SCRIPT_ID
        );

【讨论】:

  • 好人,谢谢!我明白了,但是如果您需要发送带有正文参数的 POST 或 PATCH 怎么办?它适用于 GET 但不适用于其他人
  • 我这里也有一个帖子示例,只是将 GET 更改为 POST 并添加了curl_setopt($ch, CURLOPT_POST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
  • codeshare.io/5OQQ10 24小时后过期,尝试保存
  • 非常感谢您,这非常有帮助!但仍然不能正常工作。有时您需要使用 ?paramaeteres 发送一个 GET ,但它不适用于那个.. like= /customer?expandSubResources=true 或 /salesOrder?q=otherRefNum+is+{$otherRefNum} 等等。我已经花了5天,我很沮丧。我不敢相信甲骨文会做这种事
  • 最安全的身份验证,被授权的人无法进行身份验证,哈哈,@EzequielFernandez 你把这些参数按字母顺序排列了吗?并将带有这些参数的 url 添加到 restlet_url?
猜你喜欢
  • 2015-12-28
  • 2021-11-20
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多