我正在尝试自动将 NetSuite 采购订单链接到 NetSuite 销售订单,以下是我尝试完成此任务的代码。但我收到错误(见底部)。你能检查一下并让我知道我在这里遗漏了什么吗?
采购订单创建代码:
var createPurchaseOrder = new PurchaseOrder();
createPurchaseOrder.entity = new RecordRef()
{
internalId = “653”
//type = RecordType.purchaseOrder,
//typeSpecified = true
};
RecordRef soRecordRef = new RecordRef();
soRecordRef.internalId = “XXXXXXXX”;
soRecordRef.type = RecordType.salesOrder;
soRecordRef.typeSpecified = true;
createPurchaseOrder.createdFrom = soRecordRef;
RecordRef depRecordRef = new RecordRef();
depRecordRef.internalId = “3”;
depRecordRef.name = “eBay : eBay FNC”;
depRecordRef.type = RecordType.department;
depRecordRef.typeSpecified = true;
createPurchaseOrder.department = depRecordRef;
PurchaseOrderItem[] Items = new PurchaseOrderItem[1];
Items[0] = new PurchaseOrderItem();
RecordRef item = new RecordRef(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 NetSuite SuiteTalk REST Web 服务来访问 NetSuite CRM 数据。
我可以访问并在生产中工作。能够检索记录数据和元数据。
我现在正在尝试在沙箱中设置访问权限以进行更深入的测试。
在沙箱中,我有: - 启用休息 Web 服务 - 启用基于令牌的身份验证 - 给定用户并发 Web 服务权限 - 给定用户使用访问令牌权限登录 - 创建集成 - 创建访问令牌
所有这些操作都反映了在生产中所做的事情。
当我尝试对 Web 服务执行任何类型的 GET 操作时,我会收到 401 - 无效的登录尝试。
当我检查登录审计跟踪时,我没有看到任何 GET 尝试的记录,失败或其他。
是否有一些系统性的事情我必须在沙箱中额外做才能启用休息 Web 服务?除了在 SuiteCloud/SuiteTalk 中启用它?
我在审计跟踪中完全看不到任何东西的事实让我相信某些东西仍然“关闭”。
===> 4/4/2020 更新
ed14 和 Nihkil,
感谢您的回复,很抱歉回复延迟。
不幸的是,在领域中下划线的连字符对我没有帮助。
让我回顾一下最近的尝试:
1) 首先验证生产中的 REST API 测试是否仍然有效。
2) 沙箱由 CRM 管理员刷新。应用程序仍然存在,但我的访问令牌不在。我在沙箱中创建了一个新的。
是否可以删除应用程序?我看不出有什么办法可以做到这一点。
3) 使用现有的消费者令牌和新的访问令牌进行测试。得到了与我的第一篇文章相同的回复:"title": "无效的登录尝试,有关更多详细信息,请参阅登录审核跟踪。",
4) 通过稍微修改 URL 进行测试,以确保我不会去某个地方的黑洞。它给了我预期的错误。
5)通过修改realm进行测试:Realm 9999999-sb4到Realm 9999999_sb4它给了我一个错误,让我相信我原来的realm是正确的:“title”:“发生意外错误。错误ID:k8hd8pqej3unxblmaoik”,
同样,没有任何测试作为失败的尝试出现在审计日志的任何地方。
不知道从这里去哪里?删除沙箱应用程序(如果可能)并重新开始?还是沙箱中的新应用程序?
感谢您的任何帮助。
布莱恩亨特
我正在尝试使用基于令牌的身份验证对Netsuite API进行SOAP调用.我有一个从WDSL生成的C#客户端,它正在发送以下请求(更换了秘密).
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:messages_2016_2.platform.webservices.netsuite.com" xmlns:urn1="urn:core_2016_2.platform.webservices.netsuite.com">
<soapenv:Header>
<urn:partnerInfo>
<urn:partnerId>[MyAccountId]</urn:partnerId>
</urn:partnerInfo>
<urn:applicationInfo>
<urn:applicationId>[MyApplicationId]</urn:applicationId>
</urn:applicationInfo>
<urn:tokenPassport>
<urn1:account>[MyAccountId]</urn1:account>
<urn1:consumerKey>[MyConsumerKey]</urn1:consumerKey>
<urn1:token>[MyTokenId]</urn1:token>
<urn1:nonce>1574515852</urn1:nonce>
<urn1:timestamp>1499135589</urn1:timestamp>
<urn1:signature algorithm="HMAC-SHA1">Ll8DbLvTWsBh/G7UtenErR03OrM=</urn1:signature>
</urn:tokenPassport>
</soapenv:Header>
<soapenv:Body>
<urn:getDataCenterUrls>
<urn:account>[MyAccountId]</urn:account>
</urn:getDataCenterUrls>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我收到了以下回复
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>Ambiguous authentication</faultstring>
<detail>
<platformFaults:invalidCredentialsFault xmlns:platformFaults="urn:faults_2016_2.platform.webservices.netsuite.com">
<platformFaults:code>USER_ERROR</platformFaults:code>
<platformFaults:message>Ambiguous authentication</platformFaults:message>
</platformFaults:invalidCredentialsFault>
<ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">partners-java20004.sea.netledger.com</ns1:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多不同的方法来生成签名,nonce和时间戳.目前我有以下内容:
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()
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用 NetSuite 的 SuiteTalk (API) 服务来检索程序集列表。我需要在结果中加载 InventoryDetails 字段以查看分配给项目的序列号/批号。这是我正在使用的当前代码,但结果仍然显示这些字段返回为 NULL,尽管我可以看到 AssemblyBuild 对象的其他字段。我如何获取库存详细信息(序列号/批次号)以在交易搜索中返回?
public static List<AssemblyBuildResult> Get()
{
var listAssemblyBuilds = new List<AssemblyBuildResult>();
var service = Service.Context();
var ts = new TransactionSearch();
var tsb = new TransactionSearchBasic();
var sfType = new SearchEnumMultiSelectField
{
@operator = SearchEnumMultiSelectFieldOperator.anyOf,
operatorSpecified = true,
searchValue = new string[] { "_assemblyBuild" }
};
tsb.type = sfType;
ts.basic = tsb;
ts.inventoryDetailJoin = new InventoryDetailSearchBasic();
// perform the search
var response = service.search(ts);
response.pageSizeSpecified = true;
// Process response
if …Run Code Online (Sandbox Code Playgroud) 通过 Suitetalk API 连接到 NetSuite 生产帐户时,我收到以下错误:
我在连接到该客户端的沙盒帐户时没有遇到问题。我正在通过 C# WCF 项目进行连接。我不认为问题出在 c# 项目上,因为此代码正在与许多其他客户端一起在生产中使用。
在我看来,返回的 SOAP 消息格式不正确 - SOAP 消息中的“soapenv”元素之前似乎有一个换行符。在针对 API 创建“get”请求(使用护照登录)时,我收到此错误。不过,任何 API 调用都会出现此错误,我也尝试过通过 API 简单登录。
我已经仔细检查了该客户的登录详细信息和帐户信息,一切似乎都井井有条。此外,如果此信息不正确,我应该收到身份验证错误 - 而不是格式错误的 SOAP 消息。
任何帮助将不胜感激,谢谢!
我正在使用 Netsuite Web 服务 (SuiteTalk) api,但在使用 tokenPassport 时不断收到无效登录尝试错误。由于令牌身份验证看起来相当复杂,我将包括我已采取的所有步骤。
我已从“设置”>“集成”>“Web 服务首选项”中检索了帐户 ID
我已经设置了一个新角色,并且所有身份验证框均未选中。在权限>设置中我添加了以下权限
访问令牌管理=完整
用户访问令牌 = 完整
网络服务=完整
我已将新角色添加到我的用户访问权限中
我在“设置”>“集成”>“管理器集成”中创建了一个新应用程序,在“身份验证”选项卡下,我选择了“基于令牌的身份验证”
我已在“设置”>“用户/角色”>“访问令牌”中使用以下设置创建了一个新的访问令牌
应用程序名称 = 新应用程序
用户=我
角色=新角色
令牌名称 = 重命名为有意义的名称
我的请求 xml 看起来像
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:msg="urn:messages_2016_2.platform.webservices.netsuite.com"
xmlns:core="urn:core_2016_2.platform.webservices.netsuite.com">
<env:Header>
<msg:tokenPassport>
<core:account>123XXXX_SB1</core:account>
<core:consumerKey>MY_CONSUMER_KEY</cre:consumerKey>
<core:token>MY_TOKEN_ID</core:token>
<core:nonce>ZcVszy7ySJ3Ji8PIgwlW</core:nonce>
<core:timestamp>1530692570</core:timestamp>
<core:signature algorithm="HMAC-SHA256">nN7V4PH9qWNT9BocMQzKcFetqZ3QxpxutDJ8iZjSmH8=</core:signature>
</msg:tokenPassport>
</env:Header>
<env:Body>
<msg:get>
<msg:baseRef xsi:type="core:RecordRef" internalId="1234567" type="customer"/>
</msg:get>
</env:Body>
</env:Envelope>
Run Code Online (Sandbox Code Playgroud)
我正在使用以下 ruby 类来生成随机数和签名
class NetSuiteToken
attr_reader :account, :consumer_key, :consumer_secret, :token_id, :token_secret
def initialize(account, consumer_key, consumer_secret, token_id, token_secret)
@account = account.to_s
@consumer_key = consumer_key …Run Code Online (Sandbox Code Playgroud) 我对使用 SOAP 进行 NetSuite 调用这一领域还不熟悉。因此,我对如何解决问题的思考可能完全错误。这是我想要解决的问题: - 语言:Python+ Zeep - 我想将我的应用程序从电子邮件传递转移到基于令牌的身份验证。
在 Python 中,我能够生成 TokenPassport 的所有参数。这是我感到困惑的地方:我在堆栈上查找了一些代码,发现人们正在使用 client.service.login() 方法来登录。此方法采用护照而不是 tokenpassport 对象。是否有一个单独的方法可以使用 tokenpassport obj 进行登录?或者我是否需要使用参数生成(硬编码)一个 XML,并将其作为数据传入标头?
谢谢你
我正在尝试使用 NetSuite 的 SuiteScript API 在 NetSuite 上创建日记条目。
这是我的代码。
export function post() {
var rec = record.create({
type: record.Type.JOURNAL_ENTRY,
isDynamic: true,
});
rec.setValue({
fieldId: "memo",
value: "from api ",
});
rec.setValue({
fieldId: "type",
value: "Journal",
});
rec.setText({
fieldId: "type",
text: "Journal",
});
rec.setValue({ fieldId: "transactionnumber", value: "158" });
rec.setValue({ fieldId: "subsidiary", value: "2" });
rec.setText({ fieldId: "subsidiary", text: "Headquarters : United States" });
rec.setValue({ fieldId: "postingperiod", value: "238" });
rec.setText({ fieldId: "postingperiod", text: "Dec 2021" });
rec.setValue({ fieldId: "customform", value: …Run Code Online (Sandbox Code Playgroud) 我正在尝试将NetSuite的发票导入我的程序.在这个程序中,我需要尽可能多的关于发票的信息才能被退回.但是,似乎没有返回任何订单项信息.这是我为搜索完成的代码.有什么建议?我试图通过尽可能少的呼叫NetSuite来完成此操作,以保持高性能.
SearchResult searchResults = new SearchResult();
TransactionSearch ts = new TransactionSearch();
TransactionSearchBasic tsb = new TransactionSearchBasic();
// Search for Invoices
if (_InvoiceTxnIds.Count > 0)
{
tsb.internalId = new SearchMultiSelectField();
tsb.internalId.@operator = SearchMultiSelectFieldOperator.anyOf;
tsb.internalId.operatorSpecified = true;
List<RecordRef> rrlist = new List<RecordRef>();
foreach (string sTxnId in _InvoiceTxnIds)
{
RecordRef rr = new RecordRef();
rr.internalId = sTxnId;
rrlist.Add(rr);
}
tsb.internalId.searchValue = rrlist.ToArray();
ts.basic = tsb;
searchResults = _service.search(ts);
}
Run Code Online (Sandbox Code Playgroud) 我想从我的 netsuite 实例中提取销售订单。为了测试这一点,我使用邮递员。当使用带有 url 的 Netsuite REST API 教程环境时:
{{proto}}://{{host}}/rest/platform/{{version}}/record/salesorder
Run Code Online (Sandbox Code Playgroud)
(邮递员用环境值填充变量)
我应该得到一个包含所有销售订单列表的 JSON 对象。
但我收到这个错误:
{
"type": "https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1",
"title": "Invalid search query Record 'transaction' was not found. Reason: INSUFFICIENT_PERMISSIONS - Missing permissions for this record.",
"status": 400,
"o:errorCode": "INVALID_PARAMETER"
}
Run Code Online (Sandbox Code Playgroud)
我尝试为我的网络服务用户所使用的角色授予很多权限,但我还没有找到合适的权限。发出此获取请求需要什么权限?
netsuite ×10
suitetalk ×10
c# ×4
soap ×3
rest ×2
web-services ×2
.net ×1
python-3.x ×1
restlet-2.0 ×1
wsdl ×1