从 C# .Net Core 调用 Netsuite SOAP .wsdl

Jay*_*son 9 soap wsdl netsuite .net-core .net-6.0

首先,我发现这个链接对完成这项工作有很大帮助。

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

但想发布我的发现 - 以防它对其他人有帮助。

步骤 1:向您的项目添加服务引用(WCF Web 服务)

步骤 2:创建 NetSuitePortTypeClient 并打开它(使用您自己的帐户特定)

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

步骤 3:在此示例中创建交易搜索

        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;
Run Code Online (Sandbox Code Playgroud)

第 4 步:调用搜索

searchResponse sresponse = await nsptc.searchAsync(CreateTokenPassport(), null, null, null, tranSearch);
Run Code Online (Sandbox Code Playgroud)

AND 这是 CreateTokenPassword 函数

    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;
    }
Run Code Online (Sandbox Code Playgroud)

Eri*_*c P 1

以下是使用 C# 调用 NetSuite SOAP示例的完整代码:

 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;
    }
Run Code Online (Sandbox Code Playgroud)