通过 Checkout 在 AppExchange 上销售

通过以下方式直接从您的房源接受信用卡付款和银行转账 AppExchange 签出。将您的销售和收入数据转化为见解和行动 结账管理应用程序。

  • AppExchange Checkout Checkout
    是 AppExchange 的集成支付平台。您可以使用它来管理在线支付并监控 AppExchange 解决方案的销售情况。借助 Checkout,客户可以通过信用卡或银行转账直接从您的列表中购买您的解决方案。若要使用 Checkout,必须在托管包中分发解决方案,并且不能将 Checkout 用于 OEM 应用。Checkout 可与许可证管理应用程序 (LMA) 一起使用,以完全自动化许可,并可与 Checkout 管理应用程序 (CMA)(一种绩效跟踪和电子邮件通知工具)一起使用。
  • 结账管理应用程序 结账管理应用程序
    (CMA) 将 Salesforce 的强大功能引入 AppExchange Checkout。美观的仪表板直观地显示 AppExchange Checkout 数据,因此可以轻松查看产品的性能。自动电子邮件通知可在产品/服务发生活动时让客户和团队成员随时了解情况。

AppExchange 结账

Checkout 是 AppExchange 的集成支付平台。您可以使用它进行在线管理 支付并监控 AppExchange 解决方案的销售情况。通过 Checkout,客户可以购买您的 直接通过信用卡或银行转账从您的列表中找到解决方案。要使用 Checkout,您需要 必须在托管包中分发解决方案,并且不能将 Checkout 用于 OEM 应用。 Checkout 已准备好与许可证管理应用程序 (LMA) 一起使用,以完全自动化许可,并且 它已准备好与结账管理应用程序 (CMA)、绩效跟踪和电子邮件一起使用 通知工具。

注意

AppExchange Checkout 仅向符合条件的 Salesforce 合作伙伴提供英文版本。为 有关合作伙伴计划的更多信息(包括资格要求),请访问 https://partners.salesforce.com。

提示

刚刚开始使用 Checkout?前往 Trailhead 并获得 AppExchange Checkout 徽章。

下面介绍了 Checkout 如何更轻松地在 AppExchange 上销售解决方案。

您感兴趣的是:收款处:
现代而灵活的支付体验。建立在在线支付行业领导者 Stripe 之上。使用 Checkout,您可以 能:接受信用卡和/或银行付款。提供一次性和订阅定价计划。提供优惠券和试用。收取增值税 (VAT) 和美国销售税。
解决方案的自动许可。已准备好与 LMA 一起使用。当客户使用 签出时,许可证记录会自动在 LMA 中配置。如果客户 升级、续订或取消订阅,Checkout 会更新 许可证。
关于客户的见解。可与 CMA 一起使用。CMA 将 Salesforce CRM 的强大功能带到了 收款处。使用 CMA 的仪表板浏览收入、订阅状态和 其他关键数据。向客户和团队成员发送可自定义的通知 试用期满、付款被拒绝和其他事件。
  • AppExchange Checkout 中的定价计划 Checkout
    支持两种类型的定价计划:一次性和订阅。对于任一类型的计划,您都可以按用户或按公司向客户收费。如果按用户收费,则客户会为其组织中使用解决方案的每个用户购买单独的许可证。如果按公司收费,则客户将购买组织范围的许可证。组织范围的许可证意味着其组织中的每个用户都可以使用你的解决方案。为了向买家提供灵活的付款方式,请在您的商品信息中提供多种定价计划。
  • AppExchange Checkout 中的付款方式 Checkout
    支持两种付款方式:信用卡和银行账户转帐。您可以在房源中接受一种或两种付款方式。
  • AppExchange Checkout 中如何分享收入?
    作为 Salesforce 合作伙伴,您同意分享您销售的每个 AppExchange 解决方案的收入。您与 Salesforce 分享的收入取决于付款类型。如果客户通过银行转账付款,则收入分成为 15%。如果客户使用信用卡付款,则收入分成为 15%,外加我们的支付合作伙伴 Stripe 收取的每笔交易 0.30 美元的费用。无论付款类型如何,都没有最低收入分成。我们也不收取安装费、月度服务费或卡存储费。
  • AppExchange Checkout 入门 借助 Checkout
    ,您的客户可以直接从您的 AppExchange 列表中通过信用卡或银行转账购买您的解决方案。要开始使用 Checkout 接受付款,请创建一个 Stripe 账户,将该账户连接到您的列表,并将定价计划添加到列表,所有这些都在 Salesforce 合作伙伴控制台中完成。
  • 在 AppExchange Checkout 中支持国际支付 只需几个步骤,您就可以让 Checkout
    准备好接受来自欧盟 (EU) 和其他地区客户的付款。首先,确认您的公司位于欧盟或英国。然后,如果您所在的国家/地区的税务机关要求您收取增值税 (VAT),请在发布控制台中启用增值税。
  • 管理 AppExchange Checkout 订阅 处理与 Checkout 订阅相关的常见客户请求,例如查看付款历史记录、添加或删除许可证以及取消订阅
  • AppExchange Checkout 常见问题解答
    查找有关 Checkout 的常见问题的答案。

AppExchange Checkout 中的定价计划

Checkout 支持两种类型的定价计划:一次性和订阅。对于任何一个 计划类型,您可以按用户或按公司向客户收费。如果您在 基于每个用户,您的客户为其组织中使用 您的解决方案。如果按公司收费,则客户将购买组织范围的许可证。一 组织范围的许可证意味着其组织中的每个用户都可以使用你的解决方案。为客户提供 通过灵活的付款方式,为您的列表提供多种定价计划。

以下是您可以提供的计划的细分。

定价计划定价单位客户需要支付以下费用:在以下位置设置计划:
一次性每个用户每家公司一次,在购买时Salesforce 合作伙伴控制台中的列表生成器
订阅每个用户每家公司每月或每年定期Salesforce 合作伙伴控制台中的列表生成器

AppExchange Checkout 中的付款方式

Checkout 支持两种付款方式:信用卡和银行账户转账。您可以 接受房源中的一种或两种付款方式。

注意

您在 Stripe 中的公司地址决定了您可以接受的银行转账类型。 要接受自动清算所 (ACH) 付款,您的公司必须位于美国 国家。要接受单一欧元支付区 (SEPA) 付款,您的公司必须位于 欧盟。您不能同时接受 ACH 和 SEPA 付款。

付款方式客户使用以下方式付款:笔记
信用卡Visa、MasterCard、American Express、JCB、Discover 或 Diners Club 信用卡。付款将立即处理。
美国银行转账来自美国银行的支票、储蓄或货币市场账户 国家。付款使用 ACH 网络处理。付款最多可能需要 5 天才能处理。您在 Stripe 中的定价计划必须以美元 (USD) 为单位。客户必须使用商业银行账户付款。Checkout 不支持 ACH 付款 从个人银行账户。客户必须拥有美国帐单邮寄地址。
欧洲银行转账来自欧洲银行的支票、储蓄或货币市场账户 联盟。付款使用 SEPA 框架进行处理。付款将立即处理。您在 Stripe 中的定价计划必须以欧元 (EUR) 为单位。客户必须具有欧盟帐单邮寄地址。

AppExchange Checkout 中如何分享收入?

作为 Salesforce 合作伙伴,您同意为符合以下条件的每个 AppExchange 解决方案分享收入 你卖。您与 Salesforce 分享的收入取决于付款类型。如果 客户通过银行转账付款,收入分成为 15%。如果客户使用信用付款 卡,收入分成为 15%,加上我们的支付合作伙伴收取的每笔交易 0.30 美元的费用, 条纹。无论付款类型如何,都没有最低收入分成。我们也不收费 设置费、月度服务费或卡存储费。要了解收益分成的工作原理,让我们看一些示例。

付款方式
银行转账您以每位用户每月 50 美元的价格出售应用程序。如果客户购买了 10 个许可证 银行转账,以下是收入的分享方式。总交易金额为每月 500 美元(每位用户每月 50 美元 x 10 用户)。与 Salesforce 共享的金额为每月 75 美元(15% x 每 500 美元 月)。
信用卡您以每位用户每年 1,000 美元的价格出售应用程序。如果客户购买了 5 个许可证 使用信用卡,以下是收入的分享方式。总交易金额为每年 5,000 美元(每位用户每年 1,000 美元 x 5 个用户)。与 Salesforce 共享的金额为每年 750.00 美元(15% x 每 5,000 美元 年)。与 Stripe 共享的金额为 0.30 USD(1 笔信用卡交易 x 每笔 0.30 USD 交易费)。

AppExchange Checkout 入门

借助 Checkout,您的客户可以通过信用卡或银行转账购买您的解决方案 直接从您的 AppExchange 列表中获取。要开始使用 Checkout 接受付款,请创建一个 Stripe 账户,将账户连接到您的房源,并将定价计划添加到房源中——全部在 Salesforce 合作伙伴控制台。

  • 为 AppExchange Checkout 创建 Stripe 账户 要将 Checkout
    用于您的 AppExchange 列表,您必须在我们的支付合作伙伴 Stripe 处创建一个账户。
  • 将 Stripe 账户连接到您的 AppExchange 列表 要将 Checkout 用于您的 AppExchange 列表,请将您的 Stripe 帐户连接到 Salesforce 合作伙伴控制台中的列表
  • 将定价计划添加到您的 AppExchange Checkout 列表
    要使用 AppExchange Checkout 为您的解决方案提供订阅,请在 Salesforce 合作伙伴控制台中创建定价计划。然后将计划同步到 Stripe。定价计划设置解决方案的成本、货币和计费频率。
  • 激活 AppExchange Checkout
    的银行付款 要让客户通过银行转帐为您的解决方案付款,请在 Stripe 中请求此付款方式。在 Stripe 审核并批准您的请求后,您就有资格接收银行付款。根据您所在的位置,您可以通过自动清算所 (ACH) 网络或单一欧元支付区 (SEPA) 框架接受付款。
  • 发送 AppExchange Checkout 购买的电子邮件收据
    要向客户发送 Checkout 购买收据,请在 Stripe 管理平台中设置电子邮件收据。
  • 预览 AppExchange Checkout 体验 如果您在列表上启用了 Checkout,则可以通过修改 AppExchange 列表 URL 来预览客户购买体验
  • 将免费 AppExchange 列表转换为付费
    列表 如果与您的免费 AppExchange 列表关联的解决方案通过了安全审核,则可以使用 Checkout 将列表转换为接受付款。首先,在 Salesforce 合作伙伴控制台中启用结账。如有必要,然后支付安全审查费。

为 AppExchange Checkout 创建 Stripe 账户

要将 Checkout 用于您的 AppExchange 列表,您必须在我们的 支付合作伙伴 Stripe。

所需的用户权限
要管理 AppExchange 列表,请执行以下操作:管理房源

在创建 Stripe 账户之前,请准备好此信息。

  • 对您的业务的简短描述,例如您销售的产品
  • 有关您商家的基本信息,例如其实际地址
  • 外部身份提供商的登录信息,例如 Google、Facebook 或 LinkedIn
  • 要接收付款的银行账户的帐号和路由号码

收集此信息后,就可以开始了。

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击发布以转到 Salesforce 合作伙伴控制台。
  3. 点击列表
  4. 创建列表或编辑现有列表。
  5. 点击设置定价 |为您的解决方案定价
  6. 对于“定价模型”,请选择“付费”。
  7. 对于付款方式,请选择 AppExchange Checkout
  8. 选择何时从客户那里收集付款详细信息,在他们安装您的 溶液。
  9. 点击连接到 Stripe。如果您没有看到此选项,则可能是 您的 Stripe 账户已经连接,您可以跳到最后一步。Stripe 网站将在新的浏览器标签页中打开。
  10. 要创建您的 Stripe 账户,请按照 Stripe 网站上的提示操作。完成此步骤后,Stripe 选项卡将关闭,您将返回到 合作伙伴控制台。
  11. 验证您是否成功。如果您在解决方案中看到“Connected to Stripe as” 定价部分,一切就绪。您有一个 Stripe 账户,并且它已连接到 清单。

创建账户后,您可以在 Stripe 网站上对其进行管理。

将 Stripe 账户关联到您的 AppExchange 列表

要将 Checkout 用于您的 AppExchange 列表,请将您的 Stripe 账户连接到列表 在 Salesforce 合作伙伴控制台中。

用户 所需权限
要管理 AppExchange 列表,请执行以下操作:管理房源

如果您没有 Stripe 账户,请先按照为 AppExchange Checkout 创建 Stripe 账户中的说明创建一个账户。

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击发布以转到 Salesforce 合作伙伴控制台。
  3. 点击列表
  4. 创建列表或编辑现有列表。
  5. 点击设置定价 |为您的解决方案定价
  6. 对于“定价模型”,请选择“付费”。
  7. 对于付款方式,请选择 AppExchange Checkout
  8. 选择何时从客户那里收集付款详细信息,在他们安装您的 溶液。
  9. 点击连接到 Stripe。如果您没有看到此选项,则可能是 您的 Stripe 账户已经连接,您可以跳到最后一步。Stripe 网站将在新的浏览器标签页中打开。
  10. 要连接您的 Stripe 账户,请按照 Stripe 网站上的提示登录您的 帐户。如果您没有 Stripe 账户,请按照提示创建一个。完成此步骤后,Stripe 选项卡将关闭,您将返回到 合作伙伴控制台。
  11. 验证您的房源是否已关联到 Stripe。如果您在 解决方案定价部分,一切就绪。

连接 Stripe 账户后,您可以将定价计划添加到 清单。

将定价计划添加到您的 AppExchange 结帐列表

要使用 AppExchange Checkout 提供解决方案订阅,请创建定价 在 Salesforce 合作伙伴控制台中进行计划。然后将计划同步到 Stripe。定价计划将 解决方案的成本、货币和计费频率。

用户权限 需要
要管理 AppExchange 列表,请执行以下操作:管理房源

在创建定价计划之前,您必须已经拥有一个 Stripe 账户,并且 帐户必须连接到 Salesforce 合作伙伴控制台。了解如何操作,请参阅将 Stripe 账户连接到您的 AppExchange 列表。

重要

虽然可以在 Stripe 网站上编辑计划, 仅在合作伙伴控制台中进行编辑。在 Stripe 网站上所做的更改不会同步 返回合作伙伴控制台,并且不会出现在您的列表中。

您可以创建 为您的列表提供多种定价计划。例如,您可以创建一个使用 按月计费和另一个使用按年计费的计划。

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击发布以转到 Salesforce 合作伙伴控制台。
  3. 点击列表
  4. 创建列表,或编辑现有列表。如果您要创建商品信息,请填写所有 “填写基本信息”步骤中的必填字段。
  5. 点击设置定价
  6. 对于“定价模型”,请选择“付费”。
  7. 对于付款管理,请选择 AppExchange Checkout
  8. 选择何时在客户之前或之后收集客户的付款信息 安装解决方案。
  9. 如果之前未选择国家/地区,请选择一个国家/地区。
  10. 提供任何必需的税务信息。
  11. 单击“添加定价计划”。
  12. 填写所需的详细信息。定价计划详计划名称为您的计划指定一个描述性名称。我们建议包括账单 频率,例如 Annual。价格输入此计划的成本。货币选择客户可用于支付解决方案费用的币种。选择 美元 (USD),因此客户可以使用美国银行账户付款。选择欧元 (EUR) 因此,客户可以使用欧洲银行账户付款。单位选择是按用户还是按公司应用价格 (组织范围)。频率选择按月、按年或一次性计费频率。试用期(可选)为客户提供特定时间内的解决方案试用版 期限,例如 30 天。
  13. 选择在列表中显示解决方案定价中显示的计划名称 表,或作为计划 1、计划 2 等。如果只有一个计划,它会显示在您的 列为默认计划。
  14. 点击保存并同步到 Stripe
  15. 单击“保存并同步”。您对此商品信息所做的所有未保存的更改都会被保存,并且您的定价 套餐将同步到关联的 Stripe 账户。同步的定价计划会立即生效 在已发布的列表中可用。

激活 AppExchange Checkout 的银行付款

若要让客户通过银行转帐支付解决方案费用,请请求此付款方式 在 Stripe 中。在 Stripe 审核并批准您的请求后,您就有资格获得银行收款 付款。根据您所在的位置,您可以通过自动清算所接受付款 (ACH) 网络或单一欧元支付区 (SEPA) 框架。

注意

您在 Stripe 中的公司地址决定了您可以接受的银行转账类型。 要接受 ACH 付款,您的公司必须位于美国。接受 SEPA 付款,您的公司必须位于欧盟。您不能同时接受 ACH 和 SEPA 付款。

  1. 转到 Stripe 网站。
  2. 登录您的 Stripe 账户。
  3. 单击“设置”。
  4. 在付款和付款下,点击付款方式
  5. 为您的账户申请 ACH 贷记转账 (1) 或 SEPA 直接借记 (2)。您的激活请求将发送到 Stripe 进行处理。在以下情况下,您会收到一封电子邮件 您的请求已获批准。
  6. 如果您申请了 ACH 贷记转账,请验证激活是否成功。
    1. 再次访问 Stripe 网站。
    2. 登录您的 Stripe 账户。
    3. 转到 Stripe 的 ACH 指南。
    4. 单击启用 ACH。如果您没有看到启用 ACH 的选项,则 ACH 您的账户已激活贷记转帐。

发送 AppExchange Checkout 购买的电子邮件收据

要向客户发送 Checkout 购买的收据,请在 Stripe 中设置电子邮件收据 挡泥板。

  1. 登录 Stripe。
  2. 在 Stripe 管理平台中,点击设置
  3. 在付款和付款下,点击电子邮件收据
  4. 启用成功付款的设置。
  5. 点击保存

预览 AppExchange 结账体验

如果您在商品信息上启用了 Checkout,则可以预览客户购买 通过修改 AppExchange 列表 URL 获得体验。

  1. 转到解决方案的 AppExchange 列表。
  2. 将 &modal=appx_getitnow_buyform_modal 附加到 列出 URL,然后刷新页面。

将免费的 AppExchange 列表转换为付费列表

如果与您的免费 AppExchange 列表关联的解决方案通过了安全审核, 您可以使用 Checkout 将商品信息转换为接受付款。首先,在 Salesforce 合作伙伴控制台。如有必要,然后支付安全审查费。

所需的用户权限
要管理 AppExchange 列表,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 为列表启用结帐。
    1. 单击发布以转到 Salesforce 合作伙伴控制台。
    2. 点击列表
    3. 找到要更新的列表,然后单击磁贴。
    4. 点击设置定价 |为您的解决方案定价
    5. 选择“已付费”。
    6. 选择 AppExchange Checkout
    7. 选择何时在客户安装之前或之后向客户收集付款详细信息 您的解决方案。
    8. 如果之前未选择国家/地区,请选择一个国家/地区,并提供任何必需的税费 信息。
    9. 添加定价计划。
    10. 选择您接受的付款方式。
    11. 单击“下一步”。
  3. 在【获得批准】步骤中,提交您的商品信息以供审批。注意在我们工作期间,您可以继续创建房源信息。在您的房源 完成并批准后,即可将其发布到 AppExchange。
  4. 要支付安全审查费用,请记录支持案例。注意当您对解决方案收费时,将收取安全审查费用。费用免除 用于免费列表。
    1. 使用您注册 Salesforce 时使用的用户名登录 Salesforce 帮助 合作伙伴社区。
    2. 单击“联系支持人员”。
    3. 单击“创建案例”,然后填写必填字段。
    4. 对于主题,输入安全审查费用
    5. 有关说明,请提及您是转换免费 AppExchange 的 Salesforce 合作伙伴 上市付费。
    6. 当系统提示您选择产品时,请选择“合作伙伴社区和” AppExchange
    7. 对于主题,选择“安全审查”。
    8. 选择实例类型和严重性级别。
    9. 单击“创建案例”。Salesforce 与您联系以安排支付安全审查费用 费。

在 AppExchange Checkout 中支持国际支付

只需几个步骤,您就可以让 Checkout 准备好接受客户的付款 欧盟 (EU) 和其他地区。首先,确认您的公司位于欧盟或 英国。然后,如果您所在国家/地区的税务机关要求您收取 增值税 (VAT),请在发布控制台中启用增值税。

  • 对 AppExchange Checkout 交易收取增值税 如果您所在的国家/地区的税务机关要求您收取增值税 (VAT),您可以在 Checkout 交易
    中包含增值税。在 Salesforce 合作伙伴控制台中启用此选项后,增值税将应用于 Stripe 中的账单。您负责增值税登记、维护所需数据以及分配您收取的税费。
  • AppExchange Checkout
    的强客户身份验证 强客户身份验证 (SCA) 通过身份验证步骤增强了在线支付的安全性。了解 SCA 的工作原理、哪些地区需要它,以及它如何影响 Checkout 付款。然后让您的公司和客户为 SCA 做好准备。

收取 AppExchange 结账交易的增值税

如果您所在国家/地区的税务机关要求您征收增值税 (VAT),您可以 在结账交易中包含增值税。在 Salesforce 合作伙伴中启用此选项后 控制台,增值税适用于 Stripe 中的账单。您负责增值税登记, 维护所需的数据,并分配您收取的税款。

用户权限 需要
要管理 AppExchange 列表,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴 社区。
  2. 单击“发布”以转到 Salesforce 合作伙伴 安慰。
  3. 点击列表
  4. 创建列表,或编辑现有列表。
  5. 点击设置定价 |为您的解决方案定价
  6. 对于“定价模型”,请选择“付费”。
  7. 对于付款管理,请选择 AppExchange 结帐
  8. 选择何时在客户之前或之后向客户收集付款详细信息 安装解决方案。
  9. 如果尚未选择国家/地区,请选择一个国家/地区。
  10. 选择对 AppExchange 交易收取增值税的选项。注意一次性购买不支持增值税。
  11. 选择一个国家/地区并输入所有欧盟 (EU) 国家/地区的增值税号 您在哪里收取增值税。
  12. 保存更改。

如果您使用 Checkout Management 应用程序管理 Checkout 数据,则可以使用该应用程序 以查看增值税申报信息。

AppExchange Checkout 的强客户身份验证

强大的客户身份验证 (SCA) 增强了在线支付的安全性,具有 身份验证步骤。了解 SCA 的工作原理、哪些区域需要它以及它是如何工作的 影响结账付款。然后让您的公司和客户为 SCA 做好准备。

  • 什么是强客户身份验证?
    强大的客户身份验证 (SCA) 通过身份验证步骤增强了在线支付的安全性。在欧洲经济区,在线支付(包括 AppExchange Checkout 支付)需要 SCA。
  • 强客户身份验证如何影响 AppExchange Checkout 强客户身份验证 (SCA) 会自动集成到欧洲客户的 Checkout
    支付体验中。了解 SCA 如何影响初始购买和定期付款。
  • AppExchange Checkout 的强客户身份验证最佳实践 如果您在需要强客户身份验证 (SCA) 的区域销售 AppExchange 解决方案,请遵循这些 Checkout
    最佳实践。

什么是强客户身份验证?

强大的客户身份验证 (SCA) 增强了在线支付的安全性,具有 身份验证步骤。在欧洲经济区进行在线支付需要 SCA, 包括 AppExchange Checkout 付款。

SCA 由第二支付服务指令 (PSD2) 强制执行,该指令引入了以下法律 提高欧洲经济区在线支付的安全性。9月起 2019 年 14 月,居住在该地区的客户可能会被要求进行身份验证 在线购物的步骤。

客户可以使用密码、发送到移动设备的代码或 使用生物识别数据,例如指纹。此验证步骤适用于一次性 购买和定期付款,例如订阅。客户的银行卡或信用卡 颁发者通过验证其 身份。

从 2019 年 9 月 14 日开始,Checkout 会自动将 SCA 集成到付款中 为欧洲客户提供体验。要了解有关 SCA 的更多信息,请转到 https://stripe.com/docs/strong-customer-authentication。

强客户身份验证如何影响 AppExchange Checkout

强客户身份验证 (SCA) 会自动集成到 Checkout 中 欧洲客户的支付体验。了解 SCA 如何影响初始购买和 定期付款。

初次购买

首次购买是客户的第一笔结账交易。在最初的 购买时,客户使用结帐向导选择付款计划和方法, 提供账单和联系信息,并确认付款。在以下地区 需要 SCA,则 Checkout 向导会添加身份验证步骤。

客户点击购买后,Checkout 可能会提示他们 以验证他们的身份。例如,系统可能会要求他们输入验证 发送到与其付款方式关联的移动设备的代码。这 验证步骤使用 3DS 验证 2 协议,由 Checkout 的付款管理 合作伙伴,Stripe。在客户验证其身份后,Stripe 会处理 付款。

定期付款

客户还可以按月或按年进行定期付款。在区域 需要 SCA 的,第一笔付款是初始购买,客户可能是 要求验证其身份以完成交易。结账尝试 使用初始中提供的帐单详细信息处理后续付款 根据订阅的条款和条件进行购买。在需要 SCA、客户的银行或信用卡发卡机构审查付款尝试,并 确定是否请求客户授权。

如果需要客户授权,Stripe 会将付款标记为失败。下一个 当客户登录 AppExchange 时,Checkout 会提示客户进行授权 付款 (1)。客户单击“授权”(2),然后 使用与初始购买相同的过程验证其身份。之后 客户验证其身份,Stripe 处理付款。

AppExchange Checkout 的强大客户身份验证最佳实践

如果您在需要强大客户的区域销售 AppExchange 解决方案 身份验证 (SCA),请遵循这些 Checkout 最佳实践。

  1. 让您的客户为强客户身份验证做好准备 如果您为欧洲经济区的客户提供服务,请告知强客户身份验证
    (SCA) 如何影响在线支付,包括 AppExchange 解决方案的付款。
  2. 管理需要客户授权的 AppExchange Checkout 订阅付款
    如果 Checkout 订阅付款因需要客户授权而失败,请确定 Stripe 如何处理相关订阅。例如,您可以将 Stripe 配置为取消订阅、将订阅标记为未付费或不执行任何操作。
  3. 查看需要客户授权的 AppExchange Checkout 订阅付款
    如果 Checkout 订阅付款因需要客户授权而无法处理,则 Stripe 会将付款标记为失败。在 Stripe 管理平台中查看这些付款,查看交易详情,包括客户联系信息。您可以使用此信息跟进客户,并提供在 AppExchange 上授权付款的说明。
  4. 授权 AppExchange Checkout 订阅付款 在需要强客户身份验证 (SCA) 的区域,客户的银行或信用卡发卡机构可能会要求客户定期授权 Checkout 订阅付款
    。要查看需要客户授权的付款,请查看您的 Stripe 管理平台。如果需要授权,我们会在客户登录 AppExchange 时提示他们。但是,您也可以向客户提供授权付款的自助服务说明。

让您的客户为强大的客户身份验证做好准备

如果您为欧洲经济区的客户提供服务,请传达客户有多强大 身份验证 (SCA) 会影响在线支付,包括 AppExchange 的支付 溶液。在您的沟通中,我们建议您:

  • 定义 SCA 并解释 SCA 如何改变在线支付体验。
  • 请注意,SCA 会影响欧洲经济区的多种类型的在线支付, 包括 AppExchange 付款。
  • 说明可能会要求客户定期授权 AppExchange 付款, 其中包括身份验证步骤。
  • 说明如果需要授权,我们会在客户登录时提示他们 AppExchange。
  • 提供用于授权 AppExchange 订阅付款的自助服务步骤。

管理需要客户的 AppExchange Checkout 订阅付款 授权

如果 Checkout 订阅付款因需要客户授权而失败, 确定 Stripe 如何处理相关订阅。例如,您可以将 Stripe 配置为 取消订阅、将订阅标记为未付费或不执行任何操作。

  1. 登录 Stripe。
  2. 在 Stripe 管理平台中,点击设置
  3. 在“计费”下,单击“订阅和电子邮件”。
  4. 转到管理需要 3DS 验证的付款,然后配置订阅 状态 (1)。重要不要启用“客户电子邮件”设置。自 授权付款时,客户必须登录 AppExchange。

查看需要客户授权的 AppExchange Checkout 订阅付款

如果 Checkout 订阅付款因需要客户而无法处理 授权时,Stripe 会将付款标记为失败。在 Stripe 管理平台中查看这些付款,以便 查看交易详情,包括客户联系信息。您可以使用此信息来 跟进客户并提供授权付款的说明 AppExchange。

  1. 登录 Stripe。
  2. 在 Stripe 管理平台中,点击支付
  3. 按如下方式配置付款筛选器。滤波器价值地位不完全的
  4. 单击完成
  5. 点击付款可查看有关交易的详细信息。

授权 AppExchange Checkout 订阅付款

在需要强客户身份验证 (SCA) 的地区,客户的银行或 信用卡发卡机构可能会要求客户授权 Checkout 订阅付款 周期性地。要查看需要客户授权的付款,请查看您的 Stripe 管理平台。如果 授权是必需的,我们会在客户登录 AppExchange 时提示他们。但是,您 还可以为客户提供授权付款的自助服务说明。

所需的用户权限
要管理 AppExchange 订阅,请执行以下操作:管理账单
  1. 登录到 AppExchange。
  2. 在用户配置文件菜单中,单击“我的安装”和“我的安装” 订阅
  3. 找到需要授权的订阅。
  4. 单击“授权付款”(1)。
  5. 查看订阅详细信息,然后单击“授权”。

管理 AppExchange Checkout 订阅

处理与 Checkout 订阅相关的常见客户请求,例如查看 付款历史记录、添加或删除许可证以及取消订阅。

  • 查看 AppExchange 结帐收据
    如果客户请求提供之前 Checkout 付款的收据,您可以共享在 AppExchange 上查看付款历史记录的自助服务步骤。
  • 在 AppExchange Checkout 订阅中添加或删除许可证 您的客户可以在 AppExchange 上在其 Checkout 订阅
    中添加或删除许可证。如果客户在当前计费周期内添加许可证,则额外的许可证将立即可用。Checkout 在客户的下一个计费周期按比例收取费用。如果客户删除许可证,则删除将在下一个计费周期开始时生效。删除生效后,Checkout 会向客户收取减少的许可证计数费用。分享这些在 AppExchange 上更新其订阅的自助服务步骤。
  • 取消 AppExchange Checkout 订阅 如果客户想要结束 Checkout 订阅,您可以在 AppExchange 上共享取消订阅
    的自助服务步骤。取消在合同期限结束时生效。

查看 AppExchange 结帐收据

如果客户要求提供之前 Checkout 付款的收据,您可以共享 在 AppExchange 上查看付款历史记录的自助服务步骤。

所需的用户权限
要管理 AppExchange 订阅,请执行以下操作:管理账单
  1. 登录到 AppExchange。
  2. 在用户配置文件菜单中,单击“我的安装”和“我的安装” 订阅
  3. 找到要查看其付款历史记录的订阅。
  4. 从下拉列表中,选择“管理订阅”。
  5. 转到“付款历史记录”,然后单击发票以查看有关购买的详细信息。

在 AppExchange Checkout 订阅中添加或删除许可证

您的客户可以在其 Checkout 订阅中添加或删除许可证 AppExchange。如果客户在当前计费周期内添加许可证,则额外的 许可证立即可用。Checkout 向客户收取按比例计算的下一次费用 计费周期。如果客户删除许可证,则删除将在客户开始执行时生效 下一个计费周期。Checkout 在删除时向客户收取减少的许可证数量费用 生效。分享这些用于更新其订阅的自助服务步骤 AppExchange。

所需的用户权限
要管理 AppExchange 订阅,请执行以下操作:管理账单

警告

请勿使用 Stripe 网站更改 AppExchange 客户的许可证。更改不会同步到 Checkout 或许可证管理 应用程序 (LMA)。相反,请按照修改许可证记录中的说明使用 LMA 进行许可证更新

  1. 登录到 AppExchange。
  2. 在用户配置文件菜单中,单击“我的安装”和“我的安装” 订阅
  3. 找到要更新的订阅。
  4. 从下拉列表中,选择“管理订阅”。
  5. 单击编辑
  6. 转到“付款详细信息”,然后编辑与 订阅。
  7. 单击“查看更改”。
  8. 同意条款和条件,然后单击“保存”。

取消 AppExchange Checkout 订阅

如果客户想要结束 Checkout 订阅,您可以共享 在 AppExchange 上取消订阅。取消在 合同期限。

所需的用户权限
要管理 AppExchange 订阅,请执行以下操作:管理账单
  1. 登录到 AppExchange。
  2. 在用户配置文件菜单中,单击“我的安装”和“我的安装” 订阅
  3. 找到要取消的订阅。
  4. 从下拉列表中,选择“管理订阅”。
  5. 单击“结束订阅”,然后确认取消。

AppExchange Checkout 常见问题解答

查找有关 Checkout 的常见问题的答案。

  • AppExchange Checkout 是否会取代许可证管理应用程序?
    不可以,Checkout 与 LMA 合作以支持许可流程。当客户购买您的解决方案时,Checkout 会在 LMA 中创建许可证记录。如果客户在 AppExchange 上编辑其订阅(例如通过添加席位),则 LMA 中的许可证记录会自动更新以反映这些更改。
  • AppExchange Checkout 如何影响 Trialforce 和潜在客户管理?
    结账不会影响您的 Trialforce 配置或您管理潜在客户的方式。但是,当客户使用 Checkout 注册试用版时,相应的试用用户在许可证管理应用程序 (LMA) 中列为“活动”。
  • 在安装之前还是之后收集 AppExchange Checkout 客户的付款信息更好?
    这两种方法都有优点。我们建议您考虑您的目标客户和业务流程,然后再做出决定。使用此表来指导您的决策。
  • AppExchange Checkout 是否支持多种货币?
    是的。要在房源中提供其他货币,请前往合作伙伴控制台,将计划添加到房源中。当客户购买您的解决方案时,Checkout 会以您在计划中指定的货币向他们收费。当 Stripe 将付款转给您时,付款会转换为您银行账户使用的货币。
  • 如果我使用 AppExchange Checkout 销售我的解决方案,客户是否必须从 AppExchange 购买?
    是的,购买必须在 AppExchange 上进行,并且根据您的 Salesforce 合作伙伴协议进行收益分成。此外,如果以其他方式处理交易,则 Checkout 无法将购买与您的解决方案相关联,也无法使用许可证管理应用程序 (LMA) 预配许可证。
  • 我的客户可以切换到其他 AppExchange Checkout 付款计划吗?
    是的,您可以在 Stripe 中将客户切换到其他套餐。新计划在下一个计费周期开始时生效。如果您希望更改立即生效,请在 Stripe 中取消当前计划,并要求客户从您的列表中购买新计划。
  • 如果客户的信用卡付款在 AppExchange Checkout 中被拒绝,其许可证是否会变为非活动状态?
    在 Stripe 设置中,您可以确定信用卡被拒绝时会发生什么情况。您可以重试付款或停用订阅。如果停用订阅,许可证将变为非活动状态。
  • 当 AppExchange Checkout 客户在当前计费周期内添加或删除许可证时,如何计费?
    如果客户在当前计费周期内添加许可证,则许可证可立即使用。Checkout 在客户的下一个计费周期按比例收取费用。如果客户删除许可证,则减少将在下一个计费周期开始时生效。客户可以在当前计费周期内继续使用许可证。Checkout 从客户的下一个计费周期开始向客户收取减少的许可证计数费用。
  • 如果管理员使用 AppExchange Checkout 购买并安装解决方案,其他用户是否可以在 AppExchange 上编辑订阅?
    是的,前提是用户在与订阅关联的 Salesforce 组织中具有“管理账单”权限。
  • 为什么我的客户无法进行 AppExchange Checkout 购买?
    如果客户在您的列表中单击“立即获取”,但无法进行 Checkout 购买,请验证该客户是否已使用受支持的 Salesforce 组织登录 AppExchange。Checkout 仅支持状态为“活动”的付费组织。不支持试用组织、沙盒组织和 Developer Edition 组织。
  • AppExchange Checkout 是否支持在 Stripe 中创建的税率?
    不。虽然 Stripe 允许您创建税率,但 Checkout 不支持 Stripe 税率。Salesforce 在内部管理税率,包括美国销售税和增值税 (VAT) 的税率。

AppExchange Checkout 是否取代了许可证管理 应用程序?

不可以,Checkout 与 LMA 合作以支持许可流程。当客户 购买您的解决方案时,Checkout 会在 LMA 中创建许可证记录。如果客户编辑 他们在 AppExchange 上的订阅,例如通过添加席位、LMA 中的许可证记录 自动更新以反映这些更改。

AppExchange Checkout 如何影响 Trialforce 和潜在客户 管理?

结账不会影响您的 Trialforce 配置或您管理潜在客户的方式。然而 当客户使用 Checkout 注册试用版时,相应的试用用户在许可证管理应用程序 (LMA) 中列为“活动”。

在之前收集 AppExchange Checkout 客户的付款信息是否更好,还是更好 安装后?

这两种方法都有优点。我们建议您考虑您的目标客户和 您的业务流程,然后做出决定。使用此表来指导您的决策。

何时收集付款信息?这种方法的优点是什么?试验在哪里进行?它是如何工作的?
安装试用时长是在您向商品信息添加定价计划时设置的。客户可以轻松地在试用体验和付费体验之间转换,因为你 拥有处理订单所需的信息。条纹客户选择一个计划并输入付款详细信息,然后再安装 包。AppExchange 根据所选计划在 Stripe 中创建订阅,包括 试用信息。接下来,在包所在的合作伙伴业务组织中创建许可证 注册。试用期在 Stripe 中管理。试用期结束后,Stripe 会收取费用 直接使用信用卡。
安装试用时长在许可证管理应用程序 (LMA) 中设置。客户可以快速试用您的解决方案,因为他们不必提供 预先付款信息。如果您的目标市场包括企业客户,则此选项是理想的选择。这些 当付款详细信息为 进入。许可证管理应用程序 (LMA)客户从“我的安装和订阅”页面购买您的解决方案 AppExchange。许可证是根据您设置的默认许可证行为在 LMA 中创建的 在包注册期间。试用期由您设置的默认许可证行为决定。AppExchange 在客户完成 购买流程。当您在 LMA 中管理试验时,请记住,客户无法看到您的 LMA 设置。若要传达试用时长,请使用“其他定价详细信息”字段 在您的列表中。

AppExchange Checkout 是否支持多种货币?

是的。要在房源中提供其他币种,请前往合作伙伴控制台,然后添加 您的房源计划。当客户购买您的解决方案时,Checkout 将收取费用 它们以您在计划中指定的货币表示。当 Stripe 将 支付给您的,它将转换为您的银行使用的货币 帐户。

如果我使用 AppExchange Checkout 销售我的解决方案,客户是否必须 从 AppExchange 购买?

是的,购买必须在 AppExchange 上进行,并且需要根据您的 Salesforce 合作协议。此外,如果交易以其他方式处理, Checkout 无法将购买与您的解决方案相关联,也无法将许可证与 许可证管理应用程序 (LMA)。

我的客户可以切换到其他 AppExchange Checkout 付款计划吗?

是的,您可以在 Stripe 中将客户切换到其他套餐。新计划生效 在下一个计费周期开始时。如果您希望更改立即生效, 在 Stripe 中取消当前计划,并要求客户从您的 清单。

如果客户的信用卡付款在 AppExchange Checkout 中被拒绝, 他们的许可证会失效吗?

在 Stripe 设置中,您可以确定信用卡被拒绝时会发生什么情况。 您可以重试付款或停用订阅。如果停用订阅, 许可证变为非活动状态。

当 AppExchange Checkout 客户在 当前计费周期?

如果客户在当前计费周期内添加许可证,则许可证为 可立即使用。Checkout 向客户收取按比例计算的下一次费用 计费周期。如果客户删除许可证,则减少将在客户删除许可证时生效 下一个计费周期。客户可以在当前计费期间继续使用许可证 时期。Checkout 向客户收取减少的许可证数量,从他们的下一个许可证开始 计费周期。

如果管理员使用 AppExchange Checkout 购买并安装解决方案, 其他用户可以在 AppExchange 上编辑订阅吗?

是,前提是用户在 Salesforce 组织中具有“管理账单”权限 与订阅关联。

为什么我的客户无法进行 AppExchange Checkout 购买?

如果买家点击了商品信息上的【立即获取】,但无法制作 结帐购买,验证客户是否已使用受支持的 Salesforce组织。Checkout 仅支持状态为“活动”的付费组织。 不支持试用组织、沙盒组织和 Developer Edition 组织。

AppExchange Checkout 是否支持在 条纹?

不。尽管 Stripe 允许您创建税率,但 Checkout 不支持 条纹费率。Salesforce 在内部管理税率,包括美国销售税和 增值税 (VAT)。

AppExchange 搜索的工作原理是什么?

搜索是 Salesforce 客户最流行的查找方式之一 AppExchange 上的解决方案。了解关键字相关性、参与度、列表体验和 机器学习会影响客户看到的搜索结果。然后应用提示来提供帮助 客户在搜索业务解决方案时会发现您的列表 问题。

哪些因素会影响 AppExchange 搜索结果?

当用户搜索 AppExchange 时,有四个因素会影响他们看到的结果。关键词 相关性是最重要的因素,其次是参与度、上市经验和机器 学习。

关键字相关性

关键字相关性考虑了客户的搜索词与文本的对齐程度 清单。搜索词与列表文本的一致性越高,其关键字就越高 关联。标题、标语和简要描述文本的权重高于其他文本 列出文本。例客户访问 AppExchange 以查找用于管理调查的应用程序。他们的搜索 包括“反馈”和“收集”这两个词。包含以下字词的 AppExchange 列表 与没有的列表相比,具有更高的关键字相关性。

婚约

参与度取决于您的列表的受欢迎程度,并考虑客户活动,例如 屏幕截图视图、体验版和安装。我们每天对这些活动进行总体测量 在过去的 30 天里。您的列表中发生的客户活动越多,其参与度就越高。例客户访问 AppExchange 以查找文档生成应用程序。在执行 搜索时,他们访问了两个列表。第一个列表只有几个低分辨率的截图, 因此,客户没有互动就离开了。第二个列表具有高分辨率 屏幕截图、视频和免费试用版,客户与它们中的每一个进行交互。在这个 场景中,客户的行为有助于提高第二次上市的参与度 比第一个。

上市经验

商品信息体验会考虑商品信息中未包含在关键字中的其他方面 相关性和参与度因素。其中一些方面与您的 Salesforce 合作伙伴关系有关, 例如参与 Pledge 1% 计划。其他的则与客户的体验有关 您的解决方案,例如您的房源评论的数量和质量,或者您的解决方案何时 上次更新。例Salesforce 合作伙伴在 AppExchange 上列出了一个新的电话应用程序。提高认识和 安装后,合作伙伴将启动营销活动。然后,合作伙伴发送后续电子邮件 给安装了该应用程序的客户。该电子邮件感谢客户试用该应用程序并询问 他们分享他们对 AppExchange 的反馈。评论数量增长和上市 经验增加。

机器学习

机器学习使用 AI 来改善 AppExchange 上的搜索体验。像其他搜索一样 提供商,我们不会分享有关机器学习算法的详细信息。但信任和客户 成功是算法设计的核心。信任意味着算法不断 调整搜索结果以确保真实性。客户成功意味着算法使 推断客户的搜索意图,并优先考虑最有可能的结果 推动积极成果。例客户访问 AppExchange 并搜索名为 Appy’s Maps 的解决方案。在 搜索结果中,一个竞争解决方案与 Appy 的地图一起出现。此时将显示此解决方案 因为一些搜索 Appy 地图的人最终安装了竞争解决方案。这 机器学习算法认为这一结果是积极的,并将竞争者联系起来 使用 Appy 的地图解决方案。

如何使客户在搜索 AppExchange 时轻松找到我的列表?

以下是一些提示,可帮助您的列表在 AppExchange 搜索结果中脱颖而出。

因素技巧
关键字相关性确定您的产品可以解决的业务问题,然后为您的产品/服务选择关键字 清单。当您将关键字合并到您的列表中时,请关注标题、标语和 简要说明。避免关键字堆砌。如果你的房源里有太多或不相关的关键词, 客户很难理解它提供的价值。另外,它是负面的 影响机器学习算法。使用市场分析查看推动列表活动的关键字 可视 化。这些可视化效果可帮助您确定关联的关键字 具有最多的磁贴、视频和演示视图。定期衡量参与度 查看您的分析并改进您的产品。
婚约确保您的列表包含屏幕截图、图形图块、视频和演示。 当客户与您的媒体互动时,参与度会增强,因此请关注质量,而不是 数量。吸引您的客户滚动浏览描述您的解决方案的屏幕截图 好处。添加号召性用语或视觉辅助工具,引导客户观看您的演示 视频。使用您的视频来宣传您的解决方案。使用演示视频深入了解解决方案的功能。
上市经验监视解决方案收到的反馈。用 谢谢,并用有用的提示和解决方案回应负面反馈。AppExchange的 不编辑已发布的评论,但您的客户可以根据他们的正面评价进行编辑 与您的互动。让您的房源保持新鲜。当您上传新包并发布新版本时, 查看您的房源内容。请务必描述您当前的功能并使用 最适合的关键字。及时了解 Salesforce 版本。检查您的解决方案是否适用于我们的 最新技术,并相应地更新您的列表。

保持强大的搜索地位是一场马拉松,而不是短跑。所有搜索因素都有效 一起,并且可以随着时间的推移而改变。定期查看房源的关键字、内容和 分析,以便它们为机器学习做出贡献。对那些因素进行更新 控制。

电子邮件通知

安装通知电子邮件

Salesforce 在 30 天后向您的订阅者发送电子邮件 他们安装你的应用或组件。这封电子邮件感谢订阅者和 鼓励他们通过写一个 回顾。我们仅在以下情况下发送电子邮件:

  • 订阅者具有有效的电子邮件地址。
  • 订阅者尚未收到通知。
  • 订阅者尚未发表评论。

查看通知电子邮件

当订阅者对您的列表发表评论和评论时,Salesforce 向可能感兴趣的各方发送电子邮件。通知 订阅者收到的内容取决于他们在对话中的角色 (提供者、作者或评论者)。

电子邮件通知的类型发送到
房源新评价您,提供者每当有人发布对您的列表的评论时发送。
对您的评论发表新评论综述作者仅当审稿作者以外的其他人发表评论时才发送 在评论中,以及作者是否选择接收电子邮件通知 在他们的个人资料上。如果作者回复通知,则回复 作为评论的新评论发布。
还评论了评论对评论发表评论的人发送给对评论发表评论的人,不是评论作者或评论作者 此评论,并已选择接收电子邮件 在他们的个人资料上通知。最多一个 电子邮件通知将发送给每个评论者 每个新评论。如果此人回复 通知,回复将作为新的发布 对评论发表评论。
关于房源审核的新评论您,提供者每当有人对您的房源评价发表新评论时发送。

收集 AppExchange 潜在客户

您可以配置 AppExchange 列表以收集潜在客户并将其交付给 Salesforce组织。特定的客户互动,例如观看列表的演示视频, 可以触发潜在客户收集。

  • AppExchange 潜在顾客 当您为 AppExchange 列表启用潜在顾客收集并且客户与该列表交互时,AppExchange 会记录潜在顾客
    。如果您在 Salesforce 组织中启用了 Web-to-Lead,则 AppExchange 还可以将潜在客户交付给该组织。某些 Web-to-Lead 设置可能会阻止将潜在客户传递到您的组织。
  • AppExchange 潜在顾客和许可活动
    当您为 AppExchange 列表启用潜在顾客收集并且客户与您的列表进行交互时,AppExchange 会记录潜在顾客。许可证记录是在客户安装解决方案时生成的。
  • 启用 AppExchange 潜在客户收集
    在客户与您的 AppExchange 列表交互时收集潜在客户。
  • AppExchange 潜在顾客源代码 潜在顾客源代码
    提供有关潜在顾客创建方式的信息,并可以帮助您确定如何继续。
  • 对 AppExchange 潜在顾客进行故障排除 您为 AppExchange 列表启用了潜在顾客
    收集。但是,组织中的潜在顾客计数与预期不同。了解潜在客户路由规则、reCaptcha 验证和其他设置如何确定 AppExchange 将哪些潜在客户发送到您的 Salesforce 组织。

AppExchange 潜在客户

当您为 AppExchange 列表启用潜在客户收集并且客户进行交互时 通过列表,AppExchange 会记录潜在顾客。如果您在 Salesforce 组织中启用了 Web-to-Lead, AppExchange 还可以将潜在客户传送给该组织。某些 Web-to-Lead 设置可能会阻止潜在客户 从交付到您的组织。当客户出现以下情况时,您可以收集潜在客户:

  • 安装解决方案
  • 试驾
  • 观看演示或视频
  • 注册免费试用
  • 点击次数 了解更多

在为商品启用潜在客户收集之前:

  • 在要接收潜在顾客的组织中配置 Web-to-Lead。
  • 在组织的 Web-to-Lead 设置中禁用 Require reCaptcha 验证。如果 reCaptcha 是 启用后,不会向组织发送任何 AppExchange 潜在客户。

按列表设置潜在客户收集。对于每个列表,启用客户 触发潜在客户收集的互动。对于每次交互,还要完成任何必需的操作 设置。例如,要在客户观看您的演示时收集潜在客户,您必须将演示视频添加到 您的房源。当客户与您的列表互动并为此启用潜在客户收集时 交互时,系统会提示他们填写 AppExchange 潜在客户注册表单。从以下位置收集的信息 该表单与客户活动数据相结合,作为潜在顾客共享。

注意

您无法修改 要求客户填写的潜在客户表单。要分享改进潜在客户表单的想法,请转到 到 IdeaExchange。

无论您的列表的潜在客户收集设置如何,客户仍然可以查看您的演示,并采取 体验版,单击以了解详细信息,然后安装解决方案。

AppExchange 潜在客户和许可活动

当您为 AppExchange 启用潜在客户收集时 列表和 客户与您的列表交互时,AppExchange 会记录潜在客户。生成许可证记录 当客户安装你的解决方案时。

当客户对 这 列出其中 你 选择 产生潜在客户。当客户出现以下情况时,可以生成潜在客户:

  • 安装解决方案
  • 试驾
  • 观看演示或视频
  • 注册免费试用
  • 点击次数 了解更多

相比之下,只有在客户安装解决方案时才会生成许可证记录。自 接收许可证时,还必须在合作伙伴业务组织。

启用 AppExchange 潜在顾客收集

当客户与您的 AppExchange 列表交互时收集潜在客户。在启用潜在客户收集之前,请验证接收潜在客户的 Salesforce 组织是否已准备就绪。

  • 您必须在标准 Salesforce 组织(而不是 Developer Edition 组织)中接收潜在客户。
  • 您接收潜在客户的组织必须启用 Web-to-Lead。
  • 必须在 Web-to-Lead 设置中禁用“需要 reCaptcha 验证”。
所需的用户权限
要编辑 AppExchange 列表,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”选项卡以启动合作伙伴控制台 网站。
  3. 在“列表”选项卡上,单击列表磁贴。
  4. 点击拓展您的业务
  5. 指定要接收潜在客户的 Salesforce 组织。我们建议使用 合作伙伴业务组织,以便您可以从一个方便的单一管理潜在客户和许可证 位置。
  6. 为一个或多个活动启用潜在客户收集,并完成任何所需的设置。
  7. 保存更改。

AppExchange 潜在客户源代码

潜在顾客源代码提供有关潜在顾客创建方式的信息,并可为您提供帮助 确定如何继续。

AppExchange 潜在顾客源代码始终使用以下格式:或 . 标识用户执行的操作 执行以生成潜在客户。SFDC-XX|Listing NameSFDC-dup-XX|Listing NameXX

下表列出了 AppExchange 操作及其含义。

行动描述
IN用户在您的列表中单击了立即获取,并启动了 解决方案的安装过程。此操作包括同意条款和 条件,然后单击确认页面上的安装按钮。注意有时用户 不要完成安装,否则稍后会卸载你的解决方案。跟踪包裹 安装时,请使用许可证管理应用程序 (LMA)。
DM用户点击了您列表中的“查看演示”,并观看了一些或 您的所有演示视频。
LM用户点击了列表上的“了解更多”。注意清单 以前有“了解更多”按钮,现在有“立即获取”按钮并接收潜在客户来源 带有 IN 操作的代码。
TS用户在您的列表中点击了立即获取,并启动了 Salesforce 和您的解决方案的 30 天免费试用版。这些用户可以是现有的 Salesforce 客户。
TD用户点击了列表上的“体验版”,并尝试了你的 测试组织中的解决方案。

封装安装引线

软件包安装是触发潜在客户创建的用户活动的一个示例。然而 AppExchange 并不是安装线索的唯一来源。许可证管理应用程序 (LMA) 也 创建安装引线。让我们看一个例子。用户购买了你的解决方案,并且 通过安装 URL 进行安装。AppExchange 不知道用户的活动,因此它 不会创建潜在客户。但是,安装会触发 LMA 以创建潜在顾客。要知道 哪个应用程序创建了潜在客户,请检查潜在客户源代码。

注意

LMA 的源代码 引线是 。Package Installation

让我们调整一下我们的示例,看看如何为同一个安装线索创建多个安装线索 包。首先,用户单击“立即获取”,然后启动但未完成 安装。AppExchange 使用源代码创建潜在客户。稍后,同一用户购买您的解决方案并安装 它通过安装 URL。LMA 使用源代码创建第二个潜在客户。同一用户。相同的包装。从表面上看, 潜在客户似乎是重复的,但潜在客户源代码显示它们不是。SFDC-IN|Simple Sample AppPackage Installation

在潜在客户和许可证记录中了解有关 LMA 潜在客户的更多信息,请参阅 LMA。

重复的潜在客户

重复潜在顾客是 AppExchange 已为此用户向您的组织发送的潜在顾客,其中列出了 或在过去 180 天内采取的行动。

重复的潜在客户源代码始终包含字符串并使用格式 .例如,表示用户在 简单的示例应用列表。-dup-SFDC-dup-XX|Listing NameSFDC-dup-DM|Simple Sample App

排查 AppExchange 潜在客户问题

您为 AppExchange 列表启用了潜在客户收集。但是,潜在客户计数 您的组织与您预期的不同。了解潜在客户路由规则、reCaptcha 验证和 其他设置决定了 AppExchange 将哪些潜在客户发送到您的 Salesforce 组织。

自定义潜在客户路由规则

通常,您可以设置自定义潜在顾客路由规则,以防止重复或不需要的销售线索 联系您的销售团队。

例如,贵公司的一名员工正在观看 AppExchange 列表的演示视频。什么时候 在提示输入联系信息时,他们输入公司电子邮件地址。AppExchange 会记录此内容 作为线索的互动。从销售的角度来看,这是一个不需要的线索。

要防止使用您公司电子邮件地址的用户的潜在客户传播到您的 Salesforce 组织,您可以创建自定义潜在客户路由规则。请参阅 Salesforce 中的潜在客户路由。

客户联系首选项

客户可以选择与 AppExchange 共享其联系信息,并允许来自 AppExchange 的联系 供应商。AppExchange 仅向允许提供商的客户向您的 Salesforce 组织发送潜在客户 联系。

Web-to-Lead reCaptcha (网络潜在客户 reCaptcha)

在 Salesforce 中接收 AppExchange 潜在客户 org,请在组织的 Web-to-Lead 设置中禁用 Require reCaptcha Verification (需要 reCaptcha 验证)。如果 reCaptcha 是 启用后,AppExchange 潜在客户不会发送到您的组织。

州/省/自治区/直辖市

AppExchange 将潜在客户发送给您的 组织通过 Web-to-Lead。用户通过完成 AppExchange 来提供潜在客户的联系信息 Web-to-Lead 表单。他们需要从选择列表中选择一个国家或地区。这 所选国家或地区将另存为文本值。例如,用户选择日本。这 saved value 是国家/地区的全称 Japan。AppExchange 潜在客户将发送到您的组织 国家/地区设置为日本。

在启用了州和国家/地区选择列表的组织中,您可以 可以选择使用预定义的标准州和国家/地区列表填充这些选择列表,这些列表可以 Salesforce 提供。您还可以编辑国家/地区名称和集成值,也称为 开发人员名称。

Web-to-Lead 表单使用来自状态和 国家/地区选择列表。要使 AppExchange 潜在顾客创建成功,集成值 组织中的国家/地区必须与 AppExchange Web-to-Lead 上捕获的值匹配 形式。在我们的示例中,它们必须都是日本。

更改国家/地区名称不会影响 AppExchange 潜在客户的创建,但更改 集成值确实如此。不要更改集成值。发送的国家或地区 AppExchange 潜在顾客必须与组织中的集成值匹配。如果没有匹配项,则创建潜在客户 失败。状态选择列表也会出现同样的问题。避免州和国家/地区 与选择列表相关的潜在客户失败,您有两种选择。使用标准选择列表集成 值,或将重复的州和国家/地区添加到您的选择列表中。

  • 使用标准选择列表集成值要实现此选项,请使用 组织中的 Salesforce 标准州和国家/地区选择列表,并将 按原样集成值。我们建议大多数合作伙伴使用此选项。使用此选项, AppExchange 潜在客户使用完整的州和国家/地区名称传播到您的组织。这 名称与标准选择列表中的集成值匹配。
  • 将重复的州和国家/地区添加到您的选择列表中实现这个 选项,如果您的组织中需要两个字母的州或国家/地区缩写。为 例如,您在用户界面中显示缩写,或使用它们与其他缩写集成 系统。将重复的州和国家/地区添加到您的选择列表中 不同的积分值。将一个值设置为两个字母的州或国家/地区 缩写。将 other 值设置为完整的州或国家/地区名称。仅使 可见的双字母缩写选择列表条目。使用此选项,AppExchange 将引领 使用与全名匹配的完整州和国家/地区名称传播到您的组织 组织中的集成值。您还可以将两个字母的积分值用作 需要。

更新 AppExchange 列表中的解决方案

如果您修改已发布的解决方案,请更新您的 AppExchange 列表,以便新的 客户可以访问最新版本。如果解决方案需要经过安全审查, 在提交版本之前,您可以将新版本链接到您的公开列表 安全审查。但是,在新版本发布之前,您无法发布更新的列表 通过。

注意

我们会定期对 AppExchange 上列出的解决方案进行重新审核。如果你的 解决方案正在接受安全审查并显示重大更改,我们会与您联系 安排对新版本的重新审查。

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。
  3. 点击列表
  4. 点击您要更新的房源。
  5. 单击“链接解决方案”。
  6. 找到要与 清单。
  7. 点击【商品状态】。
  8. 单击发布

AppExchange 常见问题

此列表包括有关在 AppExchange 上销售的常见问题。

  • 我可以添加更多行业吗?
  • 我是否需要 APO 才能在 AppExchange 上发布我的应用程序或组件?
  • 我可以更改我的公司名称吗?
  • 是否可以在 Salesforce 沙盒上创建解决方案并将其上传到 AppExchange?
  • 我可以编辑评论吗?
  • 我可以保留相同的列表但更改它提供的套餐吗?
  • 我是否可以使用新版本更新我的托管包,或者 补丁?
  • 买家如何找到我的房源?
  • 如何获取应用的 API 令牌?
  • 如何提高房源的受欢迎程度?
  • 如何查看 Salesforce 删除的列表?
  • 如何将客户升级到新版本?
  • 免费试用和试驾有什么区别?
  • 我在哪里可以分享我的想法?
  • 我在哪里可以写评论?
  • 我可以添加更多行业吗?
  • 我是否需要 APO 才能在 AppExchange 上发布我的应用程序或组件?
  • 我可以更改我的公司名称吗?
  • 我能否在 Salesforce 沙盒上创建解决方案并将其上传到 AppExchange?
  • 我可以编辑评论吗?
  • 我可以保留相同的列表但更改它提供的套餐吗?
  • 我可以使用新版本或补丁更新我的托管软件包吗?
  • 买家如何找到我的房源?
  • 如何获取应用的 API 令牌?
  • 如何提高房源的受欢迎程度?
  • 如何查看 Salesforce 删除的列表?
  • 如何将客户升级到新版本?
  • 免费试用和试驾有什么区别?
  • 我在哪里可以分享我的想法?
  • 我在哪里可以写评论?
  • 我可以为一个解决方案提供多个列表吗?

我可以添加更多行业吗?

不。为防止滥用,您只能为每个行业指定两个行业 清单。如果您涵盖更多行业,请完整提及或 房源的简要说明。

我是否需要 APO 才能在 AppExchange 上发布我的应用程序或组件?

不,您不再需要 AppExchange 发布组织 (APO),用于在 AppExchange 上发布您的应用程序或组件。您现在可以连接 将应用程序或组件直接开发到 AppExchange 发布控制台的组织。连接 组织,在合作伙伴社区中打开“发布”页面,然后单击“组织”选项卡。在连接组织之前,请确保 在合作伙伴社区中拥有“管理列表”权限。

我可以更改我的公司名称吗?

是的,您可以在合作伙伴控制台的“公司信息”页面上更改公司名称和公司简介的其他方面,例如徽标和联系信息。

是否可以在 Salesforce 沙盒上创建解决方案并将其上传到 AppExchange?

不。可以使用沙盒来安装和测试解决方案,但必须创建并上传它 使用 Developer Edition 组织。

我可以编辑评论吗?

您可以编辑自己创作的评价。您可以对评论发表评论 你没有写。

我可以保留相同的列表但更改它提供的套餐吗?

是的,您可以在 合作伙伴控制台。

首先,请确保将包含新包的组织连接到合作伙伴 安慰。而且,如果列表是公开的,则该软件包已通过 AppExchange 安全性 回顾。

接下来,转到合作伙伴控制台中的“列表”选项卡。编辑您要编辑的商品信息 更新。若要更改包,请转到“链接解决方案”页,然后选择新包 版本。

我是否可以使用新版本更新我的托管包,或者 补丁?

可以,但必须将包注册到许可证管理应用 (LMA)。

买家如何找到我的房源?

客户可以通过多种方式找到您的解决方案或咨询服务。在 AppExchange 上,他们 使用关键字搜索或使用类别浏览。他们还通过以下方式找到您的房源 外部搜索提供商,例如 Google。了解您的房源在每 这些方案有助于你获得潜在客户的最大可见性。关键字大多数时候,客户通过以下方式寻找解决方案和咨询服务 在 AppExchange 上搜索术语(也称为关键字)。AppExchange的 返回匹配结果,并根据关键字相关性对结果进行排序。这里是 关于其工作原理的一些提示。

  • 如果您在房源信息中的任意位置添加关键字,您的房源就会显示出来 在该关键字的搜索结果中。
  • 一般来说,如果一个关键词出现在前面,它的相关性就会增加 列表。
  • 一般来说,如果一个关键词出现的时间超过,它的相关性就会增加 一旦进入列表。多次列出一个关键字并不能改善 列表的排名。
  • 搜索两个或多个关键字时,仅搜索包含所有关键字的列表 以相同的顺序返回。此外,搜索多个 关键字也与驼峰大小写的单词匹配。例如,搜索“很棒” App 与 GreatApp 匹配。

人气当客户通过浏览类别寻找解决方案或咨询服务时, 类别中的列表根据过去 30 年的受欢迎程度进行排序 日。受欢迎程度取决于客户采取的行动,例如观看演示 视频,然后单击“了解更多”链接。表现出更大承诺的活动, 例如安装解决方案,比显示的活动更重要 减少承诺,例如点击屏幕截图。评论数量和 房源的平均评分对受欢迎程度没有贡献。排序客户还可以按评级、Salesforce 版本、价格等对结果进行排序 属性。按评分排名的搜索结果首先按数量排序 星级,然后是评论数量。例如,包含一条评论的商品信息 五星排名在有 20 条四星评论的房源之上。搜索引擎由于 AppExchange 是一个公共网站,因此搜索引擎会将您的列表页面编入索引 并在搜索结果中返回它们。提高您在外部的排名 搜索提供商,请确保您在 网站、博客、Facebook 和 Twitter 页面。

如何获取应用的 API 令牌?

您可以在应用程序通过 AppExchange 安全审核后为其请求 API 令牌。自 请求令牌,在 Salesforce 中记录支持案例 合作伙伴社区。对于产品,请指定合作伙伴计划和 好处。对于主题,请指定 ISV 技术请求

注意

此功能适用于符合条件的合作伙伴。有关合作伙伴计划的更多信息, 包括资格要求、访问 www.salesforce.com/partners。

如何提高房源的受欢迎程度?

受欢迎程度基于客户活动。AppExchange 衡量一切 用户在您的列表上执行的操作:安装、了解更多信息、试驾、演示、查看屏幕截图、白色 论文或数据表等。AppExchange 对活动进行权衡 根据其作为兴趣指示的重要性级别,并过滤掉尝试 滥用系统。

AppExchange 重新计算受欢迎程度 每天,然后总结和评估 30 天内的结果。当您按类别浏览时, 您会看到按过去 30 天内的相对受欢迎程度排序的列表。

买家对房源的评论或评分不会影响房源的受欢迎程度。AppExchange 访客可以按以下方式排序 如果他们感兴趣,请进行评分。以下是一些关于提高排名的提示。

  • 包括体验版。人们喜欢能够试用应用程序或组件。测试次数 驱动器影响受欢迎程度。您还可以获得能够收集的额外好处 导致。
  • 添加图像。访问者做的第一件事就是单击“查看” 屏幕截图按钮。许多人甚至不看房源 没有屏幕截图。
  • 添加资源,展示你的应用或组件如何影响客户的底线。为 例如,如果您有研究表明某个组件有助于支持代表 更快地解决案例,将该信息包含在数据表中。
  • 提前确定您的定价。如果您不在房源中包含定价,人们就会成为 很快不感兴趣。

如何查看 Salesforce 删除的列表?

在 AppExchange 上,您无法查看 Salesforce 删除的列表。但合作伙伴控制台显示 私人列表,其中可能包括 Salesforce 删除的列表,通常是因为问题 在定期安全审查期间发现。在合作伙伴中查看您的私人列表 控制台,导航到“列表”选项卡。使用“未发布”筛选器显示您的所有私有 清单。

如何将客户升级到新版本?

创建托管包的新版本,并以已发布状态上传它。在你之后 上传时,您可以与现有客户共享安装 URL,以便他们能够 升级。如果仅向客户部署 bug 修复程序,并且想要升级它们 自动,请参阅计划推送升级。你 可以使用许可证管理应用程序 (LMA) 来查找哪些客户尚未升级。

客户还可以通过登录 AppExchange 和 查看“我的安装和订阅”页面。如果解决方案的新版本是 可用,它将显示在此页面上。

免费试用和试驾有什么区别?

免费试用版是一个非生产 Salesforce 组织,其中包括您的解决方案包和 示例数据。如果客户选择购买解决方案而不是让试用期到期, 组织成为生产版本。我们建议您编写数据清理脚本,然后 在解决方案中包含一个按钮,使客户可以选择删除示例数据。

还可以选择提供体验版,这是解决方案的只读版本,具有 所有参加试驾的客户都登录。与免费试用版一样,体验版使用开发人员 对包含示例数据和您选择的任何配置选项的组织进行编辑。

我在哪里可以分享我的想法?

您可以在以下位置分享有关如何改进 AppExchange 或 Salesforce 合作伙伴计划的想法: 合作伙伴社区的“协作”部分。这些想法只是 Salesforce 和其他合作伙伴看到。要更公开地分享想法,请将它们发布在IdeaExchange上。

我在哪里可以写评论?

在列表页面上,点击评论数量或撰写第一条评论。如果已经有评论,你是 定向到评论页面,您可以在其中单击“编写” 审查。每个用户每个列表只能写一条评论。

重要

您不能为自己的房源撰写评论。 请查看 AppExchange 使用条款,了解其他法律信息。

我可以为一个解决方案提供多个列表吗?

是的,您可以将一个解决方案链接到多个列表。但是,这样做可能会影响您的列表的 在AppExchange上排名。Salesforce 用于对解决方案进行排名的指标,例如页面 浏览量,在多个列表中被稀释。

完成安全审查周期

分发托管包、Salesforce Platform API 解决方案或 Marketing Cloud AppExchange 上的 API 解决方案,它必须通过我们的安全审查。使用安全审查向导 Salesforce 合作伙伴控制台来管理您的评论。提交解决方案进行初步审核。 重新提交您修改的解决方案,以更正在上一次评审中检测到的安全问题。支付 安全审查费用。

观看视频,了解如何在 AppExchange 合作伙伴控制台。

https://play.vidyard.com/a7RXveuCz7KcD7caKmTU3f

  • 提交安全审核所需的材料
    了解在提交解决方案以进行 AppExchange 安全审核时必须提供的材料,例如测试环境和文档。移动应用具有特定于平台的提交要求。扩展包经过安全审查,Salesforce 需要与独立解决方案相同的材料。
  • AppExchange 安全审查向导 安全审查向导
    是您和其他 ISV 合作伙伴用来提交托管软件包、Salesforce API 解决方案和 Marketing Cloud API 解决方案以进行安全审查的工具。提交后,使用向导跟踪审核进度,并从审核团队获取反馈并与之沟通。该向导是 AppExchange 合作伙伴控制台的一项功能。
  • 管理您的安全审核
    在 AppExchange 合作伙伴控制台的安全审核向导中管理您的安全审核。创建并提交解决方案以供审核。检查向导中传递的详细状态信息。直接与处理审核的团队沟通。下载您的评论报告。提交误报文档。
  • 根据安全评审结果
    采取行动 在提交解决方案进行初步评审后大约 4-6 周,安全评审即告完成。检查 AppExchange 合作伙伴控制台,查看您的解决方案是否通过。了解如何公开列出已通过的解决方案,以及如何请求对未通过的解决方案进行后续评审。
  • 对 AppExchange 进行定期安全重新审查 为了帮助防范最新的漏洞,我们会定期对 AppExchange
    解决方案进行安全重新审查。这些审查的范围与初始安全审查类似,包括自动和手动测试。您可以自愿请求重新审核您的解决方案,或者在某些情况下,我们会通知您您的解决方案需要重新审核。在这两种情况下,都需要支付安全审查费用。

安全审查提交所需材料

了解必须提供的材料,例如测试环境和 文档,在提交解决方案以进行 AppExchange 安全审查时。移动应用程序有 特定于平台的提交要求。扩展包经过安全审查和 Salesforce 需要与独立解决方案相同的材料。

在安全审核期间,产品安全会测试您的必需部分和可选部分 溶液。为了确定测试范围,我们通常使用跟踪数据的方法。无论在哪里 客户去,我们去。例如,要使用您的解决方案,您的 Salesforce 客户需要 帐户,或者数据已同步到第三方服务器。我们的审查团队 测试这些部分,以确保它们安全地传输 Salesforce 凭据和 数据。提供对解决方案使用的所有环境、包和外部组件的访问,包括:

  • 外部 Web 应用程序或服务。
  • 必需或可选的客户端或移动应用程序。
  • 解决方案中包含的所有 Apex 和 Visualforce。

注意

请确保提交的是托管 – 已发布的包。我们不能接受 非托管或 beta 包。

如果不确定是否要包含解决方案的一部分,请将其包含在内。综述 团队不会测试超出范围的部件,但省略必需部件会延迟 回顾。

我们希望看到您进行了尽职调查,以确保您的解决方案符合企业要求 安全标准。包括安全扫描报告以及任何误报的解释 出现在您的测试结果中。

我们还要求提供详细的解决方案用户文档和贵公司的信息安全 政策。我们理解,对于较小的或 较新的公司,因此我们在审查提交时会考虑公司规模和成熟度 文件。

要生成针对您的解决方案自定义的清单,请使用 Salesforce 合作伙伴社区中的安全审查提交要求清单生成器。以下是 Lightning 组件的清单。

下表总结了根据体系结构范围提交的内容。

提交材料Salesforce 原生解决方案带有 Lightning 组件的 Salesforce 原生解决方案具有外部 Web 应用或服务的解决方案使用移动客户端的解决方案仅限 APIMarketing Cloud 应用程序
Salesforce Developer Edition 组织XXXXX
在 Developer Edition 组织中安装了托管软件包XXXX
需要身份验证的外部组件的 URL 和登录凭据XXX
Checkmarx报告XXXX
Zap 或 Chimera 扫描报告XXXX
误报文档(如果适用)XXXXXX
解决方案文档XXXXXX
带有安装链接或文件的平台X
Marketing Cloud 环境的凭据X

移动应用

对于移动应用测试,请为计划分发的所有平台预配应用 上。对于 iOS,我们接受测试外部测试版或临时部署。对于其他平台,我们接受 应用程序在文件中,例如 Android 打包 (.apk) 文件。

扩展包

扩展包是作为解决方案的加载项或集成 两种解决方案的功能。在可以公开列出扩展包之前 AppExchange、它及其扩展的解决方案必须通过安全审查。

如果扩展包是具有以下基本解决方案的附加组件或与以下基本解决方案集成 通过安全评审,仅提交扩展包进行评审。但是,如果 基础解决方案尚未通过安全审查,请提交扩展包以及 未经审查的解决方案。

扩展包的安全评审提交要求与扩展包的安全评审提交要求相同 具有类似体系结构的解决方案。例如,如果你有一个扩展包 外部标注,为带有标注的包附加单独的 Web 扫描结果。

产品安全团队会从整体上审查解决方案。在 您与安全审查一起提交的 Development Edition 组织。包括扩展 包。此外,为您的包安装解决方案的所有基本包和依赖包 扩展或集成。这是必需的,无论基本解决方案是否已经通过了 安全审查与否。

Salesforce 安全团队必须审查每个扩展包,这一点很重要。即使很小 软件包可能会引入安全漏洞。

AppExchange 安全检查向导

安全评审向导是你和其他 ISV 合作伙伴用来提交的工具 您的托管软件包、Salesforce API 解决方案和 Marketing Cloud API 解决方案的安全性 回顾。提交后,使用向导跟踪审核进度并获取反馈 来自从事您的评论的团队并与之沟通。该向导是 AppExchange 合作伙伴控制台。

  • AppExchange 安全审查阶段 AppExchange 安全审查过程分为四个阶段
    。作为合作伙伴,了解这些阶段是什么,每个阶段会发生什么,并知道您的评论处于哪个阶段,这一点很重要。
  • 向导中的 AppExchange 安全审核反馈
    随着安全审核的进行,审核团队会定期提出问题和更新。当他们有内容要与你共享时,团队会将详细反馈发布到安全评审向导中的“概述”页。反馈的类型取决于评审的阶段:提交验证、测试等。每当您的审核状态发生更改时,我们还会向您的安全审核联系人发送一封电子邮件,告知您“概述”页面上提供了新信息。

AppExchange 安全审查阶段

AppExchange 安全审查分为四个阶段。作为合作伙伴,这很重要 让您了解这些阶段是什么,每个阶段会发生什么,并知道哪个阶段 您的评论已进入。

当您启动安全审查向导时,AppExchange 安全审查正式开始。 用于提交解决方案以进行安全审查并开始输入信息的工具。它结束了 当审核团队完成测试并与您共享结果时。这两者之间发生了很多事情。 安全评审分为四个阶段。准备和提交在此阶段,您将使用安全检查向导输入所有必需的信息,然后 提交解决方案以供审核。提交验证我们收到了您的提交。安全审查运营团队正在评估以下所有内容 您包含在提交的内容中。如果提交的内容包含所有必需的信息,我们将 可以开始测试,如果没有,有关缺少的内容的反馈将发布到向导的“概述”中 页。测试产品安全正在测试您的解决方案。做审查已经完成。详细信息将发布到向导的“概述”页。

要查看您的评论处于哪个阶段,请查看安全性中“概述”页面上的跟踪器 审阅向导。指标中的每个磁贴都代表 AppExchange 中的四个阶段之一 安全审查。

这些图块是用颜色编码的,让你了解每个阶段的进度。

  • 看到绿色背景和复选标记图标复选标记图标是一个绿色圆圈,上面有一个白色复选标记。?舞台是 完成。
  • 带有信息符号信息符号是一个蓝色圆圈,上面有一个白色字母 i。的蓝色背景表示它是当前阶段。
  • 橙色背景和警告图标警告图标是一个橙色圆圈,上面有一个反向箭头。表示在阶段中发生了问题。
  • 红色背景和错误图标错误图标是一个白色圆圈,红色背景上有一条白线穿过它。表示发生故障。
  • 灰色磁贴表示舞台尚未开始。

下表汇总了在每个阶段执行的任务,以及谁负责 完成它们,以及它们可能的结果。

阶段子阶段这意味着什么
准备和提交完成所有步骤,然后提交解决方案以供审核。这是提交评论之前的默认阶段。在此阶段,您将提供所有 测试解决方案的安全状况所需的信息。你不会 在提交评价之前,一直处于评价状态。
我们收到了您的提交提交解决方案以供审核。安全审查操作已收到请求 但尚未开始处理它。我们将审核状态设置为“已提交”。没有操作是 需要你。
提交验证我们正在检查您提交的内容是否包含所有必需的材料。安全审查操作正在评估包含在 提交。他们的目标是确保他们拥有开始测试所需的一切 解决方案的安全性。审核状态为“已提交”。无需执行任何操作 你。
您的提交已准备好进行测试。我们拥有测试您的解决方案所需的所有材料。我们通知了产品 解决方案已准备好进行测试的安全团队。产品安全启动时 测试,您的评论将进入下一阶段,测试。审核状态为“已提交”。您无需执行任何操作。
我们退回了您的提交。查看反馈,更新提交内容,以及 提交。安全评审操作团队退回了你的提交,因为它丢失了 测试所需的内容,例如有效的测试环境凭据或外部 组件。处理将暂停,直到我们收到未完成的项目。我们将评审状态设置为“已退回”,并将反馈发布到安全评审向导的 “概述”页。处理反馈并重新提交相同的评论。不收取任何费用 重新提交退回的提交。
测试我们正在测试解决方案的安全性。产品安全部门开始对解决方案进行技术测试。审核状态 已提交。您无需执行任何操作。
我们退回了您的提交。查看反馈,更新提交内容,以及 提交。在测试期间,产品安全团队发现您的提交存在以下问题: 阻止他们全面测试您的解决方案。产品安全团队返回 您的提交和设置的审核状态设置为“已返回”。你的 评审返回显示在安全评审向导的“概述”页上。解决 反馈并重新提交相同的评论。重新提交退回的邮件不收取任何费用 提交。
您的解决方案未通过。产品安全部门完成测试,发现安全漏洞。您的解决方案 没有通过。审核状态设置为“失败”。转到 Overview 页面的 安全向导,下载安全审查报告,并查看结果。解决 通过修正代码和/或记录误报来解决问题。如果必须修正代码,则必须创建新的 API 解决方案或托管包版本,并且 开始新的评论。重新测试修正的解决方案需要付费。如果必须报告误报,但不必修正代码,可以添加 误报文档到失败的审核并重新提交。拥有我们不收取任何费用 评估误报。
您的安全审查已完成。产品安全团队完成了对解决方案安全性的测试,没有发现任何安全问题。审核状态为“已提交”。您无需执行任何操作。你 审核会自动前进到下一阶段,即完成。
祝贺!您的解决方案通过了。审核状态设置为“已通过”。你离列出你的解决方案又近了一步 AppExchange。
过期您的安全审核已过期。过期是非官方的第五阶段和审查状态。它适用于解决方案 在通过审核后,不再符合在 AppExchange 上分发的标准。一个 安全审查可能因各种原因而过期,例如未支付的收入分成。综述 status 设置为 Expired。如果过期的评审是针对链接到公开列表的解决方案,我们会删除该列表 从 AppExchange,但您可以重新列出。与您的客户经理合作,了解为什么您的 评论已过期。解决所有问题,然后重新发布。

向导中的 AppExchange 安全审查反馈

随着安全评审的进行,评审团队会定期提出问题和 更新。当他们有东西要与你分享时,团队会向 安全检查向导中的“概述”页。反馈的类型取决于你的阶段 审核:提交验证、测试等。每当您的状态发生变化时 审查,我们还会向您的安全审查联系人发送电子邮件,让您知道新的 有关信息,请参阅“概述”页面。

  • 关于提交验证的反馈 在提交验证
    阶段,我们会检查您的安全评审提交是否包含开始技术测试所需的一切。此阶段的反馈分为三类。
  • 技术测试期间的反馈 在我们验证你的提交包含评估解决方案安全性所需的所有内容后,产品安全团队将开始技术测试
  • 关于已完成审核
    的反馈 有两种可能的 AppExchange 安全审核结果。要么你的解决方案通过,要么没有通过。无论哪种情况,反馈部分都包含下一步操作的提示。

关于提交验证的反馈

在提交验证阶段,我们会检查您的安全评审提交 包括开始技术测试所需的一切。此阶段的反馈分为 三大类。

  • 凭据和测试环境:以下组织或测试环境存在问题 您的提交,例如过期的身份验证凭据或 Web 的无效访问 URL 应用或服务。检查在安全性的“提供环境”步骤中输入的信息 审阅向导。根据需要进行更新。
  • 文档:缺少必需的文档,例如误报文档 从您提交的内容中。要修改您包含的内容,请转到 安全审查向导。
  • 组织和包:你的组织或包有些不太对劲 提交。也许您提交了打包组织而不是测试组织,或者测试组织包含 与提交的包版本不同的包版本。查看反馈并解决所有问题 行动项目。

当审核团队发布验证反馈时,您可以选择如何继续。在大多数 案例中,您必须更新提交的内容,然后重新提交以供审核。在其他时候,最好的路径 前进不清楚。选中接下来会发生什么?(1) 和 Opportunity (2) 部分 以获得指导。如果您不同意任何验证反馈,请申请再次查看 (3).

技术测试期间的反馈

在我们验证您的提交包含评估 解决方案的安全性,产品安全团队将开始技术测试。

在技术测试阶段,通常不会在“概述”页上看到太多活动。 测试完成后,结果将发布到“概述”页。我们还发送电子邮件至:

  • AppExchange 合作伙伴控制台的公司信息中列出的安全审查联系人 页。
  • 安全检查中“添加联系人”页面上列出的主要联系人和备用联系人 巫师。

关于您完成评价的反馈

有两种可能的 AppExchange 安全审查结果。您的解决方案通过 或者它没有。无论哪种情况,反馈部分都包含下一步操作的提示。

如果您的解决方案通过,恭喜您!您离公开列出您的 AppExchange 上的解决方案。如果您的解决方案没有通过,则意味着产品安全团队 在解决方案中检测到安全问题。您无法在 AppExchange 上列出解决方案,或者 将其分发给客户。转到“概述”页面并下载您的评价报告。它列出了 我们检测到的安全问题和漏洞的类型,但不是每个实例。

如果您同意报告中的某个问题是有效的漏洞,请修正您的解决方案。如果 您认为问题不会造成安全风险,请将其记录为误报。

解决每个问题,然后:

  • 如果修正了解决方案,并且没有误报,请从 “解决方案”页。输入所有必需的信息后,请申请后续审核。对于 API 解决方案类型,则必须创建另一个解决方案以供后续评审。需要付费 重新测试修正的解决方案。
  • 如果修正了解决方案,并且存在误报,请从 “解决方案”页。输入所有必需的信息并上传误报报告。然后 请求后续审查。对于 API 解决方案类型,必须为 后续审查。重新测试修正的解决方案需要付费
  • 如果仅记录了误报,请转到安全评审中的“概述”页 向导,上传误报报告,然后重新提交相同的评论。我们不收取任何费用 评估误报报告。

如果您有其他问题或疑虑,请预约技术办公时间,以便 产品安全团队可以与您一起重新提交。

管理您的安全审查

在 AppExchange 合作伙伴控制台的安全审核中管理您的安全审核 巫师。创建并提交解决方案以供审核。检查详细的状态信息 在向导中交付。直接与处理审核的团队沟通。下载 您的评论报告。提交误报文档。

  • 启动 AppExchange 安全审查 要启动安全审查,请从 AppExchange 合作伙伴控制台的“解决方案”页面启动安全审查
    向导。您可以输入部分信息,然后保存并稍后完成。
  • 在提交
    之前编辑 AppExchange 安全审核 您已开始为解决方案提交安全审核,并且在提交之前需要提供更多信息。返回到安全检查向导并继续输入信息。
  • 提交您的解决方案以供 AppExchange 安全审核 在 AppExchange 合作伙伴控制台中提交您的解决方案以供安全审核
    。共享您的解决方案和所有必需的材料,并支付相应的费用。
  • 更新退回的 AppExchange 安全审核 您提交了解决方案以进行安全审核
    。然后,审核团队将其退回给您,因为他们需要测试的内容缺失或不正确。您的评论状态为“已返回”。返回安全审查向导,修复问题,然后重新提交。
  • 检查 AppExchange 安全审核的状态 在 AppExchange 合作伙伴控制台中查找安全审核
    的状态。提交解决方案以供审阅后,将显示状态更新。
  • 请我们再看一遍我们的提交验证反馈
    当您提交解决方案进行安全评审时,评审的提交验证阶段将开始。在此阶段,审核团队会评估您在提交中包含的所有内容。如果有任何缺失或不正确的内容,他们会将反馈发布到安全评审向导中的“概述”页,并将提交返回给你。如果您不同意任何验证反馈,请让我们再看一遍。我们无需再查看我们的验证反馈。
  • 下载 AppExchange 安全审查报告
    当解决方案未通过 AppExchange 安全审查时,解决方案中发现的漏洞将记录在审查报告中。若要下载报告,请转到安全检查向导中的“概述”页。
  • 重新提交退回的安全审核,其中所有问题均为误报
    在提交验证阶段,如果扫描结果指示未通过误报文档解决的安全问题,则审核状态将设置为“已退回”。您的审核将暂停,直到我们收到文档。转到安全评审向导中的“概述”页,上传误报报告,然后重新提交解决方案。我们评估误报文档不收取任何费用。
  • 重新提交所有问题均为误报的失败安全审核
    如果您收到 AppExchange 安全审核的结果,并且确定我们发现的所有问题都是误报,请将误报文档添加到未通过的审核中,然后重新提交。我们评估误报文档不收取任何费用。
  • 过期的 AppExchange 安全审查 当审查后的解决方案不再符合在 AppExchange 上分发的条件时,安全审查
    将过期。如果过期的审核是针对链接到公开列表的解决方案,我们会从 AppExchange 中删除该列表,但您可以重新列出。
  • 过期的安全审查
    进行故障排除 AppExchange 安全审查过期的最常见原因是错过重新审查、逾期审查费用和未支付的收入分成。了解如何排查评价过期的原因。

启动 AppExchange 安全审查

若要启动安全评审,请从“解决方案”页启动安全评审向导 在 AppExchange 合作伙伴控制台中。您可以输入部分信息,然后保存并完成 后。在开始审核之前,请连接您的解决方案或包含以下内容的 Salesforce 组织 您的解决方案到合作伙伴控制台。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 单击解决方案名称。
  4. 单击“开始审核”。安全审查向导将启动,您可以开始进入 必填信息。
  5. 如果您想保存更改并稍后提交,请点击保存并提交 退出

在提交之前编辑 AppExchange 安全审核

你已开始为解决方案提交安全评审,并拥有详细信息 在您提交之前提供。返回安全检查向导并继续输入 信息。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 单击解决方案的名称。
  4. 点击编辑评价。安全检查向导将启动,您可以编辑 回顾。

提交您的解决方案以供 AppExchange 安全审查

在 AppExchange 合作伙伴控制台中提交您的解决方案以供安全审查。共享 您的解决方案和所有必需的材料,并支付相应的费用。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源

在提交解决方案进行安全评审之前:

  • 让合作伙伴招聘代表确认你已注册 AppExchange 合作伙伴计划,并且您有分销协议。
  • 如果解决方案包含包,请连接相关的开发人员中心或包 org 添加到合作伙伴控制台。
  • 配置安装了解决方案的 Developer Edition 测试环境。我们 使用环境来测试解决方案。

提示

提交解决方案后安排技术办公时间预约 回顾。访问合作伙伴安全门户,然后 选择 3-4 周后的日期。如果你的解决方案没有通过,你已经有一个 预约已预约。

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 若要显示解决方案的所有版本,请单击解决方案名称。
  4. 单击“开始审核”。
  5. 提供所需的详细信息,支付审核费,并提交您的 请求。

在提交的“概述”页上跟踪审核进度 (1)。我们 通知您任何状态更新、操作项或来自我们安全团队的反馈。 在我们验证您提交的内容后,审核过程最多需要 4 周时间。

更新退回的 AppExchange 安全审核

您已提交解决方案以供安全审查。然后审查小组将其退回给 你,因为他们需要测试的东西丢失或不正确。您的状态 review 为 Returned。返回到安全审查向导,修复问题,然后 提交。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 要启动 AppExchange 合作伙伴控制台,请单击发布
  3. Click Technologies |解决方案
  4. 单击解决方案的名称。
  5. 若要启动安全检查向导,请单击“检查” 状态
  6. 单击“概述”。
  7. 查看反馈。
  8. 解决所有问题。
  9. 单击“查看并提交”。
  10. 点击提交

检查 AppExchange 安全审核的状态

在 AppExchange 合作伙伴控制台中查找安全审核的状态。地位 提交解决方案以供审阅后,将显示更新。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 要启动合作伙伴控制台,请单击发布
  3. Click Technologies |解决方案
  4. 找到“安全评审”列。如果解决方案不受安全性约束 review,则省略该列。
  5. 查看审核状态 (1)。
  6. 若要查看正在进行的审核的其他状态信息,请单击“检查状态”。将加载安全审查向导的“概述”页。它包含详细的 状态、审核团队的反馈和建议的操作 项目。

请我们再看一下我们的提交验证反馈

提交解决方案进行安全评审时,提交验证阶段 您的审核开始。在此阶段,审核团队会评估您包含的所有内容 在您的提交中。如果有任何遗漏或不正确的地方,他们会将反馈发布到概述 页面,然后将提交返回给您。如果您不同意 任何验证反馈,请我们再看一遍。我们不收取任何费用 再看看我们的验证反馈。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 要启动合作伙伴控制台,请单击发布
  3. Click Technologies |解决方案
  4. 单击返回的解决方案的名称。
  5. 若要转到安全检查向导的“概述”页,请单击“检查状态”。
  6. 单击“请求再次查看”。
  7. 说明为什么你的提交需要重新审视,提供大量细节, 以便我们充分了解您的担忧。
  8. 点击重新提交

我们会在 2 周内回复大多数第二眼请求。

下载您的 AppExchange 安全审查报告

当解决方案未通过 AppExchange 安全审查时,漏洞 在解决方案中找到的文档记录在评审报告中。要下载报告,请转到 安全检查向导中的“概述”页。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 要启动 AppExchange 合作伙伴控制台,请单击发布
  3. Click Technologies |解决方案
  4. 单击未通过评审的解决方案的名称。
  5. 若要转到安全检查向导的“概述”页,请单击“查看” 报告
  6. 点击下载报告

重新提交退回的安全审核,其中所有问题都是误报

在提交验证阶段,如果扫描结果指示安全问题 您未使用误报文档解决的问题,则您的审核状态已设置 返回。您的审核将暂停,直到我们收到文档。转到概览 页面上,上传误报报告,然后重新提交 溶液。我们评估误报文档不收取任何费用。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 要启动 AppExchange 合作伙伴控制台,请单击发布
  3. Click Technologies |解决方案
  4. 单击返回的解决方案的名称。
  5. 若要转到安全检查向导的“概述”页,请单击“检查状态”。
  6. 单击上传文档
  7. 单击“查看并提交”。
  8. 点击提交

重新提交所有问题均为误报的失败安全评审

如果您收到 AppExchange 安全检查的结果,并且您确定 我们发现的所有问题都是误报,请将误报文档添加到 审核失败,然后重新提交。我们评估误报不收取任何费用 文档。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 要启动 AppExchange 合作伙伴控制台,请单击发布
  3. Click Technologies |解决方案
  4. 单击未通过评审的解决方案的名称。
  5. 单击相关解决方案的“查看报告” 版本。
  6. 选择“安全评审中发现的所有漏洞都是 误报
  7. 上传误报文档。
  8. 单击“下一步”。
  9. 点击提交

过期的 AppExchange 安全审查

当已审查的解决方案不再满足以下条件时,安全评审将过期 在 AppExchange 上分发。如果过期的评审是针对链接到公共的解决方案 listing,我们会从 AppExchange 中删除该列表,但您可以重新发布。

安全评审可能因各种原因而过期。例如,我们在以下情况下发送多封电子邮件 您的解决方案需要定期进行安全重新评审。如果我们没有收到回复,而您 错过重新评审,则解决方案的所有版本的安全评审批准都将过期。根 问题可能像过时的联系信息一样简单。定期审查和更新 合作伙伴控制台中“公司信息”页面上的联系信息。重新列出解决方案 错过重新审核后,请创建新版本并提交以供审核。

其他常见病因 逾期是逾期的审核费和未支付的收益分成。确保 我们有贵公司的最新帐单信息。联系 收集 部门或您的客户经理寻求帮助。若要在解决 付款问题,请与您的客户经理合作。

对过期的安全审查进行故障排除

AppExchange 安全审核过期的最常见原因是遗漏 重审、逾期审核费、未付收益分成。了解如何对 评价过期的原因。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 找到解决方案版本 (1)
  4. 确认您在“安全审查”列 (2) 中看到“已过期”。
  5. 单击“查看详细信息”。
  6. 查看接下来会发生什么?(1) 和 Opportunity (2) 部分 获取故障排除指南。

对安全审查结果采取行动

在提交解决方案进行初步审核后大约 4-6 周,您的 安全审查已完成。检查 AppExchange 合作伙伴控制台,查看您的解决方案是否通过。 了解如何公开列出已通过的解决方案,以及如何请求对 没有的解决方案。

  • 提交您的解决方案以进行后续的 AppExchange 安全审查 解决方案的安全审查
    已完成,但我们的安全团队发现了安全漏洞。您的解决方案未获准在 AppExchange 上分发。这不是你所希望的结果,但你有很好的陪伴。许多解决方案不会在第一次尝试时就通过。修复漏洞,并提交解决方案以供后续审查。
  • 在 AppExchange
    上列出您的解决方案 您的安全审核已完成,您的解决方案已通过。祝贺!在 AppExchange 上公开列出和分发您的解决方案。

提交您的解决方案以进行后续的 AppExchange 安全审查

解决方案的安全审查已完成,但我们的安全团队发现了安全性 漏洞。您的解决方案未获准在 AppExchange 上分发。这不是结果 你所希望的,但你有很好的陪伴。许多解决方案不会在第一次尝试时就通过。修复 漏洞,并提交您的解决方案以供后续审查。

安全审查报告列出了产品安全的安全漏洞类型 发现。对于每种漏洞类型,该报告包括:

  • 解决方案中的特定示例
  • 重现问题的步骤
  • 有关如何解决问题的文档或评论的链接

我们的目标是找到尽可能多的不同类型的漏洞,但请记住 安全审查是一个黑匣子、有时间限制的过程。我们不能总是列出每一个 安全漏洞的实例,并且我们最初可能无法检测到所有问题 类型。将安全评审结果解释为问题类型的代表性示例 你必须修复。除非报告中另有说明,否则您需要解决所有类别的问题 贯穿整个解决方案。

我们可以帮助您分析调查结果并解决安全漏洞。 在合作伙伴安全门户上安排技术办公时间预约。

在修改解决方案时,请仅修复在评审和代码中发现的安全问题 在现有包中。如果您进行其他修订,例如功能更改,我们需要 修订后的解决方案经过初步安全审查。如果你 为修订后的代码启动一个新包。

重要

如果程序包 ID 和命名空间未更改,则重新提交符合条件 进行后续审查。

修复解决方案后,请收集我们完成后续工作所需的材料 回顾。在修订后的解决方案上重新运行所需的扫描程序工具,并生成更新的扫描 报告。如果您修复了托管软件包中的问题,请提供更新的源扫描程序结果。如果 修复了在外部端点上检测到的问题,提供了更新的 ZAP 或 Chimera 扫描报告。 如果适用,请记录对误报的响应。

关于提交内容,请参见安全审核提交所需材料。

  • 请求对新包版本
    进行后续安全评审 若要修复在以前的安全评审中发现的安全漏洞,请更改托管包中的代码。在 AppExchange 合作伙伴控制台中请求对新软件包版本进行后续审核。
  • 请求对包含修订代码
    的纯 API 解决方案进行后续安全审查 请求后续审查,以修复在之前审查中发现的安全问题,即您仅修正了在 Salesforce 外部运行的代码或修正了仅 API 解决方案。要请求后续审核,请创建另一个解决方案,将其连接到 AppExchange 合作伙伴控制台,然后提交以供审核。重新测试修正的代码需要付费。
  • 请求对包含修订代码和误报的托管软件包进行后续安全审查 当您确定在托管软件包的 AppExchange 安全审查中发现的某些漏洞是误报,并且您更改了代码以修复其他漏洞时,
    请请求后续审查。要请求后续审核,请从 AppExchange 安全审核向导中的“解决方案”页面开始新的审核。提交修正的解决方案和误报文档。重新测试修正的解决方案需要付费。
  • 请求对包含修订代码和误报的 API 解决方案进行后续安全审查 当您确定 API 解决方案的 AppExchange 安全审查中发现的某些漏洞是误报,并且您更改了代码以修复其他漏洞时,
    请请求后续审查。要请求后续审核,请从 AppExchange 合作伙伴控制台的“解决方案”页面开始新的审核。提交修正的解决方案和误报文档。重新测试修正的解决方案需要付费。

请求对新软件包版本进行后续安全审查

要修复在之前的安全审查中发现的安全漏洞,您更改了 托管包中的代码。请求对新软件包版本进行后续审查 AppExchange 合作伙伴控制台。在请求对托管包进行后续审核之前,请创建另一个 软件包版本并将其连接到 AppExchange 合作伙伴控制台。提交新的 版本供审查。

用户 所需权限
在 AppExchange 合作伙伴中管理安全审查 安慰:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 若要显示相关版本,请单击解决方案名称。
  4. 单击“开始审核”。
  5. 提供所需的详细信息,支付审核费,并提交您的 请求。

在提交的“概述”区域(1)中跟踪审核进度。我们 通知您任何状态更新、操作项或来自我们安全团队的反馈。 在我们验证您提交的内容后,后续审核过程最多需要 4 周时间。

请求对包含修订代码的纯 API 解决方案进行后续安全审查

请求后续审核,以修复在之前审核中发现的安全问题 当您仅修复在 Salesforce 外部运行的代码或修复 仅限 API 的解决方案。要请求后续审核,请创建另一个解决方案,将其连接到 AppExchange 合作伙伴控制台,然后提交以供审核。重新测试需要付费 修正的代码。

用户 所需权限
在 Salesforce 合作伙伴中管理安全审查 安慰:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 单击“连接技术”。
  4. 选择“API”。
  5. 选择 API 解决方案类型。
  6. 输入新 API 解决方案所需的信息。
  7. 单击“连接”。您的 API 解决方案现在列在“解决方案”页面上。
  8. 在“解决方案”页面上找到新的 API 解决方案。
  9. 若要启动安全检查向导,请单击“启动” 审查
  10. 编辑您的提交,支付审核费,然后重新提交您的请求。

请求对包含修订代码和错误的托管软件包进行后续安全审查 阳性

当您确定 托管软件包的 AppExchange 安全审查是误报,您更改了 代码来修复其他漏洞。要申请后续审核,请从 AppExchange 安全检查向导中的“解决方案”页面。提交修正 解决方案和误报文档。重新测试修正的需要付费 溶液。在请求对托管包进行后续审核之前,请创建另一个 软件包版本并将其连接到 AppExchange 合作伙伴控制台。提交新的 版本供审查。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 单击新解决方案的名称。
  4. 单击相应包的“开始审核” 版本。
  5. 单击上传文档
  6. 上传误报文档并为其指定一个描述性标题。
  7. 在安全审查向导中输入所有其他必需的信息,支付 审核费,并提交您的新包裹以供审核。

请求对代码修改和错误的 API 解决方案进行后续安全审查 阳性

当您确定 您的 API 解决方案的 AppExchange 安全审查是误报,您更改了 代码来修复其他漏洞。要申请后续审核,请从 AppExchange 合作伙伴控制台中的“解决方案”页面。提交修正的解决方案,并 误报文档。重新测试修正的解决方案需要付费。在请求后续审核之前,请创建一个新的 API 解决方案以提交 回顾。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 将您的新 API 解决方案连接到合作伙伴控制台:
    1. 单击“连接技术”。
    2. 选择“API”。
    3. 选择 API 解决方案类型,例如 Salesforce Platform 或 Marketing 云。
    4. 输入新 API 解决方案所需的信息。
    5. 单击“连接”。
    您的 API 解决方案现在列在“解决方案”页面上。
  4. 在“解决方案”页面上找到新的 API 解决方案。
  5. 若要启动安全检查向导,请单击“启动” 审查
  6. 单击上传文档
  7. 上传误报文档并为其指定一个描述性标题。
  8. 在安全审查向导中输入所有其他必需的信息,支付 评审费,并提交您的新解决方案以供审核。

在 AppExchange 上列出您的解决方案

您的安全审查已完成,您的解决方案已通过。祝贺!公然地 在 AppExchange 上列出并分发您的解决方案。

用户 所需权限
要访问 Publishing Console,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。
  3. 点击列表
  4. 单击解决方案的磁贴,然后根据需要编辑列表。
  5. 点击发布商品信息
  6. 要进行确认,请再次点击【发布商品信息】。

Salesforce 会验证您的列表是否已准备好发布。例如,我们检查 你上传了磁贴图像,并且你的解决方案通过了安全评审。后 验证成功后,您的房源将发布,任何访问者都可以看到 AppExchange。

对 AppExchange 进行定期安全重新审查

为了帮助防范最新的漏洞,我们会定期进行安全防护 重新审查 AppExchange 解决方案。这些审查的范围与初始审查相似 安全审查,它们包括自动和手动测试。您可以自愿要求 重新审查您的解决方案,或者在某些情况下,我们会通知您您的解决方案 需要重新审核。在这两种情况下,都需要支付安全审查费用。

升级已通过安全评审的解决方案的托管包版本时,你 不要再经历完整的审核流程。您可以立即关联新的 版本添加到您的 AppExchange 列表。

为了确定哪些列出的解决方案需要重新审查,我们会考虑潜在风险和 自列出解决方案以来的时间量。为了确定潜在风险,我们运行 风险因素报告。如果您的解决方案显示重大变化,我们很可能是 进行重新审查。但是,低风险因素可能意味着您的解决方案不是 标记为需要重新审核。

要查看解决方案是否需要重新审核,请在 Salesforce 的“解决方案”页面上 合作伙伴控制台,查看“上架准备情况”区域 (1)。如果“需要安全审查”是 如图(1)所示,该解决方案应重新审查。如果显示 Ready to List (3),您可以 自愿请求重新审核,但这不是必需的。

如果我们发现你的解决方案不再符合我们的安全标准,我们也会通知你 并通过电子邮件提供解决问题的时间表,通常为 60 天。在 极端情况下,我们将 AppExchange 列表从公众查看中撤出。准备工作 重新列出它以供分发,您必须修复安全问题并将其提交以供分发 后续审查。

  • 提交您的 AppExchange 解决方案进行定期安全重新审核 如果我们通知您您的 AppExchange 解决方案需要定期进行安全重新审核
    ,请使用 Salesforce 合作伙伴控制台提交所需材料。如果你的解决方案通过了我们的初始安全评审,你可以自愿请求对更高版本进行安全重新评审。

提交您的 AppExchange 解决方案以进行定期安全重新审查

如果我们通知您您的 AppExchange 解决方案需要定期安全 重新审核,使用 Salesforce 合作伙伴控制台提交所需材料。如果您的解决方案 通过我司初次安全审查后,您可以自愿申请安全复审 版本。

所需的用户权限
要在 Salesforce 合作伙伴控制台中管理安全审核,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”|”技术 |解决方案
  3. 单击解决方案名称以显示相关版本。
  4. 如果我们通知你某个解决方案版本需要重新审核,请找到它并单击“开始审核”(1)。如果您自愿申请重新审核,请点击申请重新审核 (2)。安全检查向导将启动。
  5. 提供所需的详细信息,支付审核费,然后提交您的请求。

在您提交请求后,我们会验证它是否包含所需的材料,并开始我们的 回顾。重新审核过程最多需要 6 周时间。

在 AppExchange 上发布解决方案

使用 AppExchange 合作伙伴控制台创建解决方案列表,启动 安全审查、管理许可证设置和查看 Marketplace Analytics 清单。

  • 什么是 AppExchange?
    AppExchange 是 Salesforce 市场,提供数以千计的扩展 Salesforce 的解决方案和服务。如果您是 ISV 合作伙伴或顾问,AppExchange 可帮助客户发现您的解决方案或服务。如果您是 Salesforce 管理员或用户,AppExchange 可帮助您找到工具和人才,以释放公司的生产力。
  • 在 AppExchange 上发布 了解如何在 AppExchange
    上发布您的解决方案或咨询服务列表。
  • AppExchange 搜索的工作原理是什么?
    搜索是 Salesforce 客户在 AppExchange 上查找解决方案的最流行方式之一。了解关键字相关性、参与度、列表体验和机器学习如何影响客户看到的搜索结果。然后应用提示,帮助客户在搜索业务问题的解决方案时发现您的列表。
  • 电子邮件通知
  • 收集 AppExchange 潜在客户 您可以配置 AppExchange 列表以收集潜在客户
    并将其交付给您的 Salesforce 组织。特定的客户互动(例如观看列表的演示视频)可能会触发潜在客户收集。
  • 更新 AppExchange 列表中
    的解决方案 如果您修改已发布的解决方案,请更新您的 AppExchange 列表,以便新客户能够访问最新版本。如果解决方案需要经过安全审查,则可以在提交版本进行安全审查之前将新版本链接到公开列表。但是,在新版本通过之前,您无法发布更新的列表。
  • AppExchange 常见问题

什么是 AppExchange?

AppExchange 是 Salesforce 市场,提供数以千计的解决方案和服务 扩展 Salesforce。如果您是 ISV 合作伙伴或顾问,AppExchange 可为客户提供帮助 发现您的解决方案或服务。如果您是 Salesforce 管理员或用户,AppExchange 可提供帮助 您可以找到工具和人才来释放公司的生产力。

AppExchange 的工作原理是什么?

AppExchange 列表是推广解决方案的主要营销工具。在 列表中,您可以描述您的解决方案、定价、支持和其他详细信息,以便 客户可以确定您的产品是否适合他们。你还有一个 有机会上传视频、白皮书和其他内容以帮助客户 了解您正在交付的内容。根据您提供的信息, AppExchange 管理人将列表分类为一个或多个业务领域,例如 销售、营销或分析。

谁可以使用 AppExchange?

任何人都可以浏览列表和试用解决方案。您需要“下载包” 在组织中安装解决方案的权限。创建包并将其上传到 合作伙伴控制台中,您必须具有“创建包”和“上传包” 权限。要创建和发布商品信息,您必须拥有“管理商品信息” 许可。

在 AppExchange 上发布

了解如何在以下位置发布解决方案或咨询服务列表 AppExchange。

  • 启动 AppExchange 合作伙伴控制台 合作伙伴控制台
    是面向具有 AppExchange 列表的 ISV 合作伙伴和顾问的完整业务管理站点。合作伙伴可以在这里创建列表、管理安全评审和监视解决方案性能指标。
  • 将您的 Dev Hub 或打包组织连接到合作伙伴控制台 要将软件包添加到您的 AppExchange 解决方案列表,请先将与该软件包关联的 Dev Hub 或打包组织连接到合作伙伴控制台
  • 创建或编辑提供商配置文件 完善、准确的提供商配置文件
    是建立客户对应用、组件或咨询服务信任的关键部分。在您的个人资料中,您可以分享使命宣言,并包含您的位置和员工人数等信息。浏览列表的用户会在“提供商详细信息”部分看到此信息。
  • 创建或编辑您的 AppExchange 列表
    通过在 AppExchange 上列出您的解决方案或咨询服务来推销它。使用合作伙伴控制台创建或编辑客户眼前可见的列表。要访问合作伙伴控制台,请转到 Salesforce 合作伙伴社区中的“发布”选项卡。
  • 为您的 AppExchange 解决方案选择业务需求 当您为解决方案
    创建 AppExchange 列表时,最多可以选择 3 个类别,称为业务需求。业务需求描述解决方案的功能或解决的挑战。了解业务需求如何帮助客户发现 AppExchange 解决方案。然后查看有关选择业务需求的指南。
  • 在您的 AppExchange 列表
    上显示多元化拥有的业务详细信息 如果您的公司至少 51% 由一个或多个这些群体(女性、退伍军人、少数族裔、残障人士和 LGTBQ 社区)的成员拥有或经营,请将多元化拥有的徽章添加到您的列表中,以告知客户。当您将徽章添加到商品信息中时,您还会提供指向您公司认证的链接,例如全国少数族裔供应商发展委员会 (NSMDC) 证书。
  • 在 AppExchange 列表中
    显示辅助功能详细信息 如果您在构建 AppExchange 解决方案时考虑了辅助功能,请通过向列表添加辅助功能解决方案徽章来告知客户。将锁屏提醒添加到列表时,还会提供指向解决方案的辅助功能一致性报告的链接。例如,您可以链接到 Web 内容辅助功能指南 (WCAG) 2.1 报告的副本。
  • 在您的 AppExchange 列表
    上显示 Pledge 1% 详细信息 如果您的公司是 Pledge 1% 运动的成员,请在您的列表中添加 Pledge 1% 徽章,让客户知道。承诺 1% 的成员承诺将其产品、利润、股权或时间的一定比例捐赠给非营利事业或慈善机构。
  • 使您的 AppExchange 列表有效
    一个伟大的应用程序、组件或咨询服务值得一个与之匹配的列表。我们收集了客户和 Salesforce 营销专家的反馈,以提供一系列提示,让您的列表脱颖而出。
  • AppExchange 列表审批
    在发布 AppExchange 列表之前,Salesforce 必须检查它是否符合我们的合作伙伴品牌指南和合作伙伴计划政策。
  • 选择安装方法
    潜在客户越容易安装您的 AppExchange 解决方案,他们成为付费客户的可能性就越大。当您在合作伙伴控制台中创建列表时,系统会提示您选择安装方法。提供为他们提供最佳体验的方法。
  • 注册程序包并选择许可证设置 如果注册程序包并设置
    许可证管理应用 (LMA),则每次客户安装应用或组件时都会收到许可证记录。您可以使用许可证来跟踪谁在使用您的应用程序或组件以及使用多长时间。
  • 完成安全审查周期
    要在 AppExchange 上分发托管软件包、Salesforce Platform API 解决方案或 Marketing Cloud API 解决方案,它必须通过我们的安全审查。使用 Salesforce 合作伙伴控制台中的安全审核向导管理您的审核。提交解决方案进行初步审核。重新提交您修改的解决方案,以更正在上一次评审中检测到的安全问题。支付安全审查费用。

启动 AppExchange 合作伙伴控制台

合作伙伴控制台是面向 ISV 合作伙伴的完整业务管理站点,并且 AppExchange 列表的顾问。合作伙伴可以在这里创建列表、管理安全性 审查并监视解决方案性能指标。要访问合作伙伴控制台,您必须拥有 Salesforce 合作伙伴社区登录名。 在合作伙伴中了解更多信息 社区注册指南。

用户 所需权限
要访问 AppExchange 合作伙伴控制台,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。

将开发人员中心或打包组织连接到合作伙伴 安慰

若要将程序包添加到 AppExchange 解决方案列表,请先连接 Dev Hub 或 将与该软件包关联的组织打包到合作伙伴控制台。

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。
  3. 单击“技术”选项卡。
  4. 单击“组织”选项卡。
  5. 单击“连接技术”,然后单击“组织”。
  6. 单击“连接”。
  7. 输入包含所需软件包的组织的登录凭据 列表。

已连接组织中的软件包显示在合作伙伴控制台的“解决方案”选项卡上。从 “解决方案”选项卡,您可以提交解决方案进行安全审查。

在您的组织与合作伙伴控制台连接后,您可以关联您的列表 使用打包的解决方案、API 解决方案或试用模板。

  • 若要将打包的解决方案与现有列表相关联,请单击“打包” 解决方案,然后按照提示将打包的解决方案连接到 您的组织。然后在合作伙伴控制台中编辑您的列表,并将解决方案添加到 在“链接解决方案”部分中列出。
  • 要将 API 关联到现有列表,请单击 API,然后单击 按照提示将打包的解决方案连接到组织。然后编辑您的房源 ,然后将 API 添加到“链接您的解决方案”中的列表 部分。
  • 若要为解决方案提供免费试用版,请单击“试用模板”,然后单击 然后按照提示设置免费试用优惠。然后在 Partner Console,然后在“发展您的业务”部分中选择试用模板。

有关更多详细信息,请参阅创建或编辑 AppExchange 列表。

创建或编辑您的提供商配置文件

精美、准确的供应商资料是建立客户信任的关键部分 你的应用、组件或咨询服务。在您的个人资料中,您可以分享使命宣言 并包括您的位置和员工人数等信息。人们浏览列表 请参阅“提供程序详细信息”部分中的此信息。

要创建或编辑您的个人资料:

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”选项卡以启动合作伙伴控制台 网站。
  3. 在合作伙伴控制台中,单击主页 |概览 |公司信息
  4. 更新贵公司的资料。
  5. 保存更改。

创建或编辑 AppExchange 列表

通过在 AppExchange 上列出您的解决方案或咨询服务来推销该解决方案或咨询服务。使用 合作伙伴控制台,用于创建或编辑对客户印象深刻的列表。要访问 Partner Console,转到 Salesforce 合作伙伴社区中的“发布”选项卡。

创建 AppExchange 列表

通过以下方式开始您的列表 启动列表引导程序并选择列表类型。要启动 引导程序,转到合作伙伴控制台中的“列表”选项卡,然后单击“新列表”。

您可以向 AppExchange 添加三种不同的列表类型: 打包 解决方案、API 和顾问列表。

房源类型描述
一揽子解决方案由代码、组件、 以及打包在可分发容器中的资源。你 可以为这些包类型创建列表。Salesforce Platform:一组打包的功能, 用于从一个位置移动元数据的自定义项和架构 Salesforce 组织到另一个组织。对于平台包列表, 此外,还要指定您的列表是应用、Bolt、Flow 还是组件。Salesforce 应用程序:即装即用的集合 协同工作以集成的元素 不支持的 Salesforce 箱。Bolt 解决方案:一个完整的行业解决方案 与 Sales Cloud 等 Salesforce 产品配合使用, 具有内置的业务逻辑和自动化功能,并且具有 可自定义的用户界面。闪电可以 包含行业流程、应用程序和 Lightning 与 客户 360 度产品。流量解决方案:预构建的独立功能 元素或端到端的、特定于行业的、 可配置的业务流程,自动 代表用户完成任务。流量解决方案 帮助客户实现流程自动化,而无需 开发代码。闪电组件:模块化的 使应用或网页更 有用。B2C Commerce Cartridge:一种扩展 Salesforce B2C Commerce Cloud 的功能。墨盒 包含可部署文件中的解决方案代码和数据 容器。Tableau Accelerator:可自定义的即用型仪表板 结合数据。加速器可帮助用户访问 更快地获得数据驱动的见解。
应用程序接口一个应用程序编程接口 (API),允许 应用程序相互通信,没有用户界面 层。您可以为这些 API 类型创建列表。Salesforce Platform API:与 使用 REST API、SOAP API 或其他 平台 API。B2C Commerce Headless 集成:B2C Commerce 解决方案 使用 API 优先集成模式构建。这种集成 模式将前端和后端解耦,为您提供 灵活地创造非凡的用户体验 您的 StoreFront 和用户界面层。此解决方案类型 将 Commerce API 与可组合店面一起使用, 它由渐进式 Web 应用 (PWA) 工具包和 托管运行时 (MRT)。Marketing Cloud API:使用 Marketing Cloud 的解决方案 REST API 和 SOAP API 或其他用于共享资产的 API 内部数据库或应用程序或传递 Web 服务 向 Salesforce Marketing Cloud 提供信息。
顾问顾问是值得信赖的 Salesforce 专家,他们与我们合作 客户选择、实施和支持解决方案。通过提供 顾问列表,您可以定位可以 从您的咨询服务中获益。

选择房源类型后,系统会提示您选择一种语言。如果 您计划在 AppExchange 上发布您的列表,请选择英语。如果您计划在 AppExchange Japan 上发布,请选择日语。制作后 您的语言选择,列表引导程序将关闭,列表生成器将关闭 AppExchange 启动。Builder 是合作伙伴用来创建和编辑其 AppExchange 列表。

编辑您的 AppExchange 列表

要编辑您的列表,请转到合作伙伴控制台中的列表选项卡。查找并单击 要编辑的列表。列表生成器启动。

AppExchange 列表生成器部分

列表生成器是合作伙伴用于创建和编辑其 AppExchange 的工具 清单。以下是您在创建或编辑时浏览的部分 您的房源。

部分你做什么:适用于以下房源类型:
填写基础知识输入解决方案的标题,并提供简要说明 这可以快速告诉客户他们如何从使用您的 溶液。选择客户所需的任何 Salesforce 产品 需求和任何其他可以增强其 体验您的解决方案。所有房源
设置定价设置定价模式、付款管理和收款 策略。完成定价和付款策略后, 点击【获得批准】以提交商品信息 批准。所有房源
添加详细信息提供其他详细信息来描述您的解决方案并提供帮助 用户通过 AppExchange 的搜索和筛选找到您的解决方案 特征。您还可以输入适用于以下条件的条款和条件: 您的解决方案。如果您有徽标来代表您的解决方案,或者 你的公司,你可以将其添加到“包含视觉对象”中 部分。所有房源
链接您的解决方案选择要链接到此列表的解决方案。你 也可以选择安装方法。所有解决方案列表
发展您的业务配置您的 AppExchange 列表以收集潜在客户并交付 它们发送到您的 Salesforce 组织。特定的客户互动,例如 观看房源的演示视频或下载试用版,可以 触发线索收集。有关更多信息,请参阅 AppExchange 潜在客户。所有房源
上市状态查看发布过程中每个步骤的状态。如果 缺少信息或检测到错误,警告图标是 显示在未完成任务旁边。当每个任务完成时, 您可以将列表发布到 AppExchange。您还可以删除 从 AppExchange 发布的列表。所有房源

为您的 AppExchange 解决方案选择业务需求

在为解决方案创建 AppExchange 列表时,最多可以选择 3 个类别 称为业务需求。业务需求描述解决方案的功能或挑战 解决。了解业务需求如何帮助客户发现 AppExchange 解决方案。然后审查 选择业务需求的指南。

业务需求类别和子类别

业务需求分为类别和子类别。类别与常规一致 业务流程或任务。示例包括销售、服务和营销。每个类别 包含一个或多个子类别。子类别与特定业务流程一致,或 与类别相关的任务。例如,在销售类别中,有 用于预测和合同管理的子类别。

在 Salesforce 合作伙伴控制台中,每个 AppExchange 最多可以选择 3 个业务需求 清单。您可以选择类别、子类别或两者的某种组合。你 类别和子类别选择是独立的。选择类别不会添加 与您的列表相关的子类别。同样,选择子类别不会添加 与您的列表相关的类别。

Appy的地图是一种数据可视化解决方案,客户可以使用它来查看Salesforce 开源地图上的CRM数据。Appy’s Maps 的营销专家 Sarah 选择了三个 业务需求。子类别有两个业务需求:销售智能和地理位置。这 其他业务需求是一个类别:分析 (1)。类别和子类别选择包括 独立,因此与 Analytics 相关的子类别仍处于取消选中状态 (2)。

AppExchange 列表和业务需求

业务需求在 AppExchange 列表的摘要区域中显示为锁屏提醒。这些徽章 帮助客户了解解决方案是否有可能帮助他们解决挑战。 它们对于从外部来源获得列表的客户特别有用 AppExchange,例如广告或第三方搜索。

Luis 是一名 Salesforce 顾问,他正在为 客户。他计划在实施中加入一个地理定位应用程序。他执行谷歌 搜索并在顶部结果中看到 Appy 的地图 AppExchange 列表。当他访问 列出时,他看到地理位置 (1) 被列为业务需求,并且他对 解决方案概述视频。他联系了 Appy 的地图以安排现场演示。

AppExchange 搜索和业务需求

业务需求也可用作 AppExchange 搜索结果的筛选器。这些过滤器 帮助客户专注于与他们正在解决的挑战相关的解决方案。

当客户应用业务需求筛选器时,其对搜索结果的影响取决于 筛选器是类别还是子类别。如果客户应用子类别 filter,则 AppExchange 仅显示使用该子类别标记的解决方案。如果 客户应用类别筛选器,AppExchange 显示包含该类别的解决方案 以及所有相关的子类别。

Luis 希望将 Appy 的地图与竞争解决方案进行基准测试。他执行一个关键字 在 AppExchange 上搜索并应用过滤器以缩小结果范围。他应用了 Sales Cloud 过滤器,因为他正在设计一个 Sales Cloud 实施。然后,他应用地理位置 业务需求过滤器。地理位置是一个子类别,因此 AppExchange 仅显示解决方案 在结果中标记为 Geolocation。Luis 确定了 Appy 地图的两种替代方案 这种滤镜组合,但他希望能找到更多。

为了扩大焦点,他删除了 地理位置过滤器,并应用分析过滤器 (1)。分析是一个类别,所以 AppExchange 显示带有 Analytics 标记的解决方案以及相关的子类别, 包括仪表板和报告以及数据可视化。从这些结果来看,路易斯 确定了另外两个要进行基准测试的解决方案。

选择业务需求的提示

在考虑房源的业务需求时,请遵循以下提示。

提示
与潜在客户和客户交谈。要了解目标市场的业务需求,请与您的潜在客户交谈 和客户。当您与他们交谈时,请询问:他们的首要业务目标或挑战他们如何发现您的解决方案房源上的业务需求是否准确
实验,然后监控结果。您可以随时更新房源的业务需求。尝试尝试 具有不同的类别和子类别组合。记下你什么时候 应用更改,然后使用 AppExchange Marketplace 监控影响 分析学。
如果找不到子类别匹配项,请选择最密切相关的子类别 类别。合作伙伴控制台中的类别和子类别涵盖许多类别,但不包括 所有,共同的业务需求。如果你的解决方案满足了业务需求,但不能满足 在合作伙伴控制台中,选择最密切相关的类别。为 例如,如果您的解决方案协助完成销售周期中的特定流程,请选择 销售。

在您的 AppExchange 列表中显示各种拥有的业务详细信息

如果您的公司至少 51% 由其中一个或多个成员拥有或经营 妇女、退伍军人、少数族裔、残疾人和 LGTBQ 社区等群体告诉 客户,将 Diverse-Owned 徽章添加到您的列表中。当您将徽章添加到 列表中,您还会提供指向您公司认证的链接,例如少数民族 供应商发展委员会 (NSMDC) 证书。

所需的用户权限
要创建或更新 AppExchange 列表,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。
  3. 点击列表
  4. 选择现有列表,或创建一个列表。
  5. 单击“填写基本信息”。
  6. 对于“相等”,选择“多元化拥有的业务”选项,然后 提供认证的 URL。
  7. 单击 Save & Exit

发布房源后,多元化拥有的徽章 (1) 会显示在 社会影响部分。当客户单击“查看认证”(2) 时, 您的证书将在新的浏览器选项卡中打开。

在 AppExchange 列表上显示辅助功能详细信息

如果您在构建 AppExchange 解决方案时考虑了可访问性,请通过以下方式告知客户 将“辅助解决方案”徽章添加到您的列表中。当您将徽章添加到房源时,您将 此外,还提供指向解决方案的辅助功能一致性报告的链接。例如,您可以链接 到 Web 内容可访问性指南 (WCAG) 2.1 报告的副本。

所需的用户权限
要创建或更新 AppExchange 列表,请执行以下操作:管理房源
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。
  3. 点击列表
  4. 选择现有列表,或创建一个列表。
  5. 单击“填写基本信息”。
  6. 对于“相等”,选择“辅助解决方案”选项,然后 提供辅助功能一致性报告的 URL。
  7. 单击 Save & Exit

发布列表后,“辅助解决方案”徽章 (1) 将显示在“更多详细信息”选项卡上 在“支持的功能”部分。当客户单击查看报告 (2) 时,AppExchange 将在新的浏览器选项卡中打开您的可访问性一致性报告。

在您的 AppExchange 列表中显示承诺 1% 的详细信息

如果您的公司是 Pledge 1% 运动的成员,请通过添加 为您的房源质押 1% 徽章。承诺 1% 的成员承诺提供其产品的一定比例, 非营利性事业或慈善机构的利润、股权或时间。

所需的用户权限
要创建或更新 AppExchange 列表,请执行以下操作:管理房源

Pledge 1% 是一项全球运动,旨在鼓励和支持各种规模的公司和 回馈的阶段。要了解更多信息并加入该运动,请转到 Pledge 1% 网站。

  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。
  3. 点击列表
  4. 选择现有列表,或创建一个列表。
  5. 单击“填写基本信息”。
  6. 对于慈善事业,选择认捐 1% 参与者
  7. 单击 Save & Exit

发布商品信息后,承诺 1% 徽章 (1) 会显示在 社会影响部分。

制作 AppExchange 列表 有效

一个伟大的应用程序、组件或咨询服务值得一个与之匹配的列表。我们聚集在一起 来自客户和 Salesforce 的反馈 营销专家将提供一系列提示,让您的房源脱颖而出。

告诉客户,然后向他们展示

有效的列表将简洁、以客户为导向的写作与引人注目的视觉效果相结合。 在制作房源时,请牢记以下提示。

  • 强调用例 – 当客户阅读您的列表时,他们希望 了解您正在解决的问题,他们是否属于目标受众,以及 是什么让您的产品与众不同。当你解释你的解决方案时,用术语来表达 客户关心。例如,如果您的组件有助于支持代表解决 案例速度快 10%,这么说。
  • 添加屏幕截图、视频和演示 – 客户更有可能进行互动 具有视觉效果的列表。大多数人至少喜欢看看某件事是如何运作的 在购买之前。
  • 使列表易于阅读 – 像您一样,典型的 AppExchange 客户也很忙。 通过使您的列表易于阅读,帮助客户了解重要内容。保持 句子简短,并使用格式(如项目符号)来引起对关键点的注意。如果 您已添加屏幕截图或视频,请使用缩放和注释来突出显示 特征。

以简洁的设计为目标

一个有效的列表往往有一个 干净简单的设计。在做出设计决策时,请牢记以下提示。

  • 查找设计参考 – 在创建徽标、横幅或其他 图形,找到一个你喜欢的设计,想想它做得好的地方。例如,确实 它使用视觉上令人愉悦的字体?在开始设计时,请牢记这些想法。
  • 发布前预览 – AppExchange 允许您预览 在发布之前,您可以确切地看到您的产品将如何显示 客户。设身处地为客户着想,问:“如果我看到这个列表,我会不会 愿意购买这个应用程序或组件吗?

有关更多提示,请参阅合作伙伴徽标和品牌使用指南中的 合作伙伴的教育部分 社区。

AppExchange 上架批准

在发布 AppExchange 列表之前,Salesforce 必须检查它是否符合要求 遵循我们的合作伙伴品牌指南和合作伙伴计划政策。

完成解决方案的“填写基础知识”和“为解决方案定价”步骤后,在 合作伙伴控制台,您可以提交您的列表以供审批。

我们会审核您提交的信息。我们批准您的商品后,其批准状态为 自动更新。

签署所需的合作伙伴应用程序分发协议

列表获得批准后,必须签署合作伙伴应用程序分发协议 (PADA)。

  • 如果您的列表使用 AppExchange Checkout,则必须签署点击链接型 PADA。请参阅签署合作伙伴应用程序分发协议。
  • 如果您的商品信息是不使用 Checkout 的付费解决方案,或者您发布的是 免费增值或付费附加组件 必需解决方案,您必须离线签署 PADA,在 合作伙伴控制台。有关详细信息,请咨询您的客户经理。

编辑房源后重新提交审批

如果您想在提交房源以供审批后对其进行编辑,会发生什么情况?它 取决于您编辑的内容和列表的规格。如果您将 解决方案的列表,保存您的编辑,然后重新提交您的列表 批准。

  • 从免费到另一种定价模型的定价模型
  • 从其他定价模型到免费定价模型的定价模型
  • 从结账到非结账的付款管理
  • 从非结账到结账的付款管理
  • 定价计划单位

初次未获批准后重新提交审批

有时你的 商品信息在第一次尝试时未获批准。编辑房源信息,然后转到“获得批准”步骤 以查看必须修复的特定反馈。更新商品信息后,返回“获取” 已批准“,然后单击”重新提交”。

  • 让您的房源获得批准
    浏览合作伙伴控制台 获取已批准任务以提交您的房源以供审批。
  • 签署合作伙伴应用程序分发协议
    如果您的解决方案使用 AppExchange Checkout 作为其付款管理系统,则必须阅读点击型合作伙伴应用程序分发协议并对其进行数字签名。

让您的房源获得批准

完成合作伙伴控制台“获得批准”任务以提交您的列表 批准。

此过程假定您在合作伙伴中有一个正在进行的 AppExchange 列表 安慰。它还假设您已经完成了填写基础知识并为您的定价 解决步骤。

  1. 在合作伙伴控制台中的列表中,点击【设置】 定价
  2. 点击获得批准
  3. 单击提交 (1)。
  4. 单击保存并提交 (2)。您的房源正在审核中。要检查其批准状态,请返回 商品信息的“获得批准”步骤。
  5. 同时,要继续处理您的列表,请点击下一步 (3)。

如果您的解决方案使用 AppExchange Checkout 作为其付款管理系统,则必须阅读 并以数字方式签署点击型合作伙伴应用程序分发协议。如果你的 列表是不使用 Checkout 的付费解决方案,或者如果您要发布免费增值或 付费附加组件 需要解决方案,请联系您的客户经理离线签署 PADA,在外部 合作伙伴控制台。

签署合作伙伴应用程序分发协议

如果您的解决方案使用 AppExchange Checkout 作为其付款管理系统,则必须 阅读点击链接型合作伙伴应用程序分发协议并对其进行数字签名。

此过程假定解决方案的列表已获得批准。

如果您的解决方案使用 AppExchange Checkout 作为其付款管理系统,请遵循以下操作 指示。

  1. 若要启动合作伙伴应用程序分发协议 (PADA),请单击“签名” 协议
  2. 阅读并完成 PADA。
    1. 选中表明您有权签署此协议的复选框。
    2. 选中指示您接受协议的复选框。
  3. 若要完成对协议的数字签名,请单击“同意”。

选择安装方法

潜在客户安装您的 AppExchange 解决方案越容易,安装的可能性就越大 是他们成为付费客户。当您在合作伙伴控制台中创建列表时, 系统会提示您选择安装方法。提供给他们最好的方法 经验。

安装方法选项因列表类型而异。对于托管包列表, 有三个选项 (1)。

方法何时选择此方法
从 AppExchange 列表安装此方法对于组件是必需的,建议用于应用。如果解决方案是托管包,则此方法提供最简单的方法 安装经验。客户可以在其 Salesforce 中安装您的解决方案 通过 AppExchange 安装顺序的沙箱或生产环境 没有你的帮助。API 解决方案无法直接从 AppExchange 安装。
请与您联系以获取安装说明如果安装或选择过程需要您的帮助,则必须 选择此方法。同意条款和条件后,客户将收到通知,您将 请尽快联系以帮助安装。确保您的公司 拥有协助潜在客户的资源。
从您的网站安装如果您的解决方案是可下载的客户端或需要其他信息来 安装后,这种方法是最好的。用户在您的列表上点击立即获取并同意后 到条款和条件,它们将被定向到您的网站以完成 安装过程。确保您提供了明确的下载说明 并执行了所需的设置或配置。
从 Tableau Exchange 列表安装如果您的解决方案是 Tableau 加速器,则必须使用此方法。AppExchange 上列出的加速器在 Tableau 上有相应的列表 交换。选择安装 Accelerator 的 AppExchange 客户是 重定向到 Tableau Exchange 上的安装流程。

注册软件包并选择许可证设置

如果注册程序包并设置许可证管理应用程序 (LMA),则会收到 每次客户安装您的应用或组件时的许可证记录。您可以使用许可证来 跟踪谁在使用您的应用程序或组件以及使用时间。

注意

在注册程序包之前,请确保:

  • 你的应用或组件位于托管包中。
  • 您已安装 LMA。在大多数情况下,LMA 安装在您的合作伙伴业务中 组织。
  1. 登录 Salesforce 合作伙伴 社区。
  2. 单击“发布”选项卡以启动合作伙伴控制台 网站。
  3. 在合作伙伴控制台中,单击“技术”选项卡。
  4. 单击“解决方案”。
  5. 找到要注册的包版本,然后单击“注册” 包
  6. 登录到您的许可证管理组织以编辑默认许可证设置。
  7. 选择您的默认许可证是“免费试用版”还是“活动版”。对于免费试用,请输入最多 90 的数量 日。
  8. 选择您的许可证是按席位应用还是站点范围应用。对于席位数,请输入席位数 分配给许可证。
  9. 保存更改。

通过 AppExchange 安全审查

【生效日期:2023年8月9日】在 Salesforce,没有什么比 客户的信任。信任需要安全。要分发托管包,请使用 Salesforce Platform API 解决方案,或 AppExchange 上的 Marketing Cloud API 解决方案,它必须通过我们的安全性 回顾。了解如何准备并通过安全审查。

注意

本节中对 AppExchange Security Review 的描述和此处的链接是 截至所列生效日期。SFDC 可能会更新或修改 AppExchange 安全性 不时自行决定审查,恕不另行通知。

重要

合作伙伴应用程序,包括托管软件包、Salesforce Platform API 解决方案、Marketing Cloud API 解决方案以及本文提及的其他解决方案, 是 Salesforce 主要服务协议中定义的非 SFDC 应用程序(可在 https://www.salesforce.com/company/legal/agreements 或后续 URL)。尽管有 对合作伙伴应用程序进行安全审查时,Salesforce 不保证其质量 或任何合作伙伴应用程序的安全性,客户有责任评估 合作伙伴应用程序的质量、安全性和功能。

  • AppExchange 安全审查 您必须先通过安全审查
    ,然后才能在 AppExchange 上公开列出您的托管软件包、Salesforce Platform API 解决方案或 Marketing Cloud API 解决方案。AppExchange 安全审查测试解决方案的安全状况,包括其保护客户数据的程度。
  • AppExchange Security Review 的工作原理是什么?
    在启动 AppExchange 安全审查之前,您需要执行自己的测试并收集支持材料,以帮助我们评估您的解决方案的安全性。在审核期间,我们的产品安全团队会尝试识别解决方案中的安全漏洞。如果团队发现漏洞,您可以访问个性化的技术指导,以帮助您解决已识别的漏洞。
  • 合作伙伴安全门户 合作伙伴安全门户
    是满足安全评审需求的主要枢纽。该门户托管源代码扫描程序 (Checkmarx) 和 Chimera 自动安全扫描工具。使用这些工具可以识别解决方案中的安全漏洞。您还可以通过该门户安排办公时间、与 AppExchange 安全工程师和安全审查运营团队成员的约会。办公时间提供了一个论坛,供您询问有关安全审查过程的问题,并讨论如何返工存在安全漏洞的代码。
  • 测试整个解决方案 使用手动测试和自动安全扫描程序工具测试解决方案
    的全部范围。执行安全扫描时,请包括独立于 Salesforce 平台运行的所有外部端点。记录误报安全违规行为,并修复所有不符合 Salesforce 安全准则的代码。
  • 使用 Salesforce Code Analyzer 扫描您的解决方案
    作为提交托管软件包进行安全审查的 AppExchange 合作伙伴,您必须使用 Salesforce Code Analyzer 对其进行扫描,并在解决方案的 AppExchange Security Review 提交中提供测试结果。此扫描是您必须使用合作伙伴安全门户中提供的工具完成的扫描的补充。使用的工具是源代码扫描器(也称为Checkmarx扫描器)和Chimera扫描器。
  • 误报
    在浏览 AppExchange 安全审查流程时,您的解决方案可能会遇到误报问题。当安全扫描工具或代码审查者标记看似构成安全漏洞但实际上并非如此的代码时,就会发生误报。相反,标记的漏洞不存在、不可利用或不需要支持有效的用例或功能。
  • 安全审查资源 这些资源
    可帮助您准备 AppExchange 安全审查。

AppExchange 安全审查

在公开列出您的托管软件包之前,Salesforce Platform API 解决方案或 AppExchange 上的 Marketing Cloud API 解决方案,它必须通过安全审查。The AppExchange 安全评审测试解决方案的安全状况,包括其保护程度 客户数据。

安全审查可帮助您识别黑客、恶意软件或 其他威胁可以利用。Salesforce 安全审查团队使用 基于最常见的 Web 漏洞的威胁建模配置文件。团队尝试 穿透解决方案中编程的防御。他们的目标是提取或修改数据 他们没有访问权限,就像安全威胁试图这样做一样。以下是我们测试的常见安全威胁的一小部分。

  • SOQL 和 SQL 注入
  • 跨站点脚本
  • 不安全的身份验证和访问控制协议
  • 特定于 Salesforce 平台的漏洞,例如记录共享违规

有关最关键的 Web 应用程序安全风险的详细信息,请阅读开放 Web 应用程序安全项目 (OWASP) 十大意识 公文。OWASP是一个非营利性基金会,致力于提高软件的安全性。

我们为您提供一份报告,记录在审查期间发现的安全漏洞。我们是 也可以与您会面并帮助您解决漏洞。解决 报告,然后提交修订后的解决方案以供后续审查。我们提供多种评论 每次提交,使你能够微调解决方案的安全性。

重要

测试升级后的解决方案针对最新 安全漏洞,Salesforce 保留对 在 AppExchange 上分发的解决方案。

将安全审查流程视为与个性化建议相结合的执行机制,以及 工具。您可以访问办公时间,在那里您可以直接与安全审查团队联系 成员,以获得适合您的解决方案的指导。此外,安全审查团队还会将您指向 安全扫描工具,有助于自动审查您的安全性 溶液。

AppExchange Security Review 的工作原理是什么?

在启动 AppExchange 安全审查之前,您需要执行自己的测试,并 收集支持材料,帮助我们评估解决方案的安全性。在审核期间, 我们的产品安全团队会尝试识别解决方案中的安全漏洞。如果 团队识别漏洞,您可以获得个性化的技术指导来帮助您 解决已识别的漏洞。

重要

每个托管包、Salesforce Platform API 和 Marketing Cloud API 您计划在 AppExchange 上公开列出的内容必须经过安全审查。

确保您已准备好开始

知道你什么时候准备好了 安全审查与其工作方式同样重要。你已准备好提交安全解决方案 之后复习:

  • 根据行业最佳安全标准保护您的解决方案。
  • 证明您的解决方案已支持 Lightning。所有新解决方案均已提交 安全审查必须是 Lightning Ready。
  • 在 Salesforce 合作伙伴控制台中:
    • 将您的打包组织连接到 AppExchange。
    • 创建提供商配置文件。
    • 创建解决方案列表。

注意

您的解决方案必须在 AppExchange 合作伙伴计划中注册。

测试解决方案

运行自动扫描工具,并在整个解决方案中手动测试解决方案 开发生命周期。安全扫描工具仅提供第一关的见解,但很有用 进入解决方案漏洞。查找自动扫描工具无法发现的漏洞 检测,也手动测试您的解决方案。

提示

我们强烈建议您在整个开发过程中测试代码 生命周期。如果推迟测试和修正,可能会遇到更大的 问题的积累,大大延迟了您的上市时间。

在开发过程中,我们建议您使用 Salesforce Code 扫描代码 Analyzer,用于源代码分析的统一工具。代码分析器支持多种引擎:PMD、 PMD 复制粘贴检测器、ESLint、RetireJS 和 Salesforce 图形引擎。图形引擎很有用 识别 法典。

完成解决方案开发后,执行另一轮手动测试并运行 产品安全所需的自动扫描工具。所需的扫描类型 是否运行取决于解决方案的体系结构。

在合作伙伴安全门户上,可以访问源代码扫描程序,该扫描程序 也称为Checkmarx扫描仪和Chimera扫描仪。这两个扫描工具 满足许多 AppExchange 解决方案的测试要求。

在提交解决方案以供审核之前,请解决您发现的所有安全问题 您的手动测试和扫描工具。修复代码或记录如何标记问题 是误报。误报是一个看似会带来安全风险的问题,但 不。

在提交解决方案之前对其进行测试,您更有可能通过审核 第一次。没有事先测试的申请人很少通过,必须在解决后重新提交 在审查期间发现的安全漏洞。重新提交会严重延迟 解决方案发布过程。

收集安全审查提交所需的材料

收集材料,使产品安全部门能够执行彻底的人工审核。为 大多数提交时,您需要向 Developer Edition 组织提供 要分发已安装的解决方案和解决方案文档。安全审查 团队使用 Developer Edition 组织作为解决方案测试环境。组织和文档 对于 Marketing Cloud 应用,不需要。其他所需材料因解决方案类型而异。

提示

在准备安全审查时,您可能会有疑问,并且 安全审查期间或之后的其他要点。讨论您的疑虑并获得答案 如有疑问,请访问合作伙伴安全门户并安排办公时间预约。为 帮助提交解决方案以供审核,安排与安全评审的约会 运营团队。若要解决在评审期间发现的解决方案中的问题,请执行以下操作: 与产品安全团队预约。

提交解决方案以供审核

完成测试并收集提交所需的材料后,即可准备就绪 提交您的解决方案以供 AppExchange 安全审查。使用安全评审提交 共享您的解决方案和所需材料,并支付安全审查费用的接口。如果 您计划免费分发您的解决方案,无需支付费用。

提交所有内容后,请期待这些周转时间。

重要

时间范围是估计值。有几个因素会影响实际持续时间 您的评论,例如您提交的完整性,以及 提交。

安全审查阶段典型时间范围
安全评审操作验证你的提交是否已准备好进行评审。一个 提交内容是否包含测试安全性所需的所有内容,已准备好进行审查 您的解决方案。1-2周
产品安全性首次测试您的解决方案。3-4周
产品安全性测试重新提交以前未批准的解决方案 这表明在修复安全漏洞方面取得了进展。2-3周

跟进安全审查报告

安全评审完成后,您会收到一份报告,通知您提交的内容 已获准或未获准在 AppExchange 上公开上市。

  • 已批准:您可以在 AppExchange 上公开列出您的解决方案并将其分发给客户 马上。
  • 未批准:安全评审团队在解决方案中检测到安全问题。你不能 在 AppExchange 上列出您的解决方案或将其分发给客户。

如果解决方案未获得批准,则报告将包含有关安全类型的信息 我们检测到的问题。请记住,安全审查是一个黑匣子,有时间限制 过程。我们无法列出安全问题的每个实例,并且我们最初可能无法检测到所有实例 问题类型。将安全评审结果解释为以下类型的代表性示例 您必须解决的问题。然后努力查找并修复整个过程中每个问题的所有实例 溶液。

解决所有检测到的安全问题。重新运行所需的自动扫描工具以生成 修订后的解决方案的报告。然后,使用更新的扫描重新提交修改后的解决方案 报告。

合作伙伴安全门户

合作伙伴安全门户是满足安全审查需求的主要枢纽。门户 托管源代码扫描程序 (Checkmarx) 和 Chimera 自动安全扫描工具。使用这些 用于识别解决方案中安全漏洞的工具。该门户也是您访问的地方 安排办公时间、与 AppExchange 安全工程师的约会以及 Security Review 运营团队成员。办公时间为您提供了一个论坛,供您询问有关安全性的问题 审查过程,并讨论如何返工具有安全漏洞的代码。

  • 设置合作伙伴安全门户登录
    将您的打包组织连接到合作伙伴控制台。然后,使用该组织的凭据登录到合作伙伴安全门户。登录用户可以访问安全扫描工具并安排办公时间约会。
  • 门户
    上的安全扫描程序 为了识别安全漏洞,我们要求您在解决方案和独立于 Salesforce 平台运行的所有外部端点上运行安全扫描工具。合作伙伴安全门户托管了我们推荐的两个扫描程序,即源代码扫描程序 (Checkmarx) 和 Chimera。
  • 办公时间:门户
    上的约会 Salesforce 安全审核团队为 AppExchange 合作伙伴提供办公时间。在办公时间内,您可以直接、预定地与安全审查团队成员进行 Web 会议访问。从安全审查操作部门获取有关提交过程的答案,或使用产品安全功能对安全漏洞进行故障排除。

设置合作伙伴安全门户登录

将您的打包组织连接到合作伙伴控制台。然后登录到合作伙伴 使用该组织凭据的安全门户。登录用户可以访问安全性 扫描工具并安排办公时间约会。

注意

在设置合作伙伴安全门户登录之前,请确保打包 托管开发工作的组织是 Salesforce Developer Edition 组织。

用户 所需权限
访问 Partner Security 上的源代码扫描程序 (Checkmarx) 门户:作者 Apex
  1. 登录 Salesforce 合作伙伴社区。
  2. 单击“发布”。
  3. 单击“技术”选项卡。
  4. 单击“组织”选项卡。
  5. 单击“连接技术”,然后单击“组织”。
  6. 单击“连接”。
  7. 输入用于打包组织的凭据,然后记录 在。
  8. 转到合作伙伴安全门户。
  9. 单击登录

门户上的安全扫描程序

为了识别安全漏洞,我们要求您在 您的解决方案以及独立于 Salesforce 平台运行的所有外部端点。这 合作伙伴安全门户托管我们推荐的两个扫描程序,即源代码扫描程序 (Checkmarx)和奇美拉。

所需的用户权限
要访问合作伙伴安全门户上的源代码扫描程序 (Checkmarx),请执行以下操作:作者 Apex

提示

我们强烈建议您对代码和任何连接的代码运行安全扫描 贯穿整个开发生命周期的端点。运行定期扫描并修复标记的问题 去防止安全漏洞堆积并为您创造更多工作 后。

合作伙伴安全门户提供对两个 Salesforce 支持的扫描程序:源代码扫描程序,也称为 Checkmarx scanner 和 Chimera 扫描器服务。

源代码扫描器 (Checkmarx) 检查 Apex、Visualforce 和 Lightning 代码,但不检查 检查解决方案的外部终结点。

Chimera 检查外部端点,但要求您将令牌上传到 外部服务器。如果解决方案连接到你拥有的域上的终结点,则可以使用 嵌 合体。如果解决方案连接到不属于你的域上的终结点,则无法上传 令牌,不能使用 Chimera。使用替代工具。例如,下载免费的 OWASP Zed 攻击代理 (ZAP) 扫描程序或购买 Burp Suite 许可证。

在提交解决方案之前,除移动客户端和 API 解决方案外,请运行 合作伙伴安全门户中的源代码扫描程序。如果您的解决方案连接到任何 非 Salesforce 域,也在外部端点上运行 Chimera、OWASP ZAP 或 Burp Suite。 在提交解决方案进行安全评审时,包括扫描报告。

安全扫描程序扫描目标考虑
源代码扫描器 (Checkmarx)Apex、Visualforce 和 Lightning 代码该静态扫描工具使用Checkmarx安全技术。对于任何包含 Salesforce 软件包或 元件。移动客户端或 API 解决方案不需要。每个解决方案版本将为您预配三个源代码扫描程序 (Checkmarx) 运行,其中 安全审查费。请考虑在开发时运行替代工具,例如 开源 PMD 源代码分析器,以及源代码扫描器,当您完成 提交。如果您想要灵活和自由地扫描未打包的代码,或绕过扫描限制 和软件包链接要求,请从Checkmarx购买许可证。
嵌 合体您拥有的域上的外部终结点检查解决方案的外部终结点中是否存在安全漏洞。从 Salesforce IP 地址扫描解决方案。不需要下载。不适用于您不拥有的域上的端点,因为它需要上传 外部服务器根目录的令牌。如果解决方案连接到不属于你的外部终结点,请使用 OWASP ZAP 或 打嗝套房而不是奇美拉。

门户网站上的办公时间预约

Salesforce 安全审查团队为 AppExchange 合作伙伴提供办公时间。在 办公时间,您可以直接、预定地与安全审查团队成员进行 Web 会议访问。 从安全审查操作中获取有关提交过程的答案或对安全性进行故障排除 产品安全漏洞。

注意

若要安排办公时间预约,请访问合作伙伴安全门户。需要门户登录?按照 设置合作伙伴安全门户登录中的说明。

运营办公时间

在运营办公时间内,安全审查运营团队成员会回答有关以下问题 安全审查后勤和提交要求。典型问题包括:

  • 解决方案的哪些组件在安全评审范围内?
  • 我需要提供什么类型的报告和扫描结果?
  • 如果我提交的解决方案未通过审核,会发生什么情况?

技术办公时间

当您需要特定的安全相关技术时,可以使用技术办公时间 来自产品安全团队的协助。典型问题包括:

  • 如何浏览 AppExchange 安全要求?
  • 设计和实现解决方案特定方面的安全方法是什么?
  • 如何解决自动安全扫描工具检测到的问题?
  • 安全审查报告中的发现意味着什么?
  • 哪些安全扫描结果可以被视为误报?
  • 如何解决安全审查报告中我认为是虚假的问题 阳性?
  • 我对代码的返工是否修复了安全性中发现的安全漏洞 回顾?

测试您的整个解决方案

使用手动测试和自动安全扫描程序测试解决方案的全部范围 工具。执行安全扫描时,请包括独立于 Salesforce平台。记录误报安全违规行为,并修复所有代码 不符合 Salesforce 安全准则。

测试范围

测试提交以供安全评审的解决方案的所有部分。确保解决方案 架构是安全的,包括未托管在 Salesforce 平台上的端点。你 注意解决方案的所有组件和层有助于将黑客或 利用潜在入口点的恶意软件。

解决方案的全部范围都经过安全评审测试。例如,我们可以 执行攻击 Development Edition 测试组织的渗透测试,并尝试访问敏感组织 数据或使用虚假凭据进行身份验证。

若要确定测试范围,请使用跟踪数据的方法。无论客户或数据在哪里 在范围内。例如,您的 Salesforce 客户需要登录您的公司 网站或数据同步到第三方服务器。测试这些部件以确保它们 安全地传输凭据和数据。如果满足上述任一条件,则外部终结点在安全范围内 查看安全测试的必要部分。

  • 端点在对最终用户进行身份验证方面发挥作用,作为购买和获取支持的一部分 用于或使用您的解决方案。此定义包括不需要的已连接应用 手动输入凭据。
  • Salesforce 数据将传输到端点或从端点传输。

重要

在未执行的外部终结点上执行安全测试之前 自己,完成两个动作。首先,获得执行安全测试所需的任何权限 来自拥有外部终结点的第三方。其次,遵循 Salesforce IP 中的准则 要允许的地址和域。

自动扫描工具

若要识别解决方案和外部终结点中的安全漏洞,我们要求 运行特定的自动安全扫描工具。

提示

我们强烈建议 在整个开发过程中,对代码和任何连接的端点运行安全扫描 生命周期。运行定期扫描并修复标记的问题,以防止安全 漏洞堆积起来,以后会为您创造更多工作。

如果您的解决方案是托管软件包、Salesforce Platform API 解决方案或 Marketing Cloud API解决方案,它必须通过安全审查。如果您要列出托管软件包,则 需要使用 Salesforce Code Analyzer 扫描您的解决方案并提交全面扫描 在 AppExchange Security Review Wizard 中生成结果。如果无法使用代码分析器,请 必须提供明确的理由,说明为什么没有在代码上运行代码分析器。

如果你的解决方案不是托管包,或者你选择不使用代码分析器,则可以 在合作伙伴安全门户上访问两个 Salesforce 支持的安全扫描程序:源 代码扫描器,也称为Checkmarx扫描器和Chimera扫描器。

下表总结了我们需要或推荐的自动安全扫描程序工具。

安全扫描程序工具扫描目标考虑结果被接受并提交托管在合作伙伴安全门户上
Salesforce 代码分析器Apex、JavaScript、Lightning、TypeScript 和 Visualforce 代码Salesforce Code Analyzer 统一了扫描工具,例如 ESLint、JavaScript、PMD、 在一个易于安装的 Salesforce CLI 插件中停用 JS 和 Salesforce Graph Engine。 Salesforce Graph Engine 尤其有助于检测创建、读取、更新和删除以及 字段级安全性 (CRUD/FLS) 冲突。您可以在本地开发计算机上安装 Salesforce Code Analyzer 或将其集成 到持续集成 (CI) 流程中。Salesforce Code Analyzer 包含用于扫描 Lightning Web 组件的自定义规则 JavaScript的。Salesforce Code Analyzer 不扫描外部端点。Salesforce Code Analyzer 提供多种输出格式:CSV、HTML、JSON 和 JUnit。是的
源代码扫描器 (Checkmarx)Apex、Visualforce 和 Lightning 代码该静态扫描工具使用Checkmarx安全技术。您必须为任何安全审查提交提供Checkmarx扫描,其中包括 Salesforce 软件包或组件。移动客户端或 API 不需要这些扫描 解决 方案。每个包版本预配了三个源代码扫描程序运行,并具有安全性 审查费。如果您想要灵活和自由地扫描未打包的代码,或绕过 3 扫描限制和软件包链接要求,请从Checkmarx购买许可证。是的是的
PMD源代码分析器顶点代码PMD 扫描程序是一个免费的开源工具,也可作为 VS Code 使用 外延。此工具是包含 Apex 的解决方案的源代码扫描程序的替代方法 法典。在准备解决方案进行安全评审时,并作为对源的补充 代码扫描器,运行PMD扫描无限次。PMD 通常报告的误报数通常比源代码扫描程序工具多。
嵌 合体您拥有的域上的外部终结点Chimera 检查解决方案的外部终结点。Chimera 从 Salesforce IP 地址扫描解决方案。此扫描仪不需要下载。您不能将 Chimera 与您不拥有的域上的端点一起使用,因为它需要 将令牌上传到外部服务器的根目录。如果解决方案连接到不属于你的外部终结点,请使用 OWASP ZAP 或 打嗝套房。是的是的
OWASP Zed 攻击代理 (ZAP)外部终结点ZAP 扫描程序是一个免费的、社区驱动的代理,用于 Web 应用安全测试。Zap 需要下载。为浏览器设置 ZAP 提供了启动指南 使用此工具进行安全扫描。是的
打嗝套房 (Burp Suite)外部终结点Salesforce 不会为安全审查提供 Burp Suite 许可证。购买一个 独立许可。Burp Suite 需要下载。是的

使用 Salesforce Code Analyzer 扫描您的解决方案

作为提交托管软件包进行安全审查的 AppExchange 合作伙伴,您必须 使用 Salesforce Code Analyzer 对其进行扫描,并在解决方案的 AppExchange 中提供测试结果 安全审查提交。此扫描是对必须使用 合作伙伴安全门户中提供的工具。使用的工具是源代码扫描器、 也称为Checkmarx扫描仪和Chimera扫描仪。

用户权限 需要
访问 Partner Community、Partner Console 和 AppExchange Security 回顾:管理房源
  • 按照以下说明安装 Salesforce CLI。
  • 要确保您运行的是最新版本的 CLI,请运行 。sf update
  • 安装Java 开发工具包 (JDK) 版本 8 或更高版本。
  • 要安装 Salesforce Code Analyzer,请运行 。sf plugins install @salesforce/sfdx-scanner
  1. 将解决方案的代码本地存储在计算机上。确保代码版本 与要提交进行安全评审的包匹配。
  2. 在“终端”或您喜欢的命令行界面中,切换到顶级目录 解决方案的代码和元数据。
  3. 使用 sf scanner run 运行第一次扫描,指定 –-category=“Security”,并将输出文件命名为 CodeAnalyzerGeneral.csv
  4. 使用 sf scanner run dfa 运行第二次扫描, 指定 –-category=“Security”,并将输出命名为 文件CodeAnalyzerDFA.csv。取决于复杂程度 时,代码分析器对代码的第二次扫描可能需要几个小时。
  5. 修复代码分析器在提交安全之前发现的任何问题 回顾。
  6. 重新扫描并保存结果文件。
  7. 记录任何误报。
  8. 将干净的CodeAnalyzerGeneral.csv和CodeAnalyzerDFA.csv文件上传到安全审查中 提交。
  9. 如果您有误报文档,也请上传该文档。

运行第一次扫描。

sf scanner run --format=csv --outfile=CodeAnalyzerGeneral.csv --target="./" --category="Security"

运行第二次扫描。

sf scanner run dfa --format=csv --outfile=CodeAnalyzerDFA.csv --target="./" --projectdir="./" --category="Security"

如果无法成功运行 Code Analyzer CLI 命令,请阅读 Salesforce 代码分析器文档。如果你 仍需要帮助,请在 Salesforce 代码分析器 GitHub 中记录问题 存储库,并提供有关您在以下情况下遇到的错误的信息 为安全评审提交生成扫描结果。

误报

在浏览 AppExchange 安全审查流程时,您可能会遇到解决方案的误报问题。当 安全扫描工具或代码审查器标记似乎构成安全漏洞的代码 但实际上没有。相反,标记的漏洞不存在、不可利用或不存在 需要支持有效的用例或功能。

通过解决以下问题,提高通过初始或后续安全审查的可能性 提交中的误报。包括一个文档,解释为什么每个标记为 false 积极不会造成安全风险。

  • 记录对误报的响应
    大多数情况下,误报出现在源代码扫描程序 (Checkmarx)、Chimera、ZAP 或 Burp Suite 扫描程序结果中。误报偶尔会出现在 Salesforce 安全审查失败报告中。无论哪种情况,都可以通过在提交代码时包含误报说明文档来提高通过安全评审的可能性。
  • 对Checkmarx扫描结果
    中误报的响应示例 以下示例说明如何记录对Checkmarx扫描导致的误报的响应。该示例采用表格格式,但您可以使用适合信息报告的任何格式。
  • 安全审查失败报告中
    误报的示例响应 以下示例说明如何记录对 Salesforce 安全审查失败报告中列出的误报的响应。它旨在支持重新测试提交。

记录对误报的响应

大多数情况下,误报出现在源代码扫描程序 (Checkmarx)、Chimera、ZAP 或 Burp Suite 扫描仪结果。Salesforce 安全审查中偶尔会出现误报 故障报告。无论哪种情况,您都可以通过以下方式提高通过安全审查的可能性 在提交代码时包括误报说明文档。

使用我们的误报文档模板提供您的 反应。对于每个已标记的问题,请包括:

  • 位置 – 说明报告漏洞的代码位置。
  • 解释 – 解释为什么标记的代码不会造成漏洞。

除了提供误报的理由外,还包括在文档中 阐明特殊用例、情况或例外情况的说明。

某些类别的安全扫描结果是不需要文档的误报 或代码返工。这些类别存在于我们接受的大多数安全扫描程序中 安全审查。其他扫描结果属于需要注意的严重性类别 因为它们突出显示了已知的安全漏洞。如果您无法提交正当理由的虚假 积极的文档,重新设计标记的代码以满足安全标准。

扫描器安全审查时需要注意的扫描结果无需注意的扫描结果
源代码扫描器 (Checkmarx)未标记为“代码”的所有问题,无论严重性级别如何 质量”标记为“代码质量”的问题
ZAP 和 Burp 套件归类为高严重性的问题不需要对低严重性和中等严重性问题采取行动,但需要对 鼓励它们是否构成安全威胁
嵌 合体未标记的所有问题,无论严重性级别如何 “信息/其他”标记为“信息性/其他”的问题

对Checkmarx扫描结果中误报的示例响应

以下示例演示如何记录对误报的响应 来自 Checkmarx 扫描。该示例采用表格格式,但您可以使用适合的任何格式 报告您的信息。

报告的漏洞位置响应
FLS 更新路径 1–17我们实现并调用了 AuthManager 类来检查这些路径,或者 引发错误。您可以在 ControllerFile.cls 的行中看到这一点 241、245 和 249。
FLS 更新路径 18–24已修复且有效。
FLS 更新路径 25、26 和 30违反我们的自定义对象UsageLog__c,不适用于用户 消费。它们从不直接向用户公开。
FLS 更新路径 27–29必须更新Account.NumberRelatedIssues__c字段以适当地计算 创建新对象,与用户输入无关。
共享冲突BatchCleanData.cls我们将此类调用的函数最小化到仅最小集 需要。without sharing
共享冲突LightningController.cls将声明更改为 。with sharing
共享冲突GlobalIssueReporting.cls改用,因为我们 不知道我们的调用类需要哪个上下文。inherited sharing
存储的 XSSIssue.page 文件:路径 1–3reportIssueList 是 objectID + ‘ ‘ + 整数的列表。它不构成 XSS 风险。
存储的 XSSIssue.page 文件:路径 4通过删除 .escape=”false”
存储的 XSSIssue.page我们清理了使用情况使用 Salesforce SecureFilters 在 JavaScript 中登录 图书馆。

对安全评审失败报告中误报的示例响应

以下示例演示如何记录对 Salesforce 安全审查失败报告。它是为了支持重新测试而编写的 提交。

报告的漏洞位置响应
不安全的软件版本j查询更新。
不安全的软件版本时刻.js没有用户输入流入时刻解析。用户输入仅流向 Salesforce Date 领域。
敏感数据存储不安全UserConfig_c.objectapiKey__c字段在使用加密密钥进行设置之前会进行加密,该密钥是 存储在受保护的自定义设置中。
敏感数据存储不安全IssueInvite_c.objectpassword__c字段是支持代理选择的密码,用于公开共享资源 与互联网。它不是用户拥有的机密。
敏感数据存储不安全APIManagement_c.对象我们弃用了此自定义设置,但无法删除自定义设置 托管包中的定义。
敏感数据存储不安全AuthManager.cls注释中的凭据只是示例凭据。它们不进行身份验证 任何开发或生产系统。
存储的 XSShttps://content.saslesforce.partner.com我们在 2020 年 2 月 1 日的办公时间与 Salesforce 的 Jane Doe 进行了交谈。此 URL 是 链接到非敏感内容域。URL 没有用于访问后端的会话数据 信息。我们被告知,这一发现可能是误报。

安全审查资源

这些资源可以帮助您为 AppExchange 安全审查做好准备。

组的体系结构注意事项 和专业版

Salesforce CRM分为五层, 或版本:

  • 团体版 (GE)*
  • 专业版 (PE)
  • 企业版 (EE)
  • 无限版 (UE)
  • 性能版 (PXE)*

注意

团体版和性能版不再销售。对于比较图表 版本及其功能,请参阅 Salesforce 定价和版本 页面。

如果您计划将应用程序销售给现有的 Salesforce 客户,请务必了解 这些版本,因为它们会影响应用的设计。它 便于将它们视为集群,GE/PE 和 EE/UE/PXE,作为 每个集群中的版本都具有类似的功能。例如 你可能只想在应用需要时支持 EE/UE/PXE GE/PE 中不可用的某些对象和功能。也 您可以拥有 分层产品。这将包括GE/PE的基本解决方案 以及面向 EE/UE/PXE 客户的高级版本,可利用 附加功能。

EE/UE/PXE 具有最强大的功能。除了 Salesforce CRM 许可证外,它们还支持 Lightning Platform 平台许可证。如果您的应用程序不需要 Salesforce CRM 功能(如潜在客户、商机、案例等),Lightning Platform 平台许可证将为您提供最大的灵活性 将您的应用程序部署到通常可能不是 Salesforce 用户的用户。你的应用仍受版本限制和打包的约束 规则。

GE/PE 不包含您可以构建的所有功能 在 Developer Edition (DE) 中。因此,在 您的 DE 组织可能不会安装在 GE/PE 组织中。如果 您正在设计一个专门在 GE/PE 中工作的应用程序, 您必须了解这些版本的不同之处。

在以下情况下,还有许多其他注意事项需要牢记 决定是否支持这些版本。Lightning 平台平台许可证无法在 GE/PE 组织中配置。 这意味着只有现有的 Salesforce CRM 用户才能使用您的应用程序。有些功能不是 在GE/PE中可用。有几个特殊权限可用 到克服这些限制的合格合作伙伴应用。

请参阅以下部分,了解可用功能、限制和 其他设计注意事项。

  • 团体版和专业版的功能
  • 团体版和专业版的限制
  • 组内访问控制 和专业版
  • 在 Group Edition 和 Professional Edition 中使用 Apex
  • Group Edition 和 Professional Edition 中的 API 访问
  • 设计您的应用程序 支持多个版本
  • 示例设计方案
  • 团体版和专业版的功能
  • 团体版和专业版的限制
  • Group Edition 和 Professional Edition 中的访问控制
  • 在 Group Edition 和 Professional Edition 中使用 Apex
  • Group Edition 和 Professional Edition 中的 API 访问 GE 和 PE 组织通常不支持
    API 访问。但是,在您的应用通过安全审核后,您就有资格使用某些 API 来构建复合应用程序。
  • 设计应用以支持多个版本
  • 团体版和专业版的示例设计方案

团体版和专业版的功能

确定特定版本中可用的功能和对象的最简单方法 是通过查看版本比较表。您也可以查找 哪些版本支持特定功能或对象,方法是搜索联机帮助。这很重要 在开始设计应用之前,请检查这些资源,以便做出明智的决定 面向哪些版本。完成应用构建后,建议进行测试 它通过在 GE 和 PE 测试组织中安装您的软件包来确保一切正常运行 适当地。

下表显示了 GE 和 PE 之间的主要区别。

特征团体版专业版
资产是的
活动是的
合同是(使用 Sales Cloud)
预测是(无商机拆分或自定义字段预测)
想法是的
产品是的
解决 方案是的
记录类型是的
权限集是的是的
自定义配置文件是的
自定义报告类型是的
工作流程和审批否(请参阅注释。
顶点代码请参阅注释。请参阅注释。
共享规则是(对于某些功能)
应用程序接口请参阅注释。请参阅注释。
网站

注意

  • 所有列出的功能在 DE 中都可用。
  • 作为合作伙伴,应用程序中的工作流在 Professional Edition 组织中运行。然而 客户无法创建自己的工作流。他们必须直接从以下位置购买该功能 Salesforce的。
  • 客户端 ID 允许您的应用使用 API 与复合应用集成。查看更多 信息,请参阅在 Group Edition 和 Professional Edition 中使用 Apex 和在 Group Edition 和 Professional Edition 中使用 API 访问。

团体版和专业版的限制

所有 Salesforce 版本都有限制,这些限制可以限制的应用程序、对象和选项卡的数量 被使用。有关各种版本限制的详细信息,请参阅版本限制表。

对于已注册 ISV 计划的合作伙伴,任何托管包 在 AppExchange 上公开发布不再计入应用程序/对象/选项卡 Salesforce 版本的限制。这实际上意味着 ISV 合作伙伴不再需要担心软件包安装失败 因为超出了应用程序/对象/选项卡限制。此功能是 应用通过安全审核后自动启用。

群组和专业版的访问控制 版本

Group Edition 不支持字段级安全性或自定义配置文件。您可以管理字段级别 安全性,改用每个对象的页面布局。当客户安装您的应用时, 他们无法定义哪些配置文件有权访问哪些内容。确保您的设计适用于 标准用户配置文件。权限集可以安装,但不能在组和 专业版组织。

由于页面布局处理字段级别安全性,因此请添加要显示的任何字段 页面布局。要通过 API 或 Visualforce 访问字段,请将它们添加到 页面布局。

在 Group Edition 和 Professional Edition 中使用 Apex

你的应用可以包含业务逻辑,例如类、触发器、电子邮件服务等。 顶点。作为一般规则,GE/PE 不支持 Apex,因此它不会在这些 版本。但是,作为 ISV 应用的一部分开发并包含在托管包中的 Apex 可以运行 在 GE/PE 中,即使这些版本默认不支持 Apex。

您必须是 Salesforce 的合格合作伙伴,并且您的应用程序必须通过安全性 回顾。通过安全性后,将自动启用相应的权限 回顾。以下是在 GE/PE 中使用 Apex 的一些重要注意事项。

  • GE/PE 客户无法在您的应用中创建或修改 Apex;他们只能运行 现有的 Apex。
  • 您的 Apex 代码不应依赖于仅存在于 DE、EE、 UE 或 PXE,否则您的应用将无法安装。
  • 如果您计划将 Apex 方法公开为 Web 方法,请确保使用 REST 服务。无法调用已公开为 SOAP Web 服务的 Apex 类 从 GE/PE 中的外部 Web 应用。
  • 在 GE/PE 中允许使用 Apex 进行 Web 服务标注。例如,如果你是 计划对外部 Web 服务进行 Web 服务标注,只要托管 包,这些类将在 GE/PE 中运行。

Group Edition 和 Professional Edition 中的 API 访问

GE 和 PE 组织通常不支持 API 访问。但是,在您的应用通过后 安全审查,你有资格使用一些 API 来构建复合 应用。

  • 目前,GE 和 PE 应用支持标准数据 SOAP 和 REST API,并且 PE 应用支持元数据 API。若要请求 API 访问权限,请参阅如何获取应用的 API 令牌?您也可以联系 Salesforce 将 连接的应用程序,用于在 GE 或 PE 组织中使用 REST API。
  • 其他 API,例如作为 SOAP Web 服务公开的 Bulk API 2.0 和 Apex 方法, 仍然不可用。
  • 您可以使用连接的应用程序使用者允许列表启用基于 REST 的 Web 服务。
  • 您可以使用 API 令牌启用基于 SOAP 的 Web 服务,包括元数据 API 称为客户端 ID。在集成调用中将客户端 ID 追加到 SOAP 标头。这 通过特殊密钥,你的应用可以调用数据 API 的 GE 和 PE 组织,以及 PE 组织的 元数据 API,即使客户没有 API 访问权限。

客户端 ID 具有这些属性。

  • 不能在自定义 JavaScript、S 控件或 应用中任何位置,其价值将向最终客户公开。
  • 出于开发目的,通过 Environment Hub 创建的 GE 和 PE 组织已经具有 启用元数据 API 和 SOAP API(数据 API)。然后,您可以开发和测试您的应用程序 在安全审查之前。在您的应用通过安全审核后,您将获得 API 令牌,请再次测试您的应用以确保其正常工作。
  • 客户端 ID 授予 GE 和 PE 对 SOAP API 的访问权限,以及对元数据 API 的 PE 访问权限。 使用元数据 API,您可以动态创建通常 在设置中创建。例如,您可以在 PE 中动态创建自定义字段 使用 API 令牌的组织。

下表显示了使用 GE 和 PE 时可以访问的 API 以及访问方法。

应用程序接口获得 GE 和 PE
Web 服务 (SOAP)是的,使用令牌
作为 Web 服务 (SOAP) 公开的 Apex 方法
Web 服务 (REST)是,使用互联应用使用者许可名单
作为 Web 服务 (REST) 公开的 Apex 方法是,使用互联应用使用者许可名单
连接 REST API是的
元数据 API是的,使用令牌
批量 API 2.0
数据加载器工具(使用 SOAP Web 服务)否,无法设置令牌
  • 在组版和专业版
    中访问 REST API Lightning 平台 REST API 为您提供了功能强大、方便且简单的 API,用于与 Lightning 平台进行交互。作为合格的合作伙伴,您可以请求我们为您的应用程序启用对 GE 或 PE 组织的 REST API 调用。

将应用设计为支持多个 版本

支持多个版本提供了发布的机会 应用的更丰富版本,可支持更高级的功能 在 EE、UE 和 PXE 中找到。有两种技术可以利用 以支持多个版本。第一种方法使用扩展包 第二个利用 Dynamic Apex。两者都有好处, 因此,在设计应用之前,请务必查看这两种策略。

  • 使用扩展包支持多个版本
  • 使用 Dynamic Apex 支持多个版本

使用扩展包支持多个版本

此方法使用包含核心应用功能的基本托管包。基地 软件包中仅包含 Group Edition 和 Professional Edition 中支持的功能。然后,您使用 第二个托管包或扩展包,用于扩展和增强基本包。 扩展包添加了 Enterprise、Unlimited 和 性能版本。例如,您有一个跟踪库存的仓库应用程序 此应用的扩展包括工作流(在组中不可用)。您的团队 和专业版客户可以安装基本仓库应用程序,而 其他客户使用工作流安装基础包,然后安装扩展包 组件。

使用基础包和扩展包支持多个版本

使用扩展包可以避免多个代码集,并追加销售 客户。升级客户只需要安装扩展包。下面是创建扩展包的过程。

  1. 创建基础管理的软件包,该软件包使用 Group 和 专业版。
  2. 在单独的 Developer Edition 组织中安装基本管理的软件包。
  3. 在此组织中,创建包含更多功能的扩展包 在 Group Edition 和 Professional Edition 中受支持。您可以引用 base 管理的 包以避免重复功能。引用 Base 管理的包会自动触发此包成为扩展 包。

由于扩展包依赖于基础包,因此花费很重要 设计应用和包之间的接口的时间。例如,如果 扩展包调用基础包中的 Apex 类,您必须确保 所需的 Apex 类是全局的。考虑整个应用程序生命周期也很重要。例如,如果 您想要添加新功能,请将它们包含在相应的包中。确保更新 到基础包,不要破坏扩展包。

注意

访问历史记录信息 对于扩展包中的自定义对象,请与基础包所有者合作以启用 在组织中跟踪基础包的历史记录。在基地中启用历史记录跟踪 当您安装软件包并创建补丁组织时,软件包可能会导致错误 扩展包。

使用 Dynamic Apex 支持多个版本

使用动态 Apex、动态 SOQL 和动态 DML,可以创建一个托管 您计划支持的所有版本的包,而无需使用扩展包。你的应用 行为可能会根据客户版本中可用的功能动态更改。这 在设计旨在支持多个版本的应用时很有用。

做 确保包中的 Apex、工作流等不包含任何对 GE/PE 不支持的功能。这可能包括在不受支持的 标准对象,例如 Campaigns,或对多币种等功能进行 Apex 引用 或区域管理。当您引用包中的功能时,不 受 GE/PE 支持,此包依赖将导致安装失败。

相反,如果您使用动态 Apex 首先检查这些功能是否可用 引用它们,您可以在 GE/PE 中安装托管包。要考虑的重要部分 您必须以能够支持这两种用例的方式对 Dynamic Apex 进行编码。这确保了如果 你的客户没有特定的功能或对象,你的应用仍将正常运行。

面向团体和专业人士的示例设计方案 版本

下面是一些方案,可帮助你了解何时以及如何为 Group 和 Professional 进行构建 版本。方案 1:您想要构建使用记录类型的应用程序由于记录类型在 Group Edition 中不可用,因此请决定是否要支持此功能 版。假设您这样做,您可以构建一个不包含记录的基本托管包 类型。将此托管包以已发布状态上传后,可以将其安装到 另一个 Developer Edition 组织开始构建扩展。扩展可以添加记录 Professional、Enterprise、Unlimited 和 Performance Edition 客户可以使用的类型 安装和使用。方案 2:您想要构建一个包含 80 个自定义对象的应用通常,此方案会给组和专业版组织带来问题,因为 的自定义对象限制。但是,如果您使应用程序在 AppExchange 上可用,则 不计入自定义对象、选项卡和应用限制。因此,即使您的应用程序有 80 个自定义 对象,它可以在 Group 和 Professional Edition 组织中安装和工作。场景 3:您想要构建一个向 Web 服务发出 Apex 标注的应用Apex 通常不会在 Group Edition 和 Professional Edition 中运行。如果您得到托管 软件包在安全审查期间授权,您的 Apex 将按预期执行。为此 场景中,您可以构建 Apex 标注以调用外部服务,然后包含以下内容 包中的类。场景 4:您想要构建一个使用 Campaigns 的应用默认情况下,Group Edition 支持广告系列。对于此方案,您有两个 选项。

  • 选项 1 – 构建不引用广告系列的基于托管的包。在它的 完成、上传并安装到另一个 Developer Edition 组织中。建立活动 功能作为扩展包。现在,您的 Group Edition 客户可以安装基础, 而其余的人也可以安装扩展以获得额外的功能。
  • 选项 2 – 如果使用 Dynamic Apex 作为唯一包,则此选项只需要一个包 引用 Campaigns(如前所述),并且不要在 运动。然后,可以将应用安装在 Group Edition 组织及更高版本中。如果广告系列在 您的客户版本,则您的 Dynamic Apex 可以按预期操作广告系列。

场景 5:你想要构建一个复合应用,其中接收入站 API 调用您有一个单独的托管应用程序,要与 Salesforce 集成,因此您必须使 对 Group 和 Professional Edition 客户的 API 调用。默认情况下,此类调用是不可能的。 但是,如果你是符合条件的合作伙伴,请请求允许 SOAP 调用的特殊 API 令牌 与组和专业版组织集成。请务必将客户端 ID 嵌入到 外部代码的 SOAP 标头。

ISVforce 指南:构建和分发 AppExchange 解决 方案

作为独立软件供应商 (ISV) 建立蓬勃发展的 Salesforce 业务。开始者 加入 Salesforce 合作伙伴计划并熟悉对您有用的资源 AppExchange ISV 或咨询之旅。然后,学习计划、构建、分发、销售和支持 AppExchange 市场的解决方案。

  • 发行说明
    使用 Salesforce 发行说明了解 AppExchange 合作伙伴的最新更新和技术更改,包括打包、分析和安全编码工具。
  • 准备在 AppExchange 上分发 在 AppExchange
    上列出解决方案或咨询服务之前,请完成先决条件任务。首先,注册 Salesforce 合作伙伴计划。接下来,确认您有合作伙伴业务组织。然后,熟悉可帮助您高效导航合作伙伴旅程的资源和文档。
  • 使用托管软件包开发 AppExchange 解决方案
    托管软件包是 Salesforce 合作伙伴用来创建业务应用程序并通过 AppExchange 将其应用程序分发给客户的工具。托管软件包提供的功能套件可帮助您分发、许可、试用功能、排除故障并从产品中获利。
  • 设计您的 AppExchange 解决方案 了解影响 AppExchange 解决方案
    设计的体系结构概念和安全要求。
  • 通过 AppExchange 安全审核
    [生效日期:2023 年 8 月 9 日] 在 Salesforce,没有什么比客户的信任更重要。信任需要安全。要在 AppExchange 上分发托管软件包、Salesforce Platform API 解决方案或 Marketing Cloud API 解决方案,它必须通过我们的安全审查。了解如何准备并通过安全审查。
  • 在 AppExchange 上发布解决方案 使用 AppExchange
    合作伙伴控制台创建解决方案列表、启动安全审查、管理许可证设置以及查看列表的 Marketplace Analytics。
  • 使用 Checkout 在 AppExchange 上销售 使用 AppExchange Checkout
    直接从您的列表接受信用卡付款和银行转账。使用结账管理应用程序将您的销售和收入数据转化为见解和操作。
  • 使用 Analytics for AppExchange 合作伙伴
    监控性能 了解客户如何在 Marketplace Analytics 仪表板中找到您的 AppExchange 列表并与之交互。通过浏览 App Analytics 数据,了解订阅者如何使用您的套餐。
  • 使用 Channel Order App 向 Salesforce 报告订单 使用 Channel Order App
    (COA) 创建、管理订单并将其提交到 Salesforce。如果您是 OEM 合作伙伴,则可以使用 COA 来预配 Salesforce 许可证和收入分成。如果你是 ISV 合作伙伴,则可以使用 COA 进行收入分成。如果您使用 AppExchange Checkout 管理客户付款,请不要使用 COA。当客户购买您的 AppExchange 解决方案时,使用 Checkout 的合作伙伴的收入会自动报告给 Salesforce。
  • 提供 AppExchange 解决方案的免费试用 通过提供 AppExchange 解决方案
    的免费试用,提高客户转化率。探索试用选项,并确定解决方案的最佳类型。
  • OEM 用户许可证指南
    了解 OEM 合作伙伴可用的许可证类型。

准备好在 AppExchange 上分发

在 AppExchange 上列出解决方案或咨询服务之前,请完成 先决条件任务。首先,注册 Salesforce 合作伙伴计划。接下来,验证您是否 拥有合作伙伴业务组织。然后,熟悉可以 帮助您高效地驾驭合作伙伴之旅。

  • 加入 Salesforce 合作伙伴社区
    AppExchange 解决方案和咨询服务由 Salesforce 官方合作伙伴构建。要开始您的合作之旅,请加入 Salesforce 合作伙伴社区。
  • 验证对 Salesforce 合作伙伴业务组织的
    访问权限 作为 Salesforce 合作伙伴,您有资格加入合作伙伴业务组织 (PBO)。您的 PBO 包含用于设置和管理 AppExchange ISV 业务或咨询实践的工具。在开始构建解决方案或实践之前,请验证是否可以访问 PBO。
  • 申请 Salesforce 合作伙伴业务组织 如果您在加入 Salesforce 合作伙伴社区时未收到合作伙伴业务组织
    (PBO),请记录案例以请求。如果您在加入合作伙伴社区时创建了单独的用户名,请跳过此步骤。加入时,已自动预配 PBO。
  • 浏览面向 Salesforce 合作伙伴的学习资源 借助来自 Trailhead、合作伙伴社区等的精选资源,更快地实现 Salesforce 合作伙伴
    旅程中的里程碑并实现目标。

加入 Salesforce 合作伙伴社区

AppExchange 解决方案和咨询服务由 Salesforce 官方合作伙伴构建。 要开始您的合作之旅,请加入 Salesforce 合作伙伴社区。

您的业务目标决定了我们与您合作的方式。加入 Salesforce 合作伙伴之前 社区,了解 AppExchange ISV 和咨询合作伙伴关系。

提示

我们建议您为合作伙伴社区创建一个单独的用户名,甚至 如果您有现有的 Salesforce 用户名。通过这种方法,您可以立即访问您的 合作伙伴业务组织 (PBO),其中包含用于设置和管理 商。

  1. 转到 Salesforce 合作伙伴社区。
  2. 单击“成为合作伙伴”。
  3. 单击“继续”进行注册
  4. 单击加入合作伙伴社区
  5. 单击“获取 Salesforce 用户名”,然后填写所需的 领域。
  6. 单击创建用户名。我们会发送一封确认电子邮件,要求您验证您的帐户并设置 密码。
  7. 为您的帐户设置密码,然后单击“我有我的 Salesforce 用户名 – 加入合作伙伴社区。
  8. 登录到合作伙伴社区,然后完成剩余的设置任务。

验证对 Salesforce 合作伙伴业务组织的访问权限

作为 Salesforce 合作伙伴,您有资格加入合作伙伴业务组织 (PBO)。您的 PBO 包含用于设置和管理 AppExchange ISV 业务或咨询实践的工具。 在开始构建解决方案或实践之前,请验证是否可以访问 PBO。

  1. 登录 Salesforce,使用您在加入合作伙伴时创建的用户名和密码 社区。
  2. 单击应用程序启动器。
  3. 在“快速查找”框中,输入“Environment Hub”,然后单击“Environment Hub”。
  4. 如果重定向到 Environment Hub 应用,则表示你验证了 PBO 访问权限。如果 Environment Hub 应用程序在“快速查找”框中不可用,请在 Salesforce 帮助上记录案例以请求 PBO。

若要了解有关 PBO 的详细信息,请注册“了解合作伙伴业务组织” (PBO)Salesforce 合作伙伴学习营中的工具(需要登录)。

申请 Salesforce 合作伙伴业务组织

如果您在加入 Salesforce 时未收到合作伙伴业务组织 (PBO) 合作伙伴社区,记录案例以请求案例。如果您在加入时创建了单独的用户名 合作伙伴社区,请跳过此步骤。PBO 是自动预配的,当你 加入。

  1. 使用您注册 Salesforce 合作伙伴时所用的用户名登录 Salesforce 帮助 社区。
  2. 单击帐户切换器,并验证是否已选择您的合作伙伴帐户。
  3. 单击“联系支持人员”。
  4. 单击“创建案例”,然后填写必填字段。
    1. 对于主题,输入请求合作伙伴业务组织 (PBO)。
    2. 对于描述,请注意您是 Salesforce 合作伙伴,并且您正在请求 PBO。
    3. 当系统提示您选择产品时,单击“选择其他产品/” 主题
    4. 对于“产品”,选择“合作伙伴计划和权益”。
    5. 对于“主题”,选择“演示和合作伙伴业务组织”。
    6. 选择实例类型和严重性级别。
  5. 单击“创建案例”。

我们会审核案例,并与您联系以告知后续步骤。

浏览面向 Salesforce 合作伙伴的学习资源

借助 Salesforce 合作伙伴之旅,更快地达到里程碑并实现目标 来自 Trailhead、合作伙伴社区等的精选资源。

我想:推荐的资源
了解构建 AppExchange ISV 的基础知识 商。Trailhead:将您的业务发展为 AppExchange 合作伙伴
了解构建 Salesforce 咨询的基础知识 实践。Trailhead:将您的实践构建为 咨询合作伙伴
使用 AppExchange ISV 工具进行动手实践,并 技术,例如第二代托管包。Trailhead:将应用程序构建为 AppExchange 伙伴
了解构建安全的工具和最佳实践 解决 方案。Salesforce 开发人员:安全开发人员 中心
当我遇到困难时提出问题并获得帮助Salesforce 合作伙伴社区:问答社区 群
随时了解 Salesforce 合作伙伴的更改和更新 程序Salesforce 合作伙伴社区:官方:AppExchange 合作伙伴计划 社区组

使用托管包开发 AppExchange 解决方案

托管软件包是 Salesforce 合作伙伴用于创建业务应用程序的工具,以及 通过 AppExchange 将其应用程序分发给客户。托管提供的功能套件 软件包可帮助你分发、许可、试用功能、对产品进行故障排除以及从中获利。

程序包是您计划销售并分发给 Salesforce 的应用程序的容器 客户。创建一个包,然后添加包含的功能、自定义项和架构 你的应用。可以打包的元数据组件示例包括:

  • Apex 类和触发器
  • 标准对象上的自定义字段
  • 自定义元数据类型
  • 自定义对象
  • 闪电页面
  • 页面布局

您的包可以包含许多不同的元数据组件,也可以打包单个 组件,例如流。

Salesforce 提供第二代托管打包(托管 2GP)和第一代 托管打包(托管 1GP)。展望未来,我们建议每个人都使用托管 2GP 来 创建新应用。有关使用第二代托管打包的优势的详细信息,请参阅为什么要切换到第二代托管打包 包装?

设计您的 AppExchange 解决方案

了解影响 AppExchange 的架构概念和安全要求 解决方案设计。

注意

构建新应用?您是否考虑过使用第二代 托管软件包?灵活的版本控制和跨包共享命名空间的能力是 开发人员喜欢创建第二代托管包的两个原因。我们认为你会 也喜欢它。若要了解详细信息,请参阅:为什么要切换到第二代托管 封装以及第一代和第二代的比较 托管包。

  • AppExchange 合作伙伴和解决方案
    的安全要求 [生效日期:2023 年 8 月 9 日] 作为 Salesforce 合作伙伴,您负责实施和维护全面的安全计划,并维护您在 AppExchange 上列出或根据 AppExchange 合作伙伴计划分发的所有应用程序的安全性。
  • 组版和专业版的体系结构注意事项

AppExchange 合作伙伴和解决方案的安全要求

【生效日期:2023年8月9日】作为 Salesforce 合作伙伴,您负责 实施和维护全面的安全计划,并维护 您在 AppExchange 上列出或在 AppExchange 合作伙伴下分发的所有应用程序 程序。

注意

AppExchange 合作伙伴和解决方案的这些安全要求(以下简称“要求”)是 截至所列生效日期为止,并一直有效,直到或除非它们 在此相同或重定向的 URL 上被生效日期较晚的版本取代。SFDC可以 不时自行决定更新或修改这些要求,无论是否 通知。这些要求受 AppExchange 合作伙伴计划的约束,并成为 AppExchange 合作伙伴计划的一部分 政策和 Salesforce 合作伙伴计划协议 (“SPPA”),见 https://www.salesforce.com/company/legal/agreements/。本要求中未定义的大写术语具有以下含义 在SPPA中给予他们。

重要

合作伙伴应用程序,包括托管软件包、Salesforce Platform API 解决方案、Marketing Cloud API 解决方案以及本文提及的其他解决方案, 是 Salesforce 主要服务协议中定义的非 SFDC 应用程序(可在 https://www.salesforce.com/company/legal/agreements 或后续 URL)。尽管有 对合作伙伴应用程序进行安全审查时,Salesforce 不保证其质量 或任何合作伙伴应用程序的安全性,客户有责任评估 合作伙伴应用程序的质量、安全性和功能。

作为参与 AppExchange 合作伙伴计划的条件,您必须遵守 本文档中概述的安全要求。这些要求包括一般 适用于所有 AppExchange 合作伙伴和合作伙伴应用程序的要求,以及其他要求 特定于使用特定 或与特定 技术或旨在用于特定行业。在这些要求中,合作伙伴 应用程序也称为“解决方案”。创建或编辑 AppExchange 时 发布时,您需要确认自己符合这些要求。

本文档中的安全要求并不详尽。我们鼓励合作伙伴 遵循所有适用的行业安全标准。

一般 AppExchange 要求

  1. 所有合作伙伴都必须遵守安全策略中所述的要求 要求。
  2. 所有合作伙伴应用程序都必须符合防止安全编码冲突中所述的要求。
  3. 所有合作伙伴应用程序都必须通过 Salesforce 安全审查和评估,其中 根据 AppExchange 合作伙伴计划政策的要求。

B2C 商务解决方案安全要求

如果您的合作伙伴应用程序是 B2C Commerce Cartridge 或 Headless Integration,则必须 此外,请遵循保护您的 B2C 商务解决方案中所述的要求。这些 B2C Commerce 特定要求是另外的 到一般 AppExchange 要求。

Tableau Accelerator 安全要求

如果您的合作伙伴应用程序是 Tableau 加速器,您还必须遵循这些要求 在保护您的 Tableau 加速器中进行了介绍。这些 Tableau 特定要求 是对一般 AppExchange 要求的补充。

  • 安全策略要求 要求
    :在 AppExchange 上列出解决方案之前,您必须有一个安全计划来证明贵公司对安全的承诺。此外,为了帮助客户评估解决方案的质量,必须与他们共享计划信息。
  • 防止安全编码违规
    AppExchange 上列出的所有解决方案都必须遵守这些 AppExchange 安全要求。了解哪些违规行为最有可能出现在 AppExchange 解决方案中,它们为什么会带来安全风险,以及如何创建有助于避免这些风险的解决方案。
  • 保护您的 B2C 商务解决方案
    AppExchange 上列出的所有 B2C Commerce Cartridge 和 Headless 集成都必须遵守这些要求。
  • 保护您的 Tableau 加速器 AppExchange 上列出的
    所有 Tableau 加速器都必须遵守这些要求。

安全策略要求

要求:在 AppExchange 上列出解决方案之前,必须具有安全性 证明贵公司对安全的承诺的计划。另外,为了帮助客户 评估解决方案的质量,您必须与他们共享您的计划信息。

建议:我们建议在程序中包含这些元素。

指定安全专家

集成安全性后,可以更轻松地保护解决方案免受安全威胁 考虑进入开发的各个阶段。确保您的 解决方案遵循安全准则,即为您的开发指定一名安全专家 团队。让您的整个开发团队与安全专家协作完成所有工作 开发阶段:设计、实现和测试。推迟安检 在开发的最后阶段之前的注意事项会增加您的团队的可能性 在不知不觉中传播安全违规行为。定期协作可防止 不必要地积累安全违规行为,并有助于避免准备 成功提交 AppExchange 安全审查。

实施安全策略

制定企业安全策略,详细说明贵公司如何保护客户资产, 例如用户数据。告知客户他们可以采取哪些活动来帮助确保 从头到尾的解决方案。

列出服务和项目

列出解决方案中包含的服务和项目,例如 Web 和移动解决方案。 Web 服务、API 和 SDK。

清点第三方库

保留第三方库和 正确操作的解决方案。

创建架构图

提供显示数据接触点、信息流、 身份验证、授权和其他安全控制。

列出认证

共享所有适用的认证报告,例如:

  • HIPAA:健康保险流通与责任法案
  • PCI DSS:支付卡行业数据安全标准
  • SOC 2:系统和组织控制 管理客户数据的 2 个标准
  • ISO27001:信息安全管理

获取第三方审核

让独立的第三方进行安全审计。与您的分享摘要 客户。

文档安全保证活动

记录公司级别的安全保障活动,包括:

  • 软件开发生命周期 (SDLC) 方法
  • 漏洞管理
  • 修正服务级别协议 (SLA)
  • 供应商和依赖安全计划
  • 安全意识培训
  • 安全漏洞响应程序

列出敏感数据

列出解决方案处理或存储的所有敏感数据,例如付款方式 数据、个人数据和健康数据。

披露数据存储位置和提供商

如果解决方案存储或处理受管制的数据,例如个人身份数据 和健康数据,披露数据存储位置列表。确定国家/地区和提供商 例如 Amazon Web Services (AWS)、Azure 和 Google Cloud Platform (GCP)。

识别第三方数据共享

提供您与之共享客户数据的第三方供应商列表。

分享联系方式

发布联系信息,以便客户轻松获得支持和报告 安全事件。

防止安全编码违规

AppExchange 上列出的所有解决方案都必须遵守这些 AppExchange 安全性 要求。了解哪些违规行为最有可能出现在 AppExchange 解决方案中,以及为什么会出现这些违规行为 构成安全风险,以及如何创建有助于避免这些风险的解决方案。

  • 从第三方终结点
    加载 JavaScript 文件 避免从内容分发网络 (CDN) 动态加载第三方 JavaScript 文件。相反,请从包的静态资源文件夹中加载代码。
  • 在 Lightning 组件
    中加载第三方 CSS 包括级联样式表 (CSS) 和其他静态资源中的资源,而不是从第三方加载。
  • 使用 CSS 外部组件
    Salesforce Platform 试图确保每个命名空间都是一个隔离的沙盒,但不能始终保证隔离。如果发生命名空间隔离漏洞,一个组件可能会窃取另一个组件的点击,或以其他方式干扰另一个组件的预期用途。为了防止这种类型的滥用,请不要使用已知与组件中的样式隔离不兼容的 CSS 指令。
  • 在 Salesforce 域
    中运行 JavaScript 来自多个供应商的 JavaScript 代码可以在同一源中运行。为了防止代码干扰,供应商的 JavaScript 代码被沙盒化。不要尝试跳出沙盒或在源之外运行代码。使用 Visualforce、Aura 或 Lightning Web 组件,它们在正确的源中运行。
  • 调试
    时暴露机密数据 在生产环境中,使用 debug 语句记录机密数据是一个安全漏洞。不要在生产环境中记录机密数据、敏感信息、密码、密钥或堆栈跟踪。编辑数据或从日志中省略数据。
  • 不安全地存储敏感数据 当您从 Salesforce Platform 导出数据以及在平台中存储机密数据时,
    请遵循企业安全标准。
  • 使用具有已知漏洞的软件
    使用记录了与您的用例相关的常见漏洞和暴露 (CVE) 的软件是一个安全漏洞。如果您的解决方案存在已知漏洞,请在安全补丁可用时立即对其进行测试和部署。如果您的解决方案使用的软件具有与您的用例无关的 CVE 记录的漏洞,请准备误报文档。
  • 在生产环境中
    使用示例代码 仅将示例代码用作准备开发自己的应用程序的教育工具。构建生产代码时,请始终自己编写代码。避免从不直接控制的源复制代码。
  • 绕过对象级和字段级访问设置 设计解决方案以在标准和自定义对象上强制执行组织的创建、读取、更新和删除 (CRUD) 和字段级安全性 (FLS) 设置
  • 绕过 Apex 中的共享规则 在 Apex
    代码中尊重基于配置文件的权限、字段级安全性、共享规则和组织范围的默认值。
  • 由于数据库查询构造不安全导致的 SOQL 注入 要防止 Salesforce 对象查询语言 (SOQL) 注入,请使用绑定变量和输入卫生。
  • 跨站点请求伪造 跨站点请求伪造
    (CSRF) 是一种攻击,它迫使最终用户在其经过身份验证的 Web 应用程序会话期间执行不需要的操作。要防止 CSRF,请使用 或通过用户操作触发状态更改。confirmationTokenRequired
  • 打开重定向 当应用程序在未经任何验证的情况下动态重定向
    到用户控制的参数值时,就会发生打开重定向。使用硬编码重定向来防止打开重定向。
  • Lightning LockerService 已禁用
    Lightning LockerService 是 Lightning 代码的一项关键安全功能。它提供组件隔离,允许来自多个来源的代码使用安全、标准的 API 和事件机制执行和交互。为包含 Lightning 组件或应用程序的 AppExchange 软件包启用 Lightning Locker。
  • Lightning 组件中的转义不足 捆绑包中的每个组件都负责清理父组件
    、应用程序或 URL 参数提供给它的输入。
  • 组件
    中的异步代码 黑客可以操纵异步代码的时序来产生恶意结果。若要保留当前执行上下文,请将异步函数调用或批处理操作包装到单个请求中。
  • 安全通信
    确保只能通过安全连接(如 SFTP 和 HTTPS)访问解决方案。避免使用 HTTP 和 FTP,因为这些协议不会加密通过 Internet 传输的信息。

从第三方端点加载 JavaScript 文件

避免从内容分发网络动态加载第三方 JavaScript 文件 (CDN)。相反,请从包的静态资源文件夹中加载代码。从 CDN 或其他第三方动态加载第三方 JavaScript 文件不是 允许有两个原因。

  • 必须使用包版本 ID 对整个解决方案进行版本控制,以便有一个 定义明确的产品以供审查和跟踪。如果解决方案从 第三方终结点,外部托管代码可以在没有包的情况下进行更改 版本 ID 更改。管理员和 Salesforce 安全审查团队不是 意识到了这一变化。Salesforce 无法确保第三方代码继续 防范最新的安全漏洞。确保代码是 受制于包版本控制,从静态动态加载代码 resources 文件夹。如果不更改 软件包版本 ID。另外,版本 ID 更改会向管理员发出信号,并且 AppExchange 安全团队认为代码已更改。
  • 从第三方终结点动态加载代码可授予该终结点功能 将代码注入到安装软件包的任何 Salesforce 组织中。只 从 Salesforce 批准的 CDN 动态加载代码,由 Salesforce 管理代码, 而不是合作伙伴。

概括地说,解决方案是:

  1. 将第三方 JavaScript 文件保存在静态资源中。
  2. 将资源添加到解决方案包中。
  3. 从 URL 加载每个 JavaScript 文件。$Resource

Visualforce 示例

这些代码片段描述了安全违规以及如何在 Apex 和 for 中修复它 Aura 中的闪电组件。此 Visualforce 代码不安全,因为加载了 jQuery 来自第三方来源。

<apex:includescript value="https://code.jquery.com/jquery-3.2.1.min.js"/>

此 Visualforce 代码是安全的,因为它从静态加载 jQuery 的一个版本 resources 文件夹。

$Resource

<apex:includeScript value="{! $Resource.jQuery }"/>

光环示例

此 Aura 组件代码不安全,因为 jQuery 直接从第三方加载 源。

<aura:component>
   <ltng:require afterScriptsLoaded="{!c.initializeUI}"
   scripts="https://code.jquery.com/jquery-2.2.0.min.js”/>
<aura:component>

此 Aura 组件代码是安全的,因为 jQuery 是从解决方案包加载的,并且 使用 URL 作为静态资源引用。$Resource

<aura:component>
   <ltng:require afterScriptsLoaded="{!c.initializeUI}"
   scripts="{!$Resource.jsLibraries + '/jsLibOne.js'}"/>
<aura:component>

在 Lightning 组件中加载第三方 CSS

将级联样式表 (CSS) 和其他资源包含在静态资源中 而不是从第三方加载。

强制执行此要求的原因与从第三方终结点加载 JavaScript 文件中概述的原因相同。整个 解决方案必须受版本控制,并且组织管理员和 Salesforce 安全性 审核团队必须了解这一变化。

使用标签加载外部 CSS 资源违反了此安全策略。<link>概括地说,解决方案是:

  1. 将第三方 CSS 文件保存在静态资源中。
  2. 将资源添加到解决方案包中。
  3. 使用标签引用 CSS 在 .cmp 或 .app 标记中。<ltng:require>

有关更多信息,请参阅在 Lightning Aura 组件开发人员指南。

光环示例

这些代码片段描述了安全违规以及如何在 Lightning 中修复它 Aura 中的组件。此 Aura 组件代码不安全,因为它使用标签来加载外部 CSS 资源。

<link>

<aura:component>
     <link rel="stylesheet" href="https://example.com/styles.css" type="text/css">
<aura:component>

此 Aura 组件代码使用 ,其中 是引用作为静态上传的外部 CSS 资源的更安全方法 资源。

<ltng:require>

<aura:component>
    <ltng:require styles="{!$Resource.SLDSv1 + '/assets/styles/lightning-design-system-ltng.css'}" />
</aura:component>

使用 CSS 外部组件

Salesforce Platform 尝试确保每个命名空间都是一个隔离的沙盒,但 隔离并不总是得到保证。在发生命名空间隔离漏洞时,一个组件 可以从另一个组件窃取点击,或以其他方式干扰另一个组件的 有可能的用途。为了防止这种类型的滥用,不要使用已知不兼容的CSS指令 在组件中实现样式隔离。

CSS 示例

此 CSS 代码容易受到攻击,因为它使用不兼容的绝对定位 有风格 隔离。

#some_element {
   position: absolute;
   right: 80px;
   top: 160px;
}

此 CSS 代码通过使用相对 定位。

#some_element_revised {
   position: relative;
   right: 80px;
   top: 160px;
}

有关详细信息,请参阅组件中的 CSS 提示 Lightning Aura 组件开发人员指南。

在 Salesforce 域中运行 JavaScript

来自多个供应商的 JavaScript 代码可以在同一源中运行。防止代码 干扰,供应商 JavaScript 代码是沙盒的。不要试图冲出沙盒或 在源外部运行代码。使用 Visualforce、Aura 或 Lightning Web 组件,它们在 正确的来源。

许多不同类型的 JavaScript 代码在 Salesforce 组织中运行,包括未打包的 客户代码、Salesforce 代码和打包代码。通常,代码来自多个 无法相互协作的供应商。如果他们的代码运行在同一个 来源,来自一个供应商的代码可能会干扰其他供应商的代码。

为了防止代码干扰,供应商的 JavaScript 代码被沙盒化。使用 Visualforce 解决方案中,JavaScript 代码在特定于供应商的唯一来源中进行沙盒化。使用闪电 解决方案和 Lightning Web 组件 (LWC),JavaScript 被沙盒化为独特的, 特定于供应商的储物柜。

任何试图突破沙盒并在源之外运行代码的尝试都是一种安全编码 违反。安全编码冲突包括尝试运行供应商编写的 JavaScript 代码 在 Salesforce 源中通过主页组件、Web 链接或自定义按钮。

在大多数情况下,您可以使用 Visualforce、Aura 或 Lightning Web 组件,在正确的源中运行。

元数据示例

此示例中的元数据表示自定义对象。此自定义中的 Web 链接 对象是使用语句定义的。在一个 托管包,使用是一种安全性 漏洞,因为供应商正在将其代码注入 Salesforce 源。管理 包必须保留在其命名空间沙箱中,并且不能在此沙箱之外执行脚本 沙盒。

REQUIRESCRIPTREQUIRESCRIPT

<?xml version=”1.0”encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
<actionOverrides>
<actionName>Accept</actionName>
      <type>Default</type>
</actionOverrides>
<webLinks>
     <fullName>Add_to_List</fullName>
     <openType>onClickJavaScript</openType>
     <url>{!REQUIRESCRIPT(&quot;/soap/ajax/30.0/connection.js&quot;)}</url>
</webLinks>
...
</CustomObject>

与其将代码直接嵌入到对象中,不如在 Visualforce Aura 组件,或使用 Lightning Web 组件。

调试时公开机密数据

在生产环境中,使用 debug 语句记录机密数据是一种安全性 脆弱性。不要在 生产环境。编辑数据或从日志中省略数据。

使用 debug 语句泄露机密数据会使 Salesforce 组织管理员感到困难 来控制对数据的访问。通常,允许查看日志的配置文件不是 允许查看机密的相同配置文件。

Apex 示例

在此 Apex 代码中,是一个 写入调试日志的加密密钥。若要避免此漏洞,请从生产中删除该语句 法典。

authenticationTokensystem.debug

if (varCount > 0){
   sensitiveUserData = JSON.serialize(AssignUsrs);
   ReqSignature = RequestWrapper.generateHmacSHA256Signature(sensitiveUserData, authenticationToken);
   system.debug('Token--->'+authenticationToken);
}

不安全地存储敏感数据

从 Salesforce Platform 导出数据时遵循企业安全标准 以及当您在平台中存储机密数据时。

不安全的敏感数据存储为黑客提供了许多构成威胁的途径。为 例如,组织管理员是唯一应该知道 API 密钥的人。 黑客可以使用公开的密钥通过管理通道将数据传送到远程 端点。

Salesforce 会认真对待源自解决方案的数据威胁。数据泄露 或因解决方案中的漏洞而造成的损失危及您与 Salesforce的。在以下情况下,请遵循存储敏感数据中的企业标准:

  • 从 Salesforce 平台导出客户数据。
  • 将加密密钥、会话 ID 或密码等密钥存储在 Salesforce平台。

元数据示例

此示例中的元数据表示自定义对象。此自定义对象定义 不安全,因为 API 的标记 key 字段设置为 。该字段可以在 平原 发短信。

<visibility>Public

<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
   <fields>
        <fullName>apiKey__c</fullName>
        <externalId>false</externalId>
        <fieldManageability>DeveloperControlled</fieldManageability>
        <label>apiKey</label>
        <length>50</length>
        <required>false</required>
        <type>Text</type>
        <unique>false</unique>
   </fields>
   <label>Phone Verify Setting</label>
   <pluralLabel>Phone Verify Settings</pluralLabel>
   <visibility>Public</visibility>
</CustomObject>

将密钥存储在自定义对象(如 API 密钥)中时,请对其进行加密。存储 加密密钥分别在受保护的自定义设置或受保护的自定义元数据 API 中 田。

使用具有已知漏洞的软件

使用记录了常见漏洞和暴露 (CVE) 相关漏洞的软件 您的用例是一个安全漏洞。如果解决方案存在已知漏洞,请进行测试 并在安全补丁可用时立即部署它们。如果您的解决方案使用以下软件: 具有 CVE 记录的与您的用例无关的漏洞,请准备误报 文档。

黑客可以快速攻击已披露的软件漏洞。大多数供应商提供 针对其软件中发现的漏洞进行修补或更新。要了解您的 解决方案使用具有已知漏洞的软件,请检查常见漏洞和披露 (CVE) 数据库。

应用与解决方案用例相关的所有修补程序或更新。如果漏洞 与您的使用案例无关,并且您正在为 AppExchange 准备解决方案 安全审查,将其记录为误报。解释为什么它对你的解决方案是安全的 以使用易受攻击的软件。我们的安全审查团队在做出决定时会使用此信息 是否批准在解决方案中使用该软件。有关详细信息,请参阅误报。

在生产环境中使用示例代码

仅使用示例代码作为教育工具,为开发自己的代码做准备 应用。构建生产代码时,请始终自己编写代码。避免复制 来自您不直接控制的来源的代码。

互联网上的开发人员可以使用很棒的示例代码。虽然在 学习最佳实践或新技术,不要直接在 生产包。直接重用可能会在许多包中传播漏洞, 无论示例代码作者是否有意为之。

绕过对象级和字段级访问设置

设计解决方案以强制执行组织的创建、读取、更新和删除 (CRUD) 和 标准对象和自定义对象上的字段级安全性 (FLS) 设置。

在 Salesforce Platform 上,您可以在配置文件和 权限集。CRUD 设置确定用户可以访问哪些对象。FLS 确定 用户可以访问哪些对象字段。使用 CRUD 和 FLS 限制对标准和 自定义对象和单个字段。

客户希望你的解决方案不会违反他们在 组织。设计解决方案,以在标准和 自定义对象。此外,请确保您的解决方案能够正常处理用户 访问受到限制。在某些用例中,绕过 CRUD 和 FLS 是可以接受的,例如在以下情况下:

  • 创建不直接公开数据的汇总摘要或聚合。
  • 修改自定义对象或字段,例如日志或系统元数据,以便它们 用户无法通过 CRUD 或 FLS 直接访问。
  • 从高特权方法访问对象,非管理员用户无法访问的方法 访问。
  • 当您的解决方案是社区或 网站。
  • 使用自定义安全策略访问属于命名空间的自定义对象。 在这种情况下,请将策略记录为 AppExchange 安全审查的一部分 提交。

若要了解有关 CRUD 和 FLS 强制执行的详细信息,请查看安全服务器端开发 模块。若要检测代码中的 CRUD/FLS 冲突,请考虑使用 代码扫描器,如 Salesforce Code Analyzer 的 Salesforce Graph Engine。

Apex 示例

在此 Apex 代码中,数据 操作语言 (DML) 语句在不检查用户是否具有创建访问权限的情况下运行 Account 对象的权限。该代码不会强制执行组织的访问权限 设置。

insert account

public static Account createIndividualModalData(String name, String email, String mobile) {
   RecordType recordType = [Select Id from RecordType where DeveloperName = 'IndustriesIndividual' and SobjectType = Account'];
   Account account = new Account();
   account.Name = name;

   if(recordType != null) account.RecordTypeId = recordType.id;
   insert account;
    ...
}

此 Apex 代码更安全,因为它强制执行组织的访问设置。它在执行 DML 语句之前调用该方法。如果返回 true,则用户具有创建访问权限 Account 对象的权限,并执行语句。否则,访问不足错误是 报道。

isCreatable()insert accountisCreatable()insert account

public static Account createIndividualModalData(String name, String email, String mobile) {
   RecordType recordType = [Select Id from RecordType where DeveloperName = 'IndustriesIndividual' and SobjectType = 'Account'];
   Account account = new Account();
   account.Name = name;

   if(recordType != null) account.RecordTypeId = recordType.id;

   if (Schema.sObjectType.Account.isCreateable()) {
      insert account;
   } else {
      ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,'Error: Insufficient Access'));
   }
   ...
}

绕过 Apex 中的共享规则

尊重基于配置文件的权限、字段级安全性、共享规则和组织范围 默认值。

Salesforce Platform 广泛使用数据共享规则。每个对象可以有 指示哪些用户和配置文件可以读取、创建、编辑和删除的唯一权限 该对象类型的记录。当您的代码使用标准 控制器。

但是,自定义 Apex 类或 Visualforce 页面本质上并不遵循内置 配置文件权限、字段级安全限制或共享规则。默认情况下,一个 Apex 类可以读取和更新组织内的所有数据。

在 Apex 代码中,不要公开对用户隐藏的敏感数据。尊 基于配置文件的权限、字段级安全性、共享规则和组织范围的默认值。请遵循以下一般规则,以正确强制执行共享。

  • 在所有全局类上声明,或者 包含方法的类。 不要省略共享声明,也不要在解决方案的这些入口点上使用。with sharing@NamespaceAccessiblewithout sharing
  • 对于非全局或标记的控制器类,请将该类声明为 或 。不要省略共享声明,也不要在这些入口点上使用 溶液。@NamespaceAccessiblewith inherited sharingwith sharingwithout sharing
  • 将直接执行数据访问操作的所有类声明为 。如果解决方案中没有标记 的类,则也可以使用。with sharingwithout sharingwith inherited sharing

但是,也有一些值得注意的例外。在以下情况下,请勿遵循一般规则:

  • 你正在构建网站或社区,并希望拒绝来宾用户访问数据。
  • 您正在访问属于您的命名空间的自定义对象,并具有定制的安全性 政策。在这种情况下,请将策略记录为 AppExchange 安全审查的一部分 提交文件。此例外不适用于标准对象。组织管理员 独资拥有标准对象的安全策略。

Apex 示例

在此 Apex 代码中,关键字不是 添加到类头。默认情况下,共享规则不是 执行。

with sharing

public class maincontroller {
   @AuraEnabled public static String saveJobApplication(String vacId, String userId) {
      ...
   }
}

在此 Apex 代码中,关键字是 使用。强制执行共享规则。with sharing

public with sharing class maincontroller {
   @AuraEnabled public static String saveJobApplication(String vacId, String userId) {
       ...
   }
}

若要了解有关共享规则实施的详细信息,请查看安全服务器端开发 模块。

由于数据库查询构造不安全导致的 SOQL 注入

要防止 Salesforce 对象查询语言 (SOQL) 注入,请使用绑定变量和 输入卫生。

SOQL 注入是一种漏洞,用户直接控制 SOQL 的某些部分 数据库查询。在 Apex 中执行的 SOQL 查询不尊重用户权限。因此 SOQL 注入可用于提升用户的权限并允许他们访问数据 超出其用户权限。

两种类型的 SOQL 注入漏洞需要不同的保护 方法。

在第一种类型中,用户提供了不正确的表或字段名称进行查询。 当用户数据标识字段或表名称时,必须验证用户是否具有 访问命名表或字段的权限。请记住,此类型不是引用的 上下文。

在第二种类型中,用户提供带引号的 WHERE 子句的一部分。当用户数据 插入到带引号的字符串上下文中时,数据可以脱离带引号的上下文。这 首选的保护方法是使用绑定变量。或者,您可以使用 .这两种方法都会阻止用户 从引用的上下文中突破出来的数据。EscapeSingleQuotes()

永远不要允许用户提供除字段名称、表名称、 和 WHERE 子句输入。

避免在 Apex 中执行用户生成的查询,在 Apex 中,这些查询在系统模式下运行。如果必须 生成更复杂的客户端 SOQL,使用 REST 或 SOAP API,进行 SOQL 调用 牢牢。

要了解有关 SOQL 注入以及如何在代码中防止 SOQL 注入的更多信息,请查看安全服务器端开发 模块。

SOQL 示例

此 SOQL 语句是不安全的,因为它是通过将字符串与嵌入式连接起来构建的 用户输入。语句之前不进行输入审查 执行。

database.query

string objType = id.valueOf(deduped[0].recordId).getSObjectType().getDescribe().getName();
string soql = 'select id, ' + string.join(fields, ', ') + ' from ' +    objType +' where id in: lrIDs';
list<sobject> records = database.query(soql);

如果必须使用动态 SOQL,请使用该方法清理用户提供的输入。此方法添加 用户提供的字符串中所有单引号的转义字符 (\)。添加 转义字符可确保将所有单引号视为封闭式 字符串而不是数据库 命令。

EscapeSingleQuotes()

string objType = escapeSingleQuotes(id.valueOf(deduped[0].recordId).getSObjectType().getDescribe().getName());
string soql = 'select id, ' + string.join(fields, ', ') + ' from ' +    objType +' where id in: lrIDs';
list<sobject> records = database.query(soql);

跨站点请求伪造

跨站点请求伪造 (CSRF) 是一种强制最终用户执行 在经过身份验证的 Web 应用程序会话期间执行不需要的操作。为了防止 CSRF, 使用 或触发状态更改 与用户操作。

confirmationTokenRequired

在 Salesforce Platform 上发出的所有表单请求都受到保护。插入、删除、更新、 由用户操作(如按钮单击)触发的更新插入状态更改操作是 也受到保护。但是,页面上触发的状态更改或数据操作语言 (DML) 操作 实例化在页面的其余部分加载之前执行,它们绕过平台的 默认 CSRF 保护。类构造函数中的状态更改和 DML 操作是 如果它们由以下原因触发,则容易受到攻击:

  • Visualforce 页面
  • Lightning Web 组件 (LWC)
  • 光环
  • 从 Visualforce 页面的 action 参数调用的任何方法

Apex 示例

此 Visualforce 页面容易受到 CSRF 的攻击,因为该操作是在页面上触发的 初始化。

!init

<apex:page controller="maincontroller" action="{!init}">

public pageReference init(){

   UserSetting__c accountToUpdate;
   pageReference p = page.mainview;
   // Retrieve the password and redirect query string parameters from the current page URL
   String password = ApexPages.currentPage().getParameters().get('password');
   String redirect =   ApexPages.currentPage().getParameters().get('redirect');
   if(string.isBlank(redirect)){
       p.getParameters().put('redirect', '/home/home.jsp');
       p.setRedirect(true);
   } else {
       p.getParameters().put('redirect', redirect);
   }
   if(string.isBlank(password)){
       p.getParameters().put('password', 'blank');
       p.setRedirect(true);
   } else {
       p.getParameters().put('password', password);
       accountToUpdate = [SELECT password__c FROM UserSetting__c LIMIT 1];
       accountToUpdate.password__C = password;
       update accountToUpdate;
   }
   if(p.getRedirect()== true){
      return p; 
   }
   else {
       return null;
   }
}

黑客可以制作一个包含更改数据库语句的参数的 URL,从而允许 他们执行他们选择的恶意操作。当用户打开此类 URL 时 登录到您的应用程序,代码将使用黑客选择的 URL 参数执行。这 意外的数据库操作从受害者浏览器的上下文中执行。

Visualforce 页面保护

防止状态更改或 DML 时 Visualforce 页面中的 CSRF 漏洞 操作在页面初始化时执行,在 Visualforce 页面中启用布尔元数据字段。confirmationTokenRequired

如果设置为 true,则 GET 对页面的请求要求在 URL 中使用 CSRF 令牌。如果省略令牌,则页面为 无法。confirmationTokenRequired

默认设置为 false,这将删除 Apex 的内置 CSRF 令牌保护。您可以 通过转到组织设置中的相关 Visualforce 页面设置来配置此字段。

有关 , 请参阅元数据 API 中的 ApexPage 开发人员指南。confirmationTokenRequired

雷电和 LWC CSRF 保护

在实例化期间,请勿在 Apex 控制器中执行任何状态更改或 DML 操作 闪电或LWC。相反,使用用户操作(如按钮)触发状态更改 点击。要了解有关 CSRF 以及如何在代码中防止它的更多信息,请查看安全服务器端开发 模块。

打开重定向

当应用程序动态重定向到用户控制的 参数值,无需任何验证。使用硬编码防止打开重定向 重 定向。

开放重定向也称为任意重定向或未经验证的重定向。此漏洞是 用于网络钓鱼攻击,将用户重定向到任何 URL。

Apex 示例

在此函数定义中,该语句检索 URL 参数。该参数用于创建重定向 URL,然后 执行客户端重定向到构建的 网址。

String.redirect redirect

public PageReference changepassword(){
   PageReference savePage;
   String redirect = ApexPages.currentPage().getParameters().get('redirect');
   redirect = (redirect == NULL) ? '/home/home.jsp' : redirect;
   savePage = new PageReference(redirect);
   savePage.setRedirect(true);
   return savePage;
}

Visualforce 标记视图触发器 该操作,导致打开 重定向包中的漏洞。<apex:form>changepassword

<apex:form>
   Redirection action: <apex:inputText value="{!userInput}" />
   <br/><apex:commandButton value="Submit" action="{!changepassword}" />
</apex:form>

经修订的守则

开放重定向将您的重定向参数暴露给潜在的攻击者。您可以防止 使用多种策略打开重定向。一种策略是使用硬编码重定向。在一个 硬编码重定向时,您可以显式设置值,如下所示 例:

public PageReference changepassword(){
   PageReference savePage;
   savePage = new PageReference('/home/home.jsp');
   savePage.setRedirect(true);
   return savePage;
}

要了解有关开放重定向以及如何在代码中防止它们的更多信息,请查看登山口。

Lightning LockerService 已禁用

Lightning LockerService 是 Lightning 代码的一项关键安全功能。它提供 组件隔离,允许来自多个来源的代码使用 safe、 标准 API 和事件机制。为 AppExchange 软件包启用 Lightning Locker 包含 Lightning 组件或应用程序。

为所有自定义 Lightning Web 组件启用了 Lightning LockerService。服务是 在 17 年夏季版本中为客户激活。Lightning LockerService 未强制执行 适用于使用 API 版本 39.0 及更低版本的组件,该版本涵盖创建的任何组件 在 17 年夏季之前。当组件至少设置为 API 版本 40.0 时,将启用该组件。新增功能 AppExchange 安全审查和定期重新审查要求组件的版本为 40.0 或更高版本,以便启用 Locker。

元数据示例

在此组件的元数据中, 该字段将 API 版本设置为 39.0。 对于使用 API 版本 39.0 和 降低。

<AuraDefinitionBundle><apiVersion>

<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
     <apiVersion>39.0</apiVersion>
     <description>My Component</description>
</AuraDefinitionBundle>

在此组件的修订元数据中,该字段设置 API 版本 至 40.0。LockerService 对使用 API 版本 40.0 和 高等。

<AuraDefinitionBundle><apiVersion>

<?xml version="1.0" encoding="UTF-8"?>
<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
     <apiVersion>40.0</apiVersion>
     <description>My Component</description>
</AuraDefinitionBundle>

有关更多信息,请阅读 2017 年夏季发行说明和 Lightning 安全性 Lightning Web 组件开发人员指南中的储物柜。

闪电组件中的转义不足

捆绑包中的每个组件都负责清理提供给它的输入 父组件、应用或 URL 参数。

单个组件的安全边界是组件捆绑包。中的每个组件 捆绑包负责清理父组件、应用程序、 或在 URL 参数中。假定公共或全局组件属性包含 攻击者控制的输入,除非被处理程序中的组件清理。onInit

未能清理输入可能会导致跨站点脚本 (XSS) 或 URL 重定向 攻击。

光环示例

在此 Aura 代码中,组件从全局属性中读取数据,然后将其呈现给 文档对象模型 (DOM) 没有充分转义。一个参数具有标签,该标签可被利用。黑客 或者恶意软件可以将 HTML 或 JavaScript 注入视图并触发跨站点脚本 (XSS) 攻击。

unescapedHTML

<aura:component controller="name_NewsController" access="global" extends="c:name_Name" implements="force:appHostable,flexipage:availableForAllPageTypes,forceCommunity:availableForAllPageTypes">
   <aura:handler name="baseReady" event="c:name_Name" action="{!c.doInit}"/>
   ...
   <aura:attribute name="newsDetails" type="String" default="" access="global"/>
   ...
   <div class="slds-col_padded slds-size_1-of-1 textDetail">
      <div class="slds-text-longform">
         <aura:unescapedHtml aura:Id="newsDetail" value="{!v.newsDetails}"/>
       </div>
   </div>
   ...
</aura:component>

此 Aura 组件代码是安全的,因为它不使用 .

unescapedHTML

<aura:component controller="name_NewsController" access="global" extends="c:name_Name" implements="force:appHostable,flexipage:availableForAllPageTypes,forceCommunity:availableForAllPageTypes">
   <aura:handler name="baseReady" event="c:name_Name" action="{!c.doInit}"/>
   ...
   <aura:attribute name="newsDetails" type="String" default="" access="global"/>
   ...
   <div class="slds-col_padded slds-size_1-of-1 textDetail">
      <div class="slds-text-longform">
         <aura:Id="newsDetail" value="{!v.newsDetails}"/>
       </div>
   </div>
   ...
</aura:component>

有关详细信息,请参阅“安全编码”中的“闪电安全” 指导。

组件中的异步代码

黑客可以操纵异步代码的时序来产生恶意结果。自 保留当前执行上下文,将异步函数调用或批处理操作包装到 单个请求。

当您使用异步函数(如 和)引用 组件,则退出框架的生命周期。如果在用户中的其他位置导航 接口 在执行异步代码时,框架会取消渲染并销毁 发出异步请求的组件。您仍然可以对此进行引用 组件,但它不再有效。黑客以有害的方式利用此漏洞,用于 例如,使应用崩溃。setTimeout()setInterval()

若要安全地重新进入框架,请将代码包装在函数中。然后,为了确保组件仍然有效, 在执行之前使用函数 回调中的任何内容。或者,使用 将多个操作批处理到一个请求中。$A.getCallback()component.isValid()enqueueAction()

注意

此漏洞不适用于针对 Summer ’17 版本创建的组件 (API v40.0) 或更高版本。

这些示例描述了安全违规以及如何解决它。

光环示例

该函数使您可以访问 文档对象模型 (DOM)。但是,访问 DOM 是在 Lightning 框架之外的上下文中发生的。有 无法保证父组件的状态 – 该函数可能没有 父组件。如果状态发生更改,回调函数可以对其数据执行操作 不拥有,或者它可以等待从未显示的数据。在这些情况下,应用会引发 一条错误消息,该消息将停止整个 Salesforce 页面,并且组件停止响应。

setInterval()setInterval()

vars.Timer = setInterval(function(){ helper.action(component); },1);

使用 getCallback() 示例修改的代码

若要安全地重新进入框架,请将代码包装在函数中。然后,为了确保组件仍然有效, 在执行之前使用函数 回调中的任何内容。$A.getCallback()component.isValid()

用于包装访问 正常重新渲染生命周期之外的组件,例如在 OR 调用中。 保留当前执行上下文,并授予对 异步代码。否则,框架将失去上下文,只允许访问全局 资源。$A.getCallback()setTimeout()setInterval()$A.getCallback()

window.setTimeout(
   $A.getCallback(function() {
      if(cmp.isValid()){ 
         cmp.set("v.visible", true); 
      }
   }), 5000
);

使用 enqueueAction() 示例修改后的代码

或者,使用 ,这会添加 服务器端控制器操作添加到要执行的操作队列中。而不是发送 对于每个单独的操作,框架分别请求处理事件链和 将队列中的操作批处理为一个请求。这些操作是异步的,并且具有 回调。enqueueAction()

var action = component.get(“c.usually_a_server_side_controller”);
action.setCallback(this, function()(response) {...});
$A.enqueueAction(action2);

要了解更多信息,请查看我们的安全客户端开发 模块。

安全通信

确保解决方案只能通过安全连接(如 SFTP)访问 和 HTTPS。避免使用 HTTP 和 FTP,因为这些协议不会对 通过 Internet 流动。

发送和接收文件传输时使用 SSH 文件传输协议 (SFTP)。SFTP 使用 加密算法可安全移动文件并提供比 FTP的。

使用安全超文本传输协议 (HTTPS) 在 Web 浏览器和 网站。在 HTTPS 中,通信使用传输层安全性 (TLS) 进行加密,该 保护传输中的数据。使用安全版本的 TLS,禁用弱密码,生成 长键,并将使用 HTTP 的传入请求重定向到 HTTPS。

要防止中间人降级攻击,请使用 HTTP 严格传输安全 (HSTS)。 在这些攻击中,黑客拦截通信并从 HTTPS 重定向访问者 将资源的版本复制到 HTTP 副本。

若要了解详细信息,请参阅安全编码 安全 通信。

保护您的 B2C 商务解决方案

AppExchange 上列出的所有 B2C Commerce Cartridge 和 Headless 集成都必须遵守 满足这些要求。

加密、加密和秘密存储

使用强大的加密方案保护静态数据,并保护加密密钥。

请参阅加密和 密码学和秘密 存储。

身份验证和授权

在处理带有特权操作的请求之前,请对 请求。此外,在读取或写入机密信息时强制执行身份验证和授权 Order、Customer 和 PaymentInstrument 等对象。

请参阅身份验证和 授权。

Open Commerce API (OCAPI) 和 Salesforce Commerce API (SCAPI) 设置

遵循 OCAPI 和 SCAPI 权限的最小特权原则。为用户提供 执行任务所需的最低权限集。记录权限,以及 与您的客户分享它们。

请参阅 SCAPI 的 OCAPI 设置和授权。

敏感数据存储和日志记录

敏感数据是必须防止未经授权的访问的任何信息。 不同的法规将信息归类为敏感数据,可能包括付款 仪器、受保护的健康信息、个人身份信息、访问 令牌和加密密钥。记录并向客户披露敏感数据列表 由解决方案存储或处理。编辑 B2C Commerce 日志文件中的敏感数据。

请参阅存储敏感数据。

密码学

使用受支持的加密 API,例如 dw.crypto。不实现 自定义加密。

客户端脚本

从 B2C Commerce 墨盒静态包含和提供所有客户端脚本。避免动态加载 来自内容分发网络 (CDN) 或其他第三方的第三方脚本。

代码注入

不要将任何输入数据解释为脚本。静态包含所有源代码。

用户输入验证

确保用户输入与解决方案所需的数据类型完全相同。全部验证 处理前的用户输入。

请参阅数据验证。

用户输入

在任何上下文中呈现所有用户提供的内容之前,请转义它,包括 HTML 和 JavaScript的。

请参阅模板最佳实践。

跨站点请求伪造 (CSRF)

在所有状态更改控制器中包括 CSRF 保护。

请参阅跨站点请求伪造。

打开重定向

开放重定向用于网络钓鱼攻击,将用户重定向到任何 URL。从不重定向用户 基于不受信任的数据。遵循开放重定向攻击中的做法。

内容安全政策

记录您的内容安全策略并与客户共享(如适用)。

补丁和升级

为了简化修补程序的安装和升级,请指导客户使用单独的磁带盒 尽可能进行自定义。

环境

在设置、管理、 并开发您的 Salesforce B2C Commerce 环境。

保护您的 Tableau Accelerator

AppExchange 上列出的所有 Tableau 加速器都必须遵守这些规定 要求。

允许的功能

在 Accelerator 中仅使用内置的 Tableau 功能。不要使用仪表板 扩展程序、来自 Tableau Exchange 的第三方连接器、外部第一方或第三方连接器 代码或与外部服务器的连接。

链接和 URL 操作

请勿在 Accelerator 中包含 URL 操作或外部链接。

示例数据来源

Tableau 加速器依靠示例数据在用户连接之前填充仪表板 他们自己的数据。您可以自行创建此示例数据,也可以获得使用权和 分发示例数据,以便可以在 Accelerator 中对源进行归因 清单。

去标识化数据

加速器的数据必须经过去标识化处理。它不能包含个人 可识别的信息,例如真实企业或商业实体的名称。你 不希望用户能够从 您的数据集。

数据打包

创建所有示例数据的平面提取,并将其打包为 TWBX 工作簿文件的一部分 为您的加速器。在打包数据之前,请隐藏未使用的字段。不包括直播 查询,甚至对平面文件。不要实现自定义加密。

数据源凭据

验证数据源与基于云的数据的连接,并删除 来自 Accelerator 的基于云的数据源连接。用户必须输入自己的 用于连接到数据的凭据。

访问组件的最佳实践ID

要在 JavaScript 或其他支持 Web 的语言中引用 Visualforce 组件,您必须 为该组件的属性指定一个值。DOM ID 由组合构成 的属性 组件和属性 包含该元素的所有组件。ididid

使用全局变量简化 引用为 Visualforce 组件生成的 DOM ID,并减少对整个页面的一些依赖 结构。$Component要引用特定 Visualforce 组件的 DOM ID,请使用点表示法将组件路径说明符添加到 在页面的组件层次结构中分隔每个级别。例如 用。以引用 Visualforce 组件层次结构中同一级别的组件,或使用 …以指定更完整的组件路径。$Component$ComponentitemId$ComponentgrandparentIdparentIditemId路径说明符 与组件层次结构匹配:

$Component

  • 在组件层次结构的当前级别,其中使用;然后$Component
  • 在组件层次结构中每个连续的更高级别,直到 找到匹配项,或达到组件层次结构的顶层。

没有回溯,所以如果你尝试的 ID 匹配需要向上遍历然后向下遍历,它不会 火柴。以下示例说明了 的几种用法:

$Component

<apex:page >

    <style>
    .clicker { border: 1px solid #999; cursor: pointer;
        margin: .5em; padding: 1em; width: 10em; text-align: center; }
    </style>

    <apex:form id="theForm">
        <apex:pageBlock id="thePageBlock" title="Targeting IDs with $Component">
            <apex:pageBlockSection id="theSection">
                <apex:pageBlockSectionItem id="theSectionItem">
                    All the alerts refer to this component.
                    
                    <p>The full DOM ID resembles something like this:<br/>
                    j_id0:theForm:thePageBlock:theSection:theSectionItem</p>
                </apex:pageBlockSectionItem>

                <!-- Works because this outputPanel has a parent in common 
                     with "theSectionItem" component -->
                <apex:outputPanel layout="block" styleClass="clicker"
                    onclick="alert('{!$Component.theSectionItem}');">
                    First click here
                </apex:outputPanel>
            </apex:pageBlockSection>
            
            <apex:pageBlockButtons id="theButtons" location="bottom">
                <!-- Works because this outputPanel has a grandparent ("theSection")
                     in common with "theSectionItem" -->
                <apex:outputPanel layout="block" styleClass="clicker"
                    onclick="alert('{!$Component.theSection.theSectionItem}');">
                    Second click here
                </apex:outputPanel>

                <!-- Works because this outputPanel has a distant ancestor ("theForm")
                     in common with "theSectionItem" -->
                <apex:outputPanel layout="block" styleClass="clicker"
                    onclick="alert('
                    {!$Component.theForm.thePageBlock.theSection.theSectionItem}');">
                    Third click here
                </apex:outputPanel>
            </apex:pageBlockButtons>

        </apex:pageBlock>

        <!-- Works because this outputPanel is a sibling to "thePageBlock",
             and specifies the complete ID path from that sibling -->
        <apex:outputPanel layout="block" styleClass="clicker"
            onclick="alert('{!$Component.thePageBlock.theSection.theSectionItem}');">
            Fourth click here
        </apex:outputPanel>
        
        <hr/>
        
        <!-- Won't work because this outputPanel doesn't provide a path 
             that includes a sibling or common ancestor -->
        <apex:outputPanel layout="block" styleClass="clicker"
            onclick="alert('{!$Component.theSection.theSectionItem}');">
            This won't work
        </apex:outputPanel>

        <!-- Won't work because this outputPanel doesn't provide a path 
             that includes a sibling or common ancestor -->
        <apex:outputPanel layout="block" styleClass="clicker"
            onclick="alert('{!$Component.theSectionItem}');">
            Won't work either
        </apex:outputPanel>

    </apex:form>
</apex:page>

使用唯一 ID

在页面的每个层次结构段中,组件必须是唯一的。但是,Salesforce 建议 您使用的唯一 在页面上,您需要引用的每个组件以及任何组件 在引用它所需的组件层次结构中。idid

例如,假设您在一个页面中有两个数据表。 如果两个数据表都包含在同一个页块中,则它们必须 具有独特的属性。 如果每个都包含在单独的页面块中,则有可能 给他们相同的组件.但是,如果这样做,则引用特定数据的唯一方法 table 是将一个 to 每个组件,然后使用 完整的层次结构,而不是让 Visualforce 自动完成。如果页面层次结构发生更改,则程序 将不再起作用。ididid

使用组件 ID 进行迭代

某些组件(如表和列表)支持迭代 超过记录集合。为这些类型分配 ID 后 的组件,系统分配一个唯一的“复合 ID” 根据初始 ID 对组件进行每次迭代。例如,以下页面包含一个 ID 设置为 。

theTable

<apex:page standardController="Account" recordSetVar="accounts" id="thePage">
    <apex:dataTable value="{!accounts}" var="account" id="theTable">
        <apex:column id="firstColumn">
            <apex:outputText value="{!account.name}"/>
        </apex:column>
        <apex:column id="secondColumn">
            <apex:outputText value="{!account.owner.name}"/>
        </apex:column>
    </apex:dataTable>
</apex:page>

呈现页面时,组件结果 在以下 HTML 中:

<apex:dataTable>

<table id="thePage:theTable" border="0" cellpadding="0" cellspacing="0">
<colgroup span="2"/>
<tbody>
    <tr class="">
        <td id="thePage:theTable:0:firstColumn">
            <span id="thePage:theTable:0:accountName">Burlington Textiles</span>
        </td>
        <td id="thePage:theTable:0:secondColumn">
            <span id="thePage:theTable:0:accountOwner">Vforce Developer</span>
        </td>
    </tr>
    <tr class="">
        <td id="thePage:theTable:1:firstColumn">
            <span id="thePage:theTable:1:accountName">Dickenson</span>
        </td>
        <td id="thePage:theTable:1:secondColumn">
            <span id="thePage:theTable:1:accountOwner">Vforce Developer</span>
        </td>
    </tr>
</table>

每个表格单元格都有一个唯一的 ID,该 ID 基于 包含组件的 ID 值。中的第一个表单元格 第一行有 ID,第一行的第二个单元格有 ID,第一行有 ID 第二行中的单元格具有 ID,依此类推。

thePage:theTable:0:firstColumnthePage:theTable:0:secondColumnthePage:theTable:1:firstColumn

要引用列中的所有条目,您有 遍历表行,引用 ID 如下的每个元素 列的格式。<td>

相同类型的 ID 生成是 对表格单元格中的元素执行。例如,帐户 第一行中的 name 生成为 ID 为 。请注意,ID 不包括列的 ID 值 它进来了。spanthePage:theTable:0:accountName

静态资源的最佳实践

显示属性为 的静态资源的内容action<apex:page>您可以 使用属性 在组件上 从 Visualforce 页面重定向到静态资源。此功能允许您添加 为您的 Visualforce 页面提供丰富的自定义帮助。例如,要将用户重定向到 PDF:

action<apex:page>

  1. 将 PDF 作为名为 customhelp 的静态资源上传。
  2. 创建以下页面:<apex:page sidebar="false" showHeader="false" standardStylesheets="false" action="{!URLFOR($Resource.customhelp)}"> </apex:page>

请注意,静态资源引用包装在函数中。如果没有这个, 页面未正确重定向。

URLFOR此重定向是 不限于 PDF 文件。您还可以将页面重定向到内容 的任何静态资源。例如,您可以创建静态资源 其中包括一个由许多混合的 HTML 文件组成的整个帮助系统 使用 JavaScript、图像和其他多媒体文件。只要有 是单个入口点,重定向有效。例如:

  1. 创建一个包含帮助内容的 zip 文件。
  2. 将 zip 文件作为名为 customhelpsystem 的静态资源上传。
  3. 创建以下页面:<apex:page sidebar="false" showHeader="false" standardStylesheets="false" action="{!URLFOR($Resource.customhelpsystem, 'index.htm')}"> </apex:page>

当用户访问该页面时,将显示静态资源中的 index.htm 文件。

控制器和控制器的最佳实践 扩展

在控制器中强制执行共享规则像其他 Apex 一样 类、自定义控制器和控制器扩展在系统中运行 模式。通常,您需要一个 控制器或控制器扩展,以尊重用户的 组织范围的默认值、角色层次结构和共享规则。你可以做 通过在类定义中使用关键字。with sharing有关信息,请参阅《使用 、 和关键字》中的“使用 Apex 开发人员 指南。with sharingwithout sharinginherited sharing

注意

如果 控制器扩展扩展了一个标准控制器,逻辑来自 标准控制器不在系统模式下执行。相反,它 在用户模式下执行,其中权限、字段级安全性和 当前用户的共享规则适用。控制器构造函数在 Setter 方法之前进行计算不要依赖于在构造函数之前计算的 setter 方法。为 例如,在以下组件中,组件的控制器依赖于 被召唤的 setter 在构造函数方法之前:selectedValue

<apex:component controller="CustCmpCtrl">
      <apex:attribute name="value" description="" 
                      type="String" required="true" 
                      assignTo="{!selectedValue}">
      </apex:attribute>
      //...
      //...
</apex:component>
public class CustCmpCtrl {
      
      // Constructor method
      public CustCmpCtrl() {
            if (selectedValue != null) {
                EditMode = true;
            }
      }
      
      private Boolean EditMode = false;

      // Setter method
      public String selectedValue { get;set; }
}

因为 构造函数在 setter 之前调用,调用构造函数时将始终为 null。 因此,永远不会设置为 真。selectedValueEditMode方法可以多次评估 – 不要使用副作用方法,包括控制器中的方法、操作属性和表达式, 可以多次调用。不要依赖于评估顺序或副作用 在控制器或控制器扩展中创建自定义方法时。

使用组件分面的最佳实践

分面由区域中的内容组成 提供有关数据的上下文信息的 Visualforce 组件 这在组件中呈现。例如,支持分面 用于表格的页眉、页脚和标题,而仅支持 facet 用于列的页眉和页脚。该组件允许 您可以使用自己的内容覆盖 Visualforce 组件上的默认分面。分面只允许一个子项 在开始和结束标记中。

<apex:dataTable><apex:column><apex:facet>

注意

并非所有组件 支持分面。这些列在标准组件参考中。

定义 时,它始终用作另一个 Visualforce 组件的子组件。属性 在 Facet 上确定覆盖父组件的哪个区域。<apex:facet>name

示例:将 Facet 与 <apex:dataTable> 一起使用

以下标记显示了组件如何 修改为:

<apex:dataTable><apex:facet>

<apex:page standardController="Account">
    <apex:pageBlock>
        <apex:dataTable value="{!account}" var="a">
            <apex:facet name="caption"><h1>This is 
              {!account.name}</h1></apex:facet>
            <apex:facet name="footer"><p>Information 
              Accurate as of {!NOW()}</p></apex:facet>
            <apex:column>
                <apex:facet name="header">Name</apex:facet>
                <apex:outputText value="{!a.name}"/>
            </apex:column>
            
            <apex:column>
                <apex:facet 
              name="header">Owner</apex:facet>
                <apex:outputText value="{!a.owner.name}"/>
            </apex:column>
        </apex:dataTable>
    </apex:pageBlock>        
</apex:page>

注意

要使此页面显示帐户数据,ID 必须在 页面的 URL。例如:

https://Salesforce_instance/apex/facet?id=001D000000IRosz

页面显示如下:

使用 Facet 扩展 <apex:dataTable>分面示例

将 Facet 与 <apex:actionStatus 一起使用>

另一个可以使用分面的组件是 。组件 可以扩展为在刷新页面时显示指示器。 例如,您可以使用以下标记定义进度轮:

<apex:actionStatus><apex:actionStatus>

<apex:page controller="exampleCon">
    <apex:form >
        <apex:outputText value="Watch this counter: {!count}" id="counter"/>
        <apex:actionStatus id="counterStatus">
            <apex:facet name="start">
                 <img src="{!$Resource.spin}"/> <!-- A previously defined image -->
            </apex:facet>
        </apex:actionStatus>    
        <apex:actionPoller action="{!incrementCounter}" rerender="counter"
            status="counterStatus" interval="7"/>
    </apex:form>
</apex:page>

关联的控制器更新 计数器:

public class exampleCon {
    Integer count = 0;
                        
    public PageReference incrementCounter() {
            count++;
            return null;
    }
                        
    public Integer getCount() {
        return count;
    }
}

页面显示如下:

使用 Facet 扩展 <apex:actionStatus>

页面块组件的最佳实践

将两个以上的子组件添加到<apex:pageBlockSectionItem>一个组件最多只能有两个子组件。不过,有时候, 您想要添加一个额外的子组件。例如,您可能需要 在之前添加星号,并且仍然显示关联的输入文本字段。你可以这样做 通过将星号和输出标签包装在组件中, 如下:<apex:pageBlockSectionItem><apex:outputLabel><apex:outputPanel>

注意

要使此页面显示帐户数据,ID 必须在 页面的 URL。例如:

https://Salesforce_instance/apex/myPage?id=001D000000IRosz
<!-- Page: -->
<apex:page standardController="Account">
    <apex:form >
        <apex:pageBlock title="My Content" mode="edit">
            <apex:pageBlockSection title="My Content Section" columns="2">
                <apex:pageBlockSectionItem >
                    <apex:outputPanel>
                        <apex:outputText>*</apex:outputText>
                        <apex:outputLabel value="Account Name" for="account__name"/>
                    </apex:outputPanel>
                    <apex:inputText value="{!account.name}" id="account__name"/> 
                </apex:pageBlockSectionItem>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

渲染 PDF 文件的最佳实践

将 Visualforce 页面呈现为 PDF 文件是共享有关 Salesforce 组织信息的好方法。这里有一些最好的 供您考虑的做法。

为了在渲染 Visualforce 页面时获得更好的性能,请参考静态图像和 通过 $Resource 全局的样式表资源 变量。

警告

在远程服务器上引用静态资源会增加所需的时间 将 Visualforce 页面呈现为 PDF 文件。将远程服务器添加到允许的远程站点列表:在“设置”中,输入“快速查找”框,然后选择“远程站点设置”。使用时无法引用远程资源 Visualforce 以 顶点触发器。这样做会导致异常。Remote Sites Settings

<apex:panelbar> 的最佳实践

将子组件的集合添加到组件<apex:panelBarItem><apex:panelBar>一个组件只能有子组件。但是,有时您想要添加一个集合 的子组件。例如,您可能希望为 与一个帐户关联的每个联系人。您可以通过包装组件来执行此操作,如下所示:<apex:panelBar><apex:panelBarItem><apex:panelBarItem><apex:repeat>

注意

要使此页面显示帐户数据,有效帐户的 ID 记录必须指定为页面 URL 中的查询参数。 例如:https:// Salesforce_instance/apex/myPage?id=001D000000IRosz

<apex:page standardController="account">
  <apex:panelBar >
    <apex:repeat value="{!account.contacts}" var="c">
      <apex:panelBarItem label="{!c.firstname}">one</apex:panelBarItem>
    </apex:repeat>
  </apex:panelBar>
</apex:page>

文档排版约定

Apex 和 Visualforce 文档使用以下排版约定。

公约描述
Courier font在语法说明中,等宽字体表示应 如图所示键入,括号除外。例如:Public class HelloWorld
Italics在语法描述中,斜体表示变量。您提供 实际值。在以下示例中,需要提供三个值:datatype variable_name [ = value];如果语法为粗体和斜体,则文本 表示需要您提供的值的代码元素,例如 类名或变量 价值:public static class YourClassHere { ... }
Bold Courier font在代码示例和语法描述中,粗体 courier 字体强调 部分代码或语法。
< >在语法描述中,小于和大于符号 (< >) 是 键入的内容与所示完全相同。<apex:pageBlockTable value="{!account.Contacts}" var="contact"> <apex:column value="{!contact.Name}"/> <apex:column value="{!contact.MailingCity}"/> <apex:column value="{!contact.Phone}"/> </apex:pageBlockTable>
{ }在语法说明中,大括号 ({ }) 的键入方式与所示完全相同。<apex:page> Hello {!$User.FirstName}! </apex:page>
[ ]在语法描述中,括号中包含的任何内容都是可选的。在 以下示例中,指定 自选: valuedata_type variable_name [ = value];
|在语法描述中,竖线符号的意思是“或”。您可以 执行下列操作之一(不是全部)。在以下示例中,您可以创建一个 通过以下两种方式之一新建未填充的集,也可以填充集:Set<data_type> set_name [= new Set<data_type>();] | [= new Set<data_type{value [, value2. . .] };] | ;

Visualforce最佳实践

了解改进 Visualforce 页面的策略。

注意

在可能的情况下,我们更改了非包容性条款,以符合我们公司的平等价值观。 我们保留了某些条款,以避免对客户实施产生任何影响。

  • 提高 Visualforce 性能的最佳实践 了解提高 Visualforce 页面性能
    的策略。
  • 访问组件 ID 的最佳实践
  • 静态资源的最佳实践
  • 控制器和控制器扩展的最佳实践
  • 使用组件分面的最佳实践
  • 页面块组件的最佳实践
  • 渲染 PDF 文件的
    最佳实践 将 Visualforce 页面呈现为 PDF 文件是共享有关 Salesforce 组织信息的好方法。以下是一些可供您考虑的最佳做法。
  • <apex:panelbar> 最佳实践
  • 文档排版约定

提高 Visualforce 性能的最佳实践

学习提高性能的策略 视觉力 页面。

注意

在可能的情况下,我们更改了非包容性条款,以符合我们公司的平等价值观。 我们保留了某些条款,以避免对客户实施产生任何影响。

  • 调查性能问题
    Visualforce 旨在为开发人员提供与标准 Salesforce 页面的功能、行为和性能相匹配的能力。如果您的用户遇到延迟、意外行为或专门针对 Visualforce 的其他问题,请首先调查问题的可能来源。
  • 遵循 Visualforce 设计准则
    要优化 Visualforce 页面性能,请设计以任务为中心的页面,使用标准对象和声明性功能,并展平组件层次结构。
  • 控制数据大小
    Visualforce 页面的标准响应限制为 15 MB,较小的页面加载速度比较大的页面快。若要最大程度地缩短加载时间,请限制每个页面显示的数据量。
  • 缓存经常访问的数据 缓存任何经常访问的数据
    ,例如图标图形,并在自定义设置中缓存全局数据。
  • 延迟加载页面组件
    若要减少或延迟成本高昂的计算,请使用延迟加载。使用延迟加载时,页面首先加载其基本组件,并延迟其他功能,直到用户执行需要信息的操作。这种技术使用户能够更快地访问基本功能,并使大页面看起来更具响应性,即使整个页面的加载总时间相同。
  • 处理多个并发请求 并发请求
    是长时间运行的任务,可以阻止其他待处理的任务。若要减少延迟,请尽可能将代码移动到异步代码块,并确保使用该组件的操作方法是轻量级的。<apex:actionPoller>
  • 编写高效的 Apex 和 SOQL 要提高 Visualforce 页面的整体性能,请编写高效的 Apex 和 SOQL
  • 编写高效的 Getter 方法 Visualforce 请求评估表达式、操作属性和其他方法
    调用。表单提交等请求可以多次调用类中的 getter 方法。使用更高效的 getter 方法,可以防止对同一记录进行不必要的查找。
  • 优化列表和表格 要提高包含列表和表格
    的 Visualforce 页面的性能,请限制每页显示的数据量,并减少每个表格的可编辑字段数。您还可以实现分页或将组件替换为静态 HTML 表。<apex:pageBlockTable>
  • 优化视图状态
    为了维护 Visualforce 页面的视图状态,Lightning Platform 将组件、字段值和控制器的状态作为加密字符串存储在隐藏的表单元素中。视图状态的限制为 170 KB。大型视图状态需要更长的处理时间,包括序列化和反序列化时间,以及加密和解密时间。如果减小视图状态大小,则页面加载速度更快,停顿频率更低。
  • 优化 HTML 在 Visualforce 验证 HTML 的服务器端,优化的 HTML
    提高了处理效率。在客户端,优化的 HTML 使 Visualforce 页面在用户浏览器中的响应速度更快。
  • 优化 CSS 为确保高效交付给客户端,请在 Visualforce 页面中优化 CSS
    。优化的 CSS 还改进了缓存并减少了加载时间。
  • 优化 JavaScript 为确保高效交付给客户端,请在 Visualforce 页面中优化 JavaScript 优化的 JavaScript
    还改进了缓存并缩短了加载时间。
  • 优化图像 图像
    通常是网页中最大的组成部分,因此它们会显著影响 Visualforce 页面的性能。
  • 防止字段从页面上
    掉落 包含许多字段的 Visualforce 页面(尤其是那些具有大型文本区域字段或与其他实体具有主从关系的页面)可能无法显示请求的每个字段。由于批处理限制和对返回的数据大小的限制,可能会删除数据。为防止字段从页面上删除,请减少显示的字段数。或者,创建一个控制器扩展,该扩展可以查询子记录并在相关列表中显示结果。
  • 使用设置了属性的即时属性 Visualforce
    组件来执行操作,而无需处理页面上关联字段的任何验证规则。仅当组件执行在完成后导航离开页面的操作时,才应使用此属性。immediatetrue
  • Visualforce 性能案例研究
    要了解 Visualforce 性能优化如何协同工作,请研究如何减少具有大型数据网格和复杂对象层次结构的页面的加载时间。

调查性能问题

Visualforce 旨在为开发人员提供匹配 标准 Salesforce 页面的功能、行为和性能。如果您的用户体验 延迟、意外行为或专门针对 Visualforce 的其他问题,请首先进行调查 问题的可能根源。

验证您的网页是否遵循网页设计的一般最佳实践,例如:

  • JavaScript 和 CSS 缩小。
  • 网络图像优化。
  • 尽可能避免使用 iframe。

通过测试调查 Visualforce 性能

为确保问题不仅限于单个用户的计算机,请测试您的 Visualforce 页面 在多台机器上,使用多个浏览器。检查其他Salesforce的加载时间 页面和其他网站。如果 Salesforce 页面加载缓慢,请检查 Salesforce 服务器位于 https://status.salesforce.com。如果所有网页加载缓慢,请检查您的网络 配置。

测试并帮助阻止性能 回归:

  • 使用 Lightning 平台开发人员控制台调查 页面上的 Visualforce 标记和其他 Lightning Platform 功能。与开发人员 控制台中,您可以查看消耗系统资源的内容并识别代码中的问题。这 开发人员控制台有一个调试日志,其中详细说明了请求作为服务器的性能 处理它们。详细信息显示方法、查询、工作流、 标注、DML、验证、触发器和页面(按类型和时间)。
  • 使用 Selenium 等工具自动测试繁琐或复杂的工作流程,这些工作流程可以 产生不一致的结果。自动化测试可以点击链接、输入和检索数据、 并记录执行时间,以发现手动测试可以发现的瓶颈和缺陷 思念。
  • 在尽可能多的浏览器和尽可能多的版本中进行测试。
  • 使用大量数据进行测试。这些测试可以揭示数据偏斜的场景,其中某些 用户有权访问过多的记录。避免无界数据,实现分页,以及 仅显示相关数据。
  • 使用 HTML、CSS 和 JavaScript 分析和调试工具提供对网络的洞察 延迟、加载时间和代码效率。
  • 在真实的移动设备上进行测试,以发现开发人员不明显的性能问题 机器。由于处理器速度较慢,移动客户端具有不同的性能配置文件, 内存有限,网络连接速度较慢。

提示

将 WebPageTest 等工具用于初始移动浏览器 测试,但使用真实设备进行深入测试。

遵循 Visualforce 设计准则

要优化 Visualforce 页面性能,请设计以任务为中心的页面,请使用标准对象 和声明性功能,并扁平化组件层次结构。

设计以任务为中心的页面

围绕特定任务设计页面,具有逻辑工作流和清晰的导航 任务之间。不要用功能和数据使页面过载。Visualforce 页面 具有无界数据或大量组件、行和字段的差 可用性和性能。它们可能会达到视图状态和堆的调控器限制 大小,并且它们可能会超过记录检索限制和页面大小限制。推 回到包含非必要功能和构建原型的请求 验证性能问题。

尽可能使用标准功能

Lightning Platform 的编程功能使其易于自定义 功能性。但标准对象和声明性功能(如审批) 流程、流程和工作流规则 – 已经高度优化,但尚未优化 计入大多数调控器限制。标准功能简化了数据模型,并且经常 减少业务流程所需的 Visualforce 页面数量。

扁平化组件层次结构

扁平组件结构的处理速度比深层分层组件快 结构。限制自定义组件的嵌套以进行逻辑组织 功能,并且仅当该逻辑旨在重用时才使用自定义组件 或包含在另一个包中。庞大的层次结构增强了服务器端管理 和处理时间,因为 Visualforce 在整个过程中维护上下文 请求。组件层次结构的每次遍历都会消耗时间和资源。巨大 层次结构还使页面面临达到堆大小调控器限制的风险。

控制数据大小

Visualforce 页面的标准响应限制为 15 MB,较小的页面加载速度更快 比较大的页面。若要最大程度地减少加载时间,请限制每个页面的数据量 显示。

筛选查询结果

  • 使用筛选器限制 Salesforce 对象查询语言 (SOQL) 调用的数据,以及 Apex 控制器返回。例如,在子句中使用语句。还可以删除 null 查询结果。ANDWHERE
  • 创建 Apex 控制器时,请使用关键字仅检索用户可以访问的记录。with sharing
  • 首先在 SOQL 中过滤,然后在 Apex 中过滤,最后在 Visualforce 中过滤。

使用分页

  • 具有无限数据的页面可能会导致加载时间延长,达到调控器限制,并成为 随着数据集的增长而不可用。若要防止列表视图显示未绑定的数据,请执行以下操作: 使用列表控制器实现分页。默认情况下,列表控制器返回 20 每页记录数,但您可以将列表视图配置为一次最多显示 100 条记录。 要控制每个页面显示的记录数,请使用控制器扩展将 .pageSize
  • 使用 SOQL 子句编写逻辑 分页到 SOQL 中结果的特定子集。OFFSET

缓存经常访问的数据

缓存任何经常访问的数据,例如图标图形,并缓存全局数据 在自定义设置中。

Visualforce 页面有时会全局使用计算结果。页面使用相同的数据 跨用户和请求。要提高使用全局数据的页面的性能,请缓存 在自定义设置中计算结果,并定期刷新结果,而不是在 每个请求。自定义设置是应用程序缓存的一部分,不需要数据库 查询检索。在此方法与更新自定义缓存所需的时间之间取得平衡 数据。

延迟加载页面组件

若要减少或延迟成本高昂的计算,请使用延迟加载。使用延迟加载,页面 首先加载其基本组件,并延迟其他功能,直到用户执行 需要信息的操作。这种技术使用户能够更快地访问基本 功能,并使大页面看起来更具响应性,即使整个页面采用 加载的总时间相同。

要延迟加载 Visualforce 页面的某些部分,请使用以下技术:

  • 使用 Visualforce 组件上的 rerender 属性更新 组件,而不更新整个页面。
  • 使用 JavaScript 远程处理 调用控制器中的函数并检索辅助或静态数据。
  • 创建自定义组件以根据用户操作显示和隐藏数据。

延迟加载页面时,请考虑用户数和预期的数据量 页面。请注意并发 API 调用限制等限制。例如,如果 导航树仅根据需要加载元素,查询数量可能最终超出 与数据的比例。

处理多个并发请求

并发请求是长时间运行的任务,可以阻止其他待处理的任务。减少 延迟,尽可能将代码移动到异步代码块,并确保操作方法 使用组件是 轻。

<apex:actionPoller>

编写异步代码

若要卸载成本高昂的处理,请使用异步 JavaScript 和 XML (Ajax) 移动 异步代码块的非必要逻辑。例如,对于仅使用 同步代码,用户单击按钮并等待长时间运行的任务完成 在他们看到确认消息之前。相反,如果页面将长时间运行的 任务进行异步处理,则控件会立即返回给用户。您可以 将页面配置为在任务完成时通知用户。

保持 <apex:actionPoller> 轻量级

该组件是一个计时器,它 发出 Ajax 请求。使用该组件的页面在服务器上发出连续请求。如果 用户长时间打开页面或在同一页面上打开多个窗口 页面(例如,获取多个帐户的详细信息)会降低性能。<apex:actionPoller><apex:actionPoller>

为避免性能下降,请避免执行 DML、外部服务调用等 调用的操作方法中的资源密集型操作。仔细考虑重复调用的动作方法的效果 间隔。当该方法用于广泛分布或 持续活跃的页面。<apex:actionPoller><apex:actionPoller>

为避免达到调控器限制,请增加 Ajax 请求之间的时间间隔。组件的 interval 属性 以秒为单位测量 Ajax 更新请求之间的时间间隔。此值必须为 5 秒或更大,如果未指定,则默认为 60 秒。<apex:actionPoller>

该组件适用于 不需要昂贵处理的页面,但适用于计算需要的页面 更多的服务器时间,请考虑将组件与 JavaScript 一起使用 远程处理 相反。这种替代方法需要更多的代码,但提供了更大的灵活性和 效率。<apex:actionPoller><apex:actionFunction>

写入高效的 Apex 和 SOQL

自 提高整体性能 一个 视觉力 页面,写入效率高 Apex 和 SOQL。

当您编写 Apex 或 SOQL 以在 Visualforce 页面中使用时:

  • 尽可能在 SOQL 中执行计算,而不是在 Apex 中执行计算。
  • 切勿在循环中执行数据操作语言 (DML) 操作。
  • 首先在 SOQL 中过滤,然后在 Apex 中过滤,最后在 Visualforce 中过滤。

编写高效的 getter 方法

Visualforce 请求评估表达式、操作属性和其他方法调用。一个 表单提交等请求可以多次调用类中的 getter 方法。跟 更有效的 getter 方法,您可以防止不必要的查找 记录。

若要减少每个请求的处理负载,请缓存属性计算的值,以便 其他调用可以在不重新计算值的情况下访问该属性。

您还可以在 Apex 类中配置 getter 方法,使其仅在 object 为 null。例如,以下代码片段返回关联的客户记录 与页面。在第一次方法调用时,该方法查询记录,因为 MyAccount 对象为 null。在后续调用中,它将返回对象的存储值,该值 防止其他相同的查询:SELECT


 Account MyAccount;
 public Account getMyAccount() {
    if (MyAccount == null) {
            MyAccount = [SELECT name, annualRevenue FROM Account
            WHERE
            id = :ApexPages.currentPage().getParameters().
            get('id')];
        }
    return MyAccount;
 }

优化列表和表格

要提高包含列表和表格的 Visualforce 页面的性能,请限制数量 每页显示的数据,并减少每个表的可编辑字段数。您还可以 实现分页或将组件替换为静态 HTML 表。

<apex:pageBlockTable>

如果可能,避免使用数据网格

数据网格是显示具有可编辑字段的记录的表。数据网格频繁 扩展到页面上的数千个输入组件,并超过最大视图状态大小。 大型数据网格会导致 Visualforce 组件树的处理速度较慢。

如果您的 Visualforce 页面有数据网格:

  • 使用分页和过滤器。
  • 若要减小视图状态大小,请尽可能将数据设置为只读。
  • 仅显示给定记录的基本数据。提供指向基于 Ajax 的详细信息的链接 框或到单独的详细信息页面。

考虑静态 HTML 表格

具有迭代组件的 Visualforce 页面最多可以包含 1,000 个项目,或者当 页面以只读模式执行。但是,页面性能有时会在之前下降 如果包含具有 Render 属性的组件,则此限制 明确指定。<apex:pageBlockTable><apex:pageBlockTable><apex:column>

如果您的 Visualforce 页面包含大型表格,我们建议您实现分页。 或者,您可以使用静态 HTML 表而不是组件。在 HTML 表中,使用组件循环访问 HTML 行 元素。有关使用 的示例 HTML 表,请参阅 apex:repeat 组件 参考页面。<apex:pageBlockTable><apex:repeat><apex:repeat>

注意

与表格不同,静态 HTML 表没有标准的 Salesforce 样式。<apex:pageBlockTable>

优化视图状态

为了维护 Visualforce 页面的视图状态,Lightning Platform 会存储 组件、字段值和控制器作为隐藏表单元素中的加密字符串。 视图状态的限制为 170 KB。大型视图状态需要更长的处理时间 每个请求,包括序列化和反序列化时间,以及加密和解密 时间。如果减小视图状态大小,则页面加载速度更快,停滞更少 经常。

要检查 Visualforce 页面的视图状态,请设置“开发模式”和“显示视图状态” 在开发模式下的用户权限。开发模式页脚中的“视图状态”选项卡 显示视图状态的分布。确保您知道每个视图的状态大小 页面,并使用大量数据进行测试,以防止部署后可能出现的问题。

要减少视图状态,请执行以下操作:

  • 使用筛选器和分页来减少需要状态的数据。
  • 使用关键字声明实例变量 如果该变量仅对当前请求有用。不包括瞬态变量 在视图状态中。transient
  • 优化 SOQL 调用,以仅返回与 Visualforce 页面相关的数据。
  • 减少页面所依赖的组件数量。
  • 将数据设置为只读。使用组件而不是组件。<apex:outputText><apex:inputField>
  • 使用 JavaScript 远程处理。与组件不同,JavaScript 远程处理不需要组件。JavaScript 远程处理不会 降低页面的整体视图状态,但您的页面通常性能更好,而没有 需要传输、序列化和反序列化视图状态。权衡是损失 reRender 属性和其他 JavaScript 代码的必要性 处理回调。<apex:actionFunction><apex:form>

优化 HTML

在服务器上 Visualforce 验证 HTML 的一侧, 优化 HTML 改进了处理 效率。 在客户端,优化的 HTML 使 Visualforce 页面在用户的 浏览器。

要优化 Visualforce 中的 HTML 页:

  • 查看 Visualforce 组件生成的 HTML。Visualforce 页面更正无效 编译期间的 HTML,这可能会导致 这 HTML 以意外的方式呈现。例如,如果您的标签内有一个 or 标签,则 Visualforce 页面会在 运行时间。<head><body><apex:page>
  • 查看 Ajax 代码。 在阿贾克斯期间 请求,以确保响应正确地适合 DOM的, 服务器验证并更正入站 HTML。 处理时间 减少 如果 您的 Visualforce 页面包含有效的标记,以及是否需要更正。
  • 减少 HTML 膨胀。虽然浏览器缓存 HTML 和 编译的 Visualforce 标记,从缓存中检索它们会影响性能。必要 HTML 还增加了组件树的大小和 Ajax 的处理时间 请求。

优化 CSS

为确保 高效交付给客户, 优化 Visualforce 中的 CSS 页。 优化的 CSS 还改进了缓存并减少了 负荷 次。

改进 CSS 一个 Visualforce 页面:

  • 外部化样式表。从 Visualforce 页面中删除内联 CSS 代码,并将其放在 单独的 CSS 文件。这种做法会增加初始 HTTP 请求的数量,但会减少 单个页面的大小。浏览器缓存样式表后,整体请求 尺寸减小。
  • 将所有 CSS 文件合并到一个文件中,从而减少 HTTP 请求的数量。
  • 删除注释和多余的空格。压缩生成的文件以加快速度 下载。
  • 使用静态资源提供 CSS 文件。以这种方式提供的样式表受益于 缓存和 Salesforce 中内置的内容分发网络 (CDN)。
  • 对于不使用 Salesforce CSS 文件的页面,请将标记的 showHeaders 和 standardStylesheets 属性设置为 .这种做法排除了标准 生成的页眉中的 Salesforce CSS 文件。<apex:page>false

优化 JavaScript的

为确保 高效交付给客户, 优化 Visualforce 中的 JavaScript 页面 优化的 JavaScript 还改进了缓存和 减少 加载时间。

为了改进 JavaScript的 在 一个 Visualforce 页面:

  • 外部化 JavaScript 文件。此过程会增加初始 HTTP 请求的数量, 但它也减小了单个页面的大小并利用了浏览器 缓存。
  • 仅使用您需要的函数构建 JavaScript 库的自定义版本。这 进程显著减小了 JavaScript 文件的大小。许多开源 JavaScript 库(如 jQuery)提供此选项。
  • 减少 HTTP 请求者 结合 将所有 JavaScript 文件合并为一个 文件。 删除可能导致多个 HTTP 的重复函数 请求。
  • 删除注释和空格。压缩生成的文件以加快下载速度。
  • 使用静态资源提供 JavaScript 文件。JavaScript 以这种方式提供服务 好处 来自 Salesforce 内置的缓存和内容分发网络 (CDN)。
  • 将脚本放在页面底部。如果脚本直接在结束标记之前加载,则页面可以下载其他组件 首先,逐步呈现页面。</body>注意仅将 JavaScript 移动到页面底部 如果你确定 那 它没有任何不良影响 影响。 例如,不要从元素中移动需要 或 事件处理程序的 JavaScript 代码片段。document.write<head>
  • 而不是 使用标签, 考虑 直接在之前使用标准 HTML 标记 您的结束标签。 标记将 JavaScript 置于正确的位置 在关闭元素之前,这会导致 浏览器尝试加载 JavaScript,然后再在 页。<apex:includeScript><script></apex:page><apex:includeScript></head>

优化图像

图像通常是网页中最大的组成部分,因此它们会显着影响 Visualforce 页面的性能。

要最大程度地减少映像对性能的影响,请执行以下操作:

  • 使用更少的图像和较小的背景纹理。
  • 尽可能使用 CSS 而不是图像。
  • 使用 CSS 精灵而不是单个图像。使用 CSS 精灵,您可以将 将大小相似的图形(如按钮和图标)集合到单个文件中。然后 您可以使用 CSS background-image 和 background-position 属性来显示组合的部分 图像。由于此技术减少了使用的图像数量,因此 HTTP 请求的数量 发送量也减少。缓存一个 Sprite 文件也比缓存多个 Sprite 文件更有效 图像。
  • 使用静态资源提供图像。以这种方式提供的图像受益于缓存和 Salesforce 中内置的内容分发网络 (CDN)。
  • 压缩图像。图形工具通常使用默认设置,这些设置有利于视觉保真度 保存图像时压缩和添加元数据。图像压缩工具可以减少 在不降低视觉质量的情况下,图像的文件大小最多可减少 30%。

提示

要改进开发工作流程,请添加压缩图像的脚本 资产。

防止字段从页面上删除

具有许多字段的 Visualforce 页面,尤其是具有大型文本区域字段的页面 或 通过与其他实体的主从关系,可以 失败 以显示请求的每个字段。由于批处理限制和限制,数据可能会被删除 数据大小 返回。 为防止字段从页面上删除,请减少显示的字段数。 或者 创建一个 控制器扩展,可以查询子记录并在相关中显示结果 列表。

注意

在可能的情况下,我们更改了非包容性条款,以符合我们公司的平等价值观。 我们保留了某些条款,以避免对客户实施产生任何影响。

谨慎使用 immediate 属性

具有属性的 Visualforce 组件 设置为在不处理任何操作的情况下执行操作 页面上关联字段的验证规则。仅当以下情况时,才应使用此属性 该组件执行一个操作,该操作在完成后导航离开页面。

immediatetrue

当组件行为包含基本导航以外的内容时,会出现功能问题 功能性。因为不会更新 页面的数据模型,页面的数据模型不会反映在操作期间所做的任何更改。 这种差异可能会导致未定义的行为和可能的数据损坏。immediate=”true”

建议仅在取消时使用 immediate 属性 行动。下面的示例演示此属性的正确用法。当用户 单击“取消”,组件将立即执行,无需用户修复 验证错误。<apex:CommandLink>cancelApplication

<apex:CommandLink action="{!cancelApplication}" value="Cancel" styleClass="btn" id="btnCancel" immediate="true">

Visualforce 性能案例研究

要了解 Visualforce 性能优化如何协同工作,请查看以下方法 减少具有大型数据网格和复杂对象的页面的加载时间 等级制度。

想象一下,您有一个带有数据网格的 Visualforce 页面,用于收集销售预测。这 预测的数据模型包含多级对象层次结构。该页面还包含 用于显示透视数据的计算。对于普通用户,网格包含大约 1,500 个 单元格,这会导致页面加载缓慢并达到堆和视图状态限制。

要优化页面性能,您可以:

  • 使页面有针对性且以任务为中心。对输入和聚合使用同一页面 报告增加了不必要的复杂性。
  • 创建一个自定义对象来保存用于报告的聚合数据。删除所需的公式 显示聚合数据可减小堆大小。
  • 避免在单个页面上显示每个帐户。实现分页,从而改进页面 加载速度并减小视图状态的大小。
  • 将数据网格单元格设置为只读。让用户选择要编辑的单元格,然后使用 Ajax 保存用户的编辑。这些做法减小了视图状态的大小。

使用 Lightning 消息服务跨 DOM 进行通信

使用 Lightning 消息服务在 Lightning 页面内的 DOM 之间进行通信。 在同一 Lightning 页面中嵌入的 Visualforce 页面、Aura 组件和 Lightning Web 组件,包括实用程序栏中的组件和弹出式实用程序。选择 组件是订阅来自整个应用程序的消息,还是仅订阅来自活动应用程序的消息 面积。

如果您要从 Salesforce Classic 切换到 Lightning Experience,您现在可以构建 可以与现有 Visualforce 页面或 Aura 组件进行通信的 Lightning Web 组件。 您还可以使用 Lightning 消息服务通过 Open CTI 与软件电话进行通信。

重要

Lightning 消息服务在 Lightning Experience 中提供,并作为 Experience Builder 站点中使用的 Lightning 组件的测试版功能。

要在 Visualforce 中访问 Lightning 消息服务,请使用全局变量。消息是可序列化的 JSON 对象。示例 可以在消息中传递的数据包括字符串、数字、对象和布尔值。一条消息 不能包含函数和符号。全局变量仅在 Lightning Experience 中可用。$MessageChannel$MessageChannel

使用在组织内创建的消息通道

以下是使用在您的组织内开发的 Lightning 消息通道的示例。

<apex:page>
    <script>
        // Load the MessageChannel token in a variable
        var SAMPLEMC = "{!$MessageChannel.SampleMessageChannel__c}";
    </script>
</apex:page>

在这里,我们引用一个带有公式表达式的自定义消息通道。此表达式 创建一个我们分配给变量的令牌。 此令牌对于您的自定义消息通道是唯一的,可以在 Lightning 消息中使用 服务 API 方法。语法引用元数据类型的自定义实例。后缀表示它是自定义的, 但请注意,它不是自定义对象。有关详细信息,请参阅创建消息通道。{!$MessageChannel.SampleMessageChannel__c}SAMPLEMCSampleMessageChannel__cLightningMessageChannel__c

如果您的组织具有命名空间,请不要将其包含在消息通道表达式中。例如 如果组织的命名空间是 MyNamespace,则消息通道表达式仍为 。“{!$MessageChannel.SampleMessageChannel__c}”

使用在组织外部创建的消息通道

要使用来自组织外部的开发人员创建的包的消息通道,请参考 他们用语法。例如,如果不是您的组织的本地用户,并且来自 命名空间为 SamplePackageNamespace 的包,语法为 .{!$MessageChannel.Namespace_name__c}SampleMessageChannel{$MessageChannel.SamplePackageNamespace__SampleMessageChannel__c}

  • 创建消息通道
    要在组织中创建 Lightning 消息通道,请使用 LightningMessageChannel 元数据类型。
  • 在消息通道
    上发布 要从 Visualforce 页面在消息通道上发布,请在页面的 JavaScript 代码中包含全局变量,并编写调用 .$MessageChannelsforce.one.publish()
  • 订阅和取消订阅消息通道 若要订阅和取消订阅消息通道
    ,请使用 和 方法。sforce.one.subscribe()sforce.one.unsubscribe()
  • 注意事项和限制
    在 Visualforce 中使用 Lightning 消息服务时,请牢记这些注意事项和限制。

创建消息通道

要在您的组织中创建 Lightning 消息通道,请使用 LightningMessageChannel 元数据类型。

注意

请参阅《元数据 API 开发人员指南》中的 LightningMessageChannel(可以是 在发布预览期间已过时或不可用)。

要将 LightningMessageChannel 部署到您的组织中,请创建一个 SFDX 项目。包括 XML force-app/main/default/messageChannels/ 目录中的定义。这 LightningMessageChannel 文件名遵循 .messageChannel-meta.xml 格式。要将其添加到临时组织,请运行 。要将其添加到其他类型的组织, 例如沙盒或 Developer Edition 组织,请运行 .messageChannelNamesfdx force:source:pushsfdx force:source:deploy

在消息通道上发布

要从 Visualforce 页面在消息通道上发布,请在页面的 JavaScript 代码中包含全局变量 并编写一个调用 .

$MessageChannelsforce.one.publish()

github.com/trailheadapps/lwc-recipes 存储库中的页面演示如何发布 选择联系人时在 Lightning 页面上通知订阅者的消息。

lmsPublisherVisualforce

以下示例演练了 Visualforce 页面标记,以演示如何发布到 单击按钮时的消息通道。

在页面的 JavaScript 中,我们首先获取对自定义 Lightning 消息通道的引用 使用公式表达式 。此表达式创建一个令牌,该令牌 对于您的消息频道是唯一的。然后,我们将令牌作为字符串分配给变量 。{!$MessageChannel.SampleMessageChannel__c}SAMPLEMC

该函数包含以下消息 我们想要发布的内容。在这里,消息是值为 “some string” 和 ,其值是键值对值 value: “some value”。然后我们调用 Lightning 消息服务 API 的方法 对象。该函数采用两个参数,一个包含消息通道的字符串 令牌和消息负载。handleClick()recordIdrecordDatapublish()sforce.onepublish()

在页面标记中,我们创建一个按钮并调用它的方法。handleClick()onclick()

<apex:page >
    <script>
    // Load the MessageChannel token in a variable
    var SAMPLEMC = "{!$MessageChannel.SampleMessageChannel__c}";
    function handleClick() {
        const payload = {
            recordId: "some string",
            recordData: {value: "some value"}
        }
        sforce.one.publish(SAMPLEMC, payload);
      }
    </script>
    <div>
    <p>Publish SampleMessageChannel</p>
    <button onclick="handleClick()">Publish</button>
    </div>
</apex:page>

订阅和取消订阅消息通道

若要订阅和取消订阅消息通道,请使用 和 方法。

sforce.one.subscribe()sforce.one.unsubscribe()

github.com/trailheadapps/lwc-recipes 存储库中的页面显示如何订阅和取消订阅消息通道。

lmsSubscriberVisualforceRemoting

以下示例是“在消息通道上发布”中示例的延续,该示例允许您订阅和取消订阅 从消息通道中单击相应的按钮。在 JavaScript 中,我们 具有 and 方法,并使用消息输出填充subscribeMC()unsubscribeMC()onMCPublished()textarea

将自定义消息通道加载到变量 中。全局变量为 关联的消息通道。在 下 , 我们 声明 保存从该方法返回的 Subscription 对象。$MessageChannel.SampleMessageChannel__cSAMPLEMC$MessageChannelSAMPLEMCsubscriptionToMCsforce.one.subscribe()

该方法检查 订阅对象为空。如果是,则调用该方法。 有两个参数, 订阅消息通道,以及处理消息输出的方法。subscribeMC()sforce.one.subscribe()sforce.one.subscribe()onMCPublished()默认情况下,通过消息通道的通信只能在 活动导航选项卡、活动导航项或实用程序项。效用 项目始终处于活动状态。导航选项卡或项目在选中时处于活动状态。 导航选项卡和项目包括:

  • 标准导航选项卡
  • 控制台导航工作区选项卡
  • 控制台导航子选项卡
  • 控制台导航项

若要从应用程序中的任何位置接收消息通道上的消息,请使用该方法的可选 第四个参数 .将 设置为值。

sforce.one.subscribe()subscriberOptionsscopesubscriberOptions“APPLICATION”

sforce.one.subscribe(messageChannel, listener, {scope: "APPLICATION"});

该方法检查是否 有一个订阅对象。如果是这样,它将调用 并传入对象。然后,它清除对象。unsubscribeMC()sforce.one.unsubscribe()subscriptionToMCsubscriptionToMC

该方法将 消息有效负载从 JSON 对象转换为字符串。然后,它会在 ID 中显示消息。onMCPublished()textareaMCMessageTextArea

<apex:page >
    <div>
        <p>Subscribe to SampleMessageChannel </p>
        <button onclick="subscribeMC()">Subscribe</button>
        <p>Unsubscribe from subscription</p>
        <button onclick="unsubscribeMC()">Unsubscribe</button>
        <br/>
        <br/>
        <p>Received message:</p>
    <textarea id="MCMessageTextArea" rows="10" style="disabled:true;resize:none;width:100%;"/>
    </div>

    <script>
        // Load the MessageChannel token in a variable
        var SAMPLEMC = "{!$MessageChannel.SampleMessageChannel__c}";
        var subscriptionToMC;

        function onMCPublished(message) {
            var textArea = document.querySelector("#MCMessageTextArea");
            textArea.innerHTML = message ? JSON.stringify(message, null, '\t') : 'no message payload';
        }

        function subscribeMC() {
            if (!subscriptionToMC) {
                subscriptionToMC = sforce.one.subscribe(SAMPLEMC, onMCPublished);
            }
        }

        function unsubscribeMC() {
            if (subscriptionToMC) {
                sforce.one.unsubscribe(subscriptionToMC);
                subscriptionToMC = null;
            }
        }
    </script>

</apex:page>

注意事项和限制

在使用 Lightning 消息时,请牢记这些注意事项和限制 Visualforce 中的服务。考虑闪电消息服务不适用于 在 Chatter 中加载页面时的 Visualforce 库 使用 .请改用本机 Lightning Publisher。sforce.one<chatter:feed showPublisher=”true”/>Lightning 消息服务在 Lightning 中包含的 Visualforce 页面中不起作用 通过 iframe(包括 、 和标准 HTML 标记)进行体验。相反,请通过 Lightning 应用程序生成器或作为实用程序栏项目。<wave:dashboard><apex:iframe><iframe>Visualforce 仅支持 Lightning 消息通道,其中为 true。有关 LightningMessageChannel 的更多信息,请参阅元数据 API 开发人员指南。isExposed闪电消息服务在 Salesforce Classic 中或预览 Visualforce 时不起作用 从设置。局限性闪电消息服务仅支持这些 经验。

  • Lightning Experience 标准导航
  • Lightning Experience 控制台导航
  • 适用于 Aura 和 Lightning Web 组件的 Salesforce 移动应用程序,但不适用于 Visualforce 页面
  • Experience Builder 站点中使用的 Lightning 组件。对 Experience Builder 的支持 网站是测试版。注意闪电消息服务 不 在 Experience 中使用 Salesforce 选项卡 + Visualforce 站点或 Visualforce 页面 建设者网站。