企业级 ERP:SAP 和 NetSuite
分步指南:将 Sellio 与您的 SAP(OData)或 NetSuite(REST)进行双向连接,把账户、订单和发票发送到 ERP,并接收返回的事件(发票已付款、订单/客户已更新)。自带模型:ERP 和凭据都是您自己的。
该集成将 Sellio 连接到您的企业级 ERP,可以是通过 OData 的 SAP,也可以是通过 REST Record Service 的 NetSuite,支持深度双向同步。它是对通用“ERP / 账单”连接器(该连接器只向端点发起简单的 POST 请求)的补充:这里直接与每个平台的类型化 API 通信,使用各自真实的认证方式。自带模型:账户和凭据都是您自己的,我们这边不产生任何费用。默认一切都处于静默状态:在您完成配置并激活之前,不会发送或接收任何内容。密钥会加密存储,且不会再次显示。
每个方向发生的情况:在发送方向(Sellio → ERP)上,当您触发(或某个自动化触发)时,CRM 会用该 ERP 的“语言”构建记录(SAP 中的 OData EntitySet;NetSuite 中的 recordType),并发起经认证的 POST 请求。在接收方向(ERP → Sellio)上,您的 ERP 会在每个事件(发票已付款、订单已更新、客户已更新)发生时调用 Sellio 的 webhook URL;Sellio 会按金额+货币对账一笔待处理付款(当事件是已付款的发票/订单时),或在对应联系人上记录一条活动。重复的事件会通过外部 id 去重。
1. 前提条件
SAP(S/4HANA Cloud、通过 SAP Gateway 的 S/4HANA 本地部署,或 SAP BTP):您需要为将要同步的实体发布一个 OData 服务(例如,用于账户/联系人的标准服务 API_BUSINESS_PARTNER、用于订单的 API_SALES_ORDER_SRV、用于发票的 API_BILLING_DOCUMENT_SRV),以及用于调用它的凭据。有两种凭据方式:(a) 使用基本认证的通信用户,或 (b) SAP BTP 上的 OAuth 2.0 客户端(客户端凭据模式)。权限方面:该用户/客户端需要在所选的 OData 实体上具有创建(POST)权限。
NetSuite(SuiteTalk REST):您的账户需要启用“SuiteTalk(SOAP and REST Web Services)”和“Token-Based Authentication”功能,并且需要一个具有相应角色的用户,该角色对将要同步的对象(客户、销售订单、发票)拥有“Lists/Records”权限,以及“REST Web Services”权限(在 Setup 下)。您需要创建一个集成记录(Consumer Key/Secret)和一个访问令牌(Token ID/Secret)。
- 您必须是 Sellio 管理员(拥有管理设置的权限)才能保存并激活该连接器。
- 请准备好相关的 URL/ID:在 SAP 中是 OData 服务的基础 URL;在 NetSuite 中是您的账户 ID(例如 1234567,沙盒环境为 1234567_SB1)。
2. 在服务商处(SAP):暴露 OData 服务并创建凭据
- 发布/激活所需实体的 OData 服务。在 S/4HANA 本地部署中,使用事务代码 /IWFND/MAINT_SERVICE 添加并激活该服务(例如 API_BUSINESS_PARTNER);记下生成的基础 URL(类似 https://yourhost:44300/sap/opu/odata/sap/API_BUSINESS_PARTNER)。在 S/4HANA Cloud 中,该服务已预先发布,请从对应的通信安排(Communication Arrangement)中复制服务 URL。
- 创建通信凭据。对于基本认证:在“通信管理”→“维护通信用户”中,创建一个具有用户名和密码的通信用户;然后在“通信安排”中,将该用户与暴露 OData 服务的通信场景关联。对于 OAuth 2.0(BTP):创建一个服务实例,并记下客户端 ID、客户端密钥和令牌 URL(端点 /oauth/token)。
- 确保该用户/客户端对相应实体具有 POST(创建)权限。可以先用同一凭据在浏览器/Postman 中快速测试集合的 GET 请求,以确认访问权限正常。
2. 在服务商处,NetSuite(集成记录 + 访问令牌 TBA)
- 启用相关功能:Setup → Company → Enable Features → SuiteCloud 选项卡 → 勾选“SOAP Web Services”和/或“REST Web Services”以及“Token-Based Authentication”。保存。
- 创建集成记录:Setup → Integration → Manage Integrations → New。为其命名(例如“Sellio CRM”),保持“Token-Based Authentication”被勾选,如果只使用 TBA,则取消勾选“TBA: Authorization Flow”和“OAuth 2.0”,然后保存。NetSuite 只会显示一次 Consumer Key 和 Consumer Secret,请立即复制两者(不会再次显示)。
- 创建访问令牌:Setup → Users/Roles → Access Tokens → New。选择 Application Name(您创建的集成记录)、User 以及 Role(具有 Records 权限 + “REST Web Services”权限的角色)。保存。NetSuite 只会显示一次 Token ID 和 Token Secret,请立即复制两者。
- 记下您的账户 ID:Setup → Company → Company Information(“Account ID”字段),例如生产环境为 1234567,沙盒环境为 1234567_SB1。
3. 在 Sellio 中:粘贴凭据并激活
- 打开“设置 → 集成”,找到“SAP(企业级 ERP)”或“NetSuite(企业级 ERP)”卡片。
- SAP:在“OData 服务 URL”中,粘贴服务的基础 URL(不带末尾斜杠,也不带 EntitySet 名称,因为 Sellio 会自动附加正确的 EntitySet)。在“认证类型”中,选择 Basic(并粘贴用户名 + 密码)或 OAuth 2.0(并粘贴令牌 URL + 客户端 ID + 客户端密钥)。
- NetSuite:在“账户 ID”中,粘贴您的 ID(例如 1234567 或 1234567_SB1)。在“认证类型”中,选择基于令牌的认证(TBA),并粘贴 Consumer Key、Consumer Secret、Token ID 和 Token Secret。(如果您更倾向使用 OAuth 2.0,请选择该选项并粘贴访问令牌。)
- 如果您要将 ERP 的事件回传给 Sellio,请填写“Webhook 密钥”。这是接收方向的必填项:出于安全考虑(事件可能会结算一笔付款),Sellio 只接受携带此密钥/签名的 webhook。没有它,接收会被拒绝(参见第 4 步)。加密存储。
- 点击“保存连接器”。凭据会加密存储。然后点击“激活”。只有在连接器被激活后,发送和接收才会生效。
要接收 ERP 事件:保存后,使用“生成 webhook URL”并复制该 URL(格式为 https://app.../api/inbound/erp/YOUR_TOKEN)。将该 URL 粘贴到您 ERP 的 webhook 目标中:在 SAP 中,粘贴到自动化/中间件(Event Mesh、SAP BTP,或一个执行 POST 的作业)中;在 NetSuite 中,粘贴到 User Event Script/RESTlet 或自动化工具(SuiteFlow + 脚本)中,由其执行 POST 事件。SAP 还是 NetSuite 会通过令牌本身来识别,因此 URL 中无需选择服务商。
4. 如何测试
- 在连接器已激活的情况下,点击卡片上的“发送测试记录”。Sellio 会构建一个虚构账户(“Sellio CRM”连接测试),并将其发送到您的 ERP。
- 在 ERP 中检查:在 SAP 中,在相应实体中查找新创建的 Business Partner;在 NetSuite 中,在 Lists → Relationships → Customers 下查找新的 Customer。
- 如果显示“测试记录已发送到 ERP”,说明认证和端点均正确。之后,若要发送真实记录,请从 CRM 记录(账户、联系人、订单、商机或发票)触发发送,Sellio 会使用相同的路径。
- 要测试接收:在 ERP 中生成(或模拟)一个事件(例如,将某张发票标记为已付款),然后在 Sellio 中检查是否有一笔金额相同的待处理付款被对账,或对应联系人上是否出现了一条活动。
5. 故障排查
- 401(未授权):凭据错误或已过期。SAP Basic → 检查通信用户的用户名/密码;SAP OAuth → 检查客户端 ID/密钥以及令牌 URL;NetSuite TBA → 检查 Consumer Key/Secret 和 Token ID/Secret(多一个或少一个字符都会使签名失效)。请重新粘贴这些密钥(出于安全考虑,服务器不会再次返回它们)。
- TBA 签名无效(NetSuite):基于令牌的认证使用带 HMAC-SHA256 的 OAuth 1.0a;签名取决于方法、精确的 URL(包括查询参数)以及账户 ID(realm)。请确认账户 ID 正确(沙盒环境带 _SB1 后缀),且四个值(Consumer Key/Secret、Token ID/Secret)粘贴时没有多余空格。如果您在 NetSuite 中重新生成了令牌,请同步更新 Sellio 中的值。
- 403(禁止访问):凭据可以认证成功,但角色/用户没有创建该记录的权限。在 NetSuite 中,请检查角色权限(Lists/Records + “REST Web Services”);在 SAP 中,请检查该 OData 实体上的 POST 授权 / 通信场景。
- 实体/recordType 未找到(404):在 SAP 中,OData 服务 URL 错误,或该服务未被激活。请确认基础 URL(不含 EntitySet),并在 /IWFND/MAINT_SERVICE 中激活该服务。在 NetSuite 中,默认的 recordType 可能与您的不匹配,自定义的账户/订单/发票可能需要不同的 recordType(请联系支持团队调整映射)。
- 字段被拒绝:SAP 和 NetSuite 对属性名称的要求都很严格。Sellio 会发送一组保守的常用字段(姓名、邮箱、电话、公司、金额、货币、参考号)。如果您的 ERP 要求额外的必填字段(例如 SAP 中的 BP Category,或 NetSuite 中的 subsidiary),则需要进行映射,请在配置中调整映射或联系支持团队。
- Webhook 未到达(接收方向):请确认连接器已激活(未激活的连接器 webhook 会返回 404)、粘贴到 ERP 中的 URL 是完整的(包含令牌),并且如果您设置了“Webhook 密钥”,ERP 会在 X-Sellio-Secret 请求头中发送该密钥,或在签名请求头中发送请求体的 HMAC-SHA256。否则响应会是 401。