10

First of all, I found this link which was a HUGE help to get this working.

https://medium.com/@benwmills/using-the-netsuite-suitetalk-api-with-net-core-net-standard-40f1a4464da1

But wanted to post my findings - in case it helps anyone else.

Step 1: Add a Service Reference to your project (WCF Web Service)

Step 2: Create NetSuitePortTypeClient and Open it (use your own account specific)

NetSuitePortTypeClient nsptc = new NetSuitePortTypeClient(NetSuitePortTypeClient.EndpointConfiguration.NetSuitePort, "https://########.suitetalk.api.netsuite.com/services/NetSuitePort_2021_2");
await nsptc.OpenAsync();

Step 3: Create a Transaction Search in this example

        TransactionSearch tranSearch = new TransactionSearch();
        TransactionSearchBasic tranSearchBasic = new TransactionSearchBasic();

        SearchStringField searchstringfield = new SearchStringField();
        searchstringfield.@operator = SearchStringFieldOperator.@is;
        searchstringfield.operatorSpecified = true;
        searchstringfield.searchValue = "$$$$$$";

        tranSearchBasic.tranId = searchstringfield;
        tranSearch.basic = tranSearchBasic;

Step 4: Call the Search

searchResponse sresponse = await nsptc.searchAsync(CreateTokenPassport(), null, null, null, tranSearch);

AND Here is the CreateTokenPassword function

    public TokenPassport CreateTokenPassport()
    {
        string account = "account";
        string consumerKey = "ckey";
        string consumerSecret = "csecret";
        string tokenId = "token";
        string tokenSecret = "tokensecret";

        string nonce = ComputeNonce();
        long timestamp = ComputeTimestamp();
        TokenPassportSignature signature = ComputeSignature(account, consumerKey, consumerSecret, tokenId, tokenSecret, nonce, timestamp);

        TokenPassport tokenPassport = new TokenPassport();
        tokenPassport.account = account;
        tokenPassport.consumerKey = consumerKey;
        tokenPassport.token = tokenId;
        tokenPassport.nonce = nonce;
        tokenPassport.timestamp = timestamp;
        tokenPassport.signature = signature;
        return tokenPassport;
    }
Jay Peterson
  • 159
  • 6

2 Answers2

0

You've left out the ComputeNonce, ComputeTimestamp, ComputeSignature functions so this code doesn't work...

Matt
  • 425
  • 3
  • 13
0

Here is full code from example of calling NetSuite SOAP using C#:

 public TokenPassport CreateTokenPassport()
    {
        string account = DataCollection["login.acct"];
        string consumerKey = DataCollection["login.tbaConsumerKey"];
        string consumerSecret = DataCollection["login.tbaConsumerSecret"];
        string tokenId = DataCollection["login.tbaTokenId"];
        string tokenSecret = DataCollection["login.tbaTokenSecret"];
                    
        string nonce = ComputeNonce();
        long timestamp = ComputeTimestamp();
        TokenPassportSignature signature = ComputeSignature(account, consumerKey, consumerSecret, tokenId, tokenSecret, nonce, timestamp);

        TokenPassport tokenPassport = new TokenPassport();
        tokenPassport.account = account;
        tokenPassport.consumerKey = consumerKey;
        tokenPassport.token = tokenId;
        tokenPassport.nonce = nonce;
        tokenPassport.timestamp = timestamp;
        tokenPassport.signature = signature;
        return tokenPassport;
    }

    private string ComputeNonce()
    {
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        byte[] data = new byte[20];
        rng.GetBytes(data);
        int value = Math.Abs(BitConverter.ToInt32(data, 0));
        return value.ToString();
    }

    private long ComputeTimestamp()
    {
        return ((long) (DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
    }

    private TokenPassportSignature ComputeSignature(string compId, string consumerKey, string consumerSecret,  
                                    string tokenId, string tokenSecret, string nonce, long timestamp)
    {
        string baseString = compId + "&" + consumerKey + "&" + tokenId + "&" + nonce + "&" + timestamp;
        string key = consumerSecret + "&" + tokenSecret;
        string signature = "";
        var encoding = new System.Text.ASCIIEncoding();
        byte[] keyBytes = encoding.GetBytes(key);
        byte[] baseStringBytes = encoding.GetBytes(baseString);
        using (var hmacSha1 = new HMACSHA1(keyBytes))
        {
            byte[] hashBaseString = hmacSha1.ComputeHash(baseStringBytes);
            signature = Convert.ToBase64String(hashBaseString);
        }
        TokenPassportSignature sign = new TokenPassportSignature();
        sign.algorithm = "HMAC-SHA1";
        sign.Value = signature;
        return sign;
    }
Eric P
  • 2,907
  • 2
  • 24
  • 33