产品授权推广登录面向跨产品合作推广:推广方产品在用户授权后,将用户信息提交给 PartnerShare,PartnerShare 生成携带推广关系的跳转链接和一次性授权码。
被推广方产品用授权码换取用户信息,完成自动注册或登录,并回传注册事件完成归因与分佣。
授权中继、推广关系维护、授权码换码、注册归因和分佣结算由 PartnerShare 承接,双方无需重复建设。
1. 核心概念 #
| 概念 | 说明 |
|---|---|
| 推广方产品 | 发起授权并导流用户的一方。用户已在推广方产品内登录,授权后由推广方跳转至被推广方产品 |
| 被推广方产品 | 接收用户并完成注册或登录的一方。通过授权码向 PartnerShare 换取用户信息,注册完成后回传注册事件 |
| PartnerShare | 授权中继与推广归因平台。生成授权码、维护推广关系、返回推广链接、校验授权码、接收注册事件并支持分佣结算 |
x_auth_code | 一次性短时授权码,被推广方服务端用于换取授权用户信息,不可作为登录凭证 |
ps_ref | 推广邀请码,随推广链接传递到被推广方产品,用于注册事件回传和归因 |
user_key | PartnerShare 返回的授权用户唯一标识,被推广方产品基于它建立本地用户绑定 |
| 推广链接 | PartnerShare 返回给推广方的跳转链接,指向被推广方落地页,携带 ps_ref 和 x_auth_code |
| 注册事件 | 被推广方完成自动注册或首次有效转化后回传的事件,用于归因、统计和分佣结算 |
2. 前置要求 #
2.1 注册品牌主后台账号 #
注册并登录 PartnerShare 品牌主后台:https://share.partnershare.com/nueshawu

2.2 完成产品基础配置 #
在后台创建并保存产品,完成基础信息、奖励规则、追踪集成和 API 对接配置。

2.3 填写推广 URL #
推广 URL 是用户最终跳转到被推广方产品的落地页地址。PartnerShare 生成推广链接时在该地址上追加 ps_ref 和 x_auth_code。

2.4 创建联盟计划活动 #
被推广方产品需要创建联盟计划活动,用于承接推广方加入、推广关系生成、归因统计和分佣结算,也是生成推广落地链接的前置条件。

2.5 确认活动处于进行中 #
确认活动已在对应产品下生成、类型为联盟计划且处于进行中。活动未开始、已暂停或已结束时,推广链接生成、注册归因或分佣结算无法正常完成。

推广 URL、联盟计划活动及其状态是影响授权跳转和注册归因的关键配置,接口联调前先确认。
3. 流程图 #

4. 通用约定 #
4.1 请求 #
| 项目 | 说明 |
|---|---|
| 请求域名 | https://api-service.partnershare.net |
| 接口前缀 | /api/open/v1 |
| 请求格式 | POST 接口使用 application/json,Raw JSON |
| 支持的 API Key 版本 | v1、v2 |
| 调用方式 | 由服务端发起,不在前端暴露 API Secret |
4.2 响应 #
{
"code": 0,
"message": "Success",
"data": {}
}
| 字段 | 类型 | 说明 |
|---|---|---|
code | int | 0 成功,非 0 失败。业务失败也返回 HTTP 200 |
message | string | 提示信息(英文) |
data | object / array / null | 业务数据,失败时为 null |
4.3 落地页 URL 参数 #
用户跳转到被推广方落地页时,URL 携带以下参数:
| 参数 | 类型 | 说明 |
|---|---|---|
ps_ref | string | 推广邀请码,注册事件回传时作为 invite_code 传入 |
x_auth_code | string | 一次性授权码,交由被推广方服务端换取用户信息 |
https://example.com/landing?ps_ref=abc123&x_auth_code=AUTH_CODE_EXAMPLE
4.4 字段约定 #
| 字段 | 类型 | 说明 |
|---|---|---|
product_key | string | 推广方产品标识 |
target_product_key | string | 被推广方产品标识 |
user_id | string | 推广方产品内的用户唯一标识 |
x_auth_code | string | 一次性授权码 |
ps_ref | string | 推广邀请码 |
user_key | string | PartnerShare 返回的授权用户唯一标识 |
5. 鉴权 #
所有接口需携带 API Key 签名请求头,签名由服务端生成。API Key 与 API Secret 在品牌主后台「产品管理 → 基础设置 → 开发者集成」获取,签名算法按密钥版本执行,见 API 鉴权与签名机制。
| Header | 必填 | 说明 |
|---|---|---|
X-Api-Key | 是 | 产品的 API Key |
X-Api-Timestamp | 是 | 秒级 Unix 时间戳,300 秒内有效 |
X-Api-Sign | 是 | 按密钥版本计算的签名 |
Content-Type | 是 | POST 接口使用 application/json |
6. 接口 #
6.1 生成推广授权链接 #
/api/open/v1/oauth/authorize推广方产品在用户完成授权后调用。PartnerShare 生成一次性授权码,返回携带 ps_ref 与 x_auth_code 的推广链接,由推广方自行控制跳转。调用方:推广方产品服务端。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
product_key | string | 是 | 推广方产品 key,必须与当前 API Key 所属产品一致 |
target_product_key | string | 是 | 被推广方产品 key。需指定被推广方的具体活动时,使用 产品key#活动key 格式 |
user_id | string | 是 | 推广方产品内稳定的用户唯一标识 |
extra | object | 否 | 扩展用户信息,如 user_name、email、locale,供被推广方补全资料 |
{
"product_key": "your_product_key",
"target_product_key": "target_product_key",
"user_id": "source_user_001",
"extra": {
"user_name": "Demo User",
"email": "demo@example.com",
"locale": "zh"
}
}
| 响应字段 | 类型 | 说明 |
|---|---|---|
code | string | 一次性授权码,即跳转链接中的 x_auth_code |
redirect_url | string | 被推广方落地页链接,已携带 ps_ref 与 x_auth_code |
{
"code": 0,
"message": "Success",
"data": {
"code": "2fwth3pfj8",
"redirect_url": "https://target.example.com/landing?ps_ref=INVITE_CODE&x_auth_code=2fwth3pfj8"
}
}
直接使用 redirect_url 跳转,不要在业务侧重新拼接链接。x_auth_code 有效期 5 分钟,不作为长期凭证保存。
6.2 授权并直接跳转 #
/api/open/v1/oauth/authorizeAndRedirect由 PartnerShare 完成授权处理并直接返回 302,跳转到携带 ps_ref 与 x_auth_code 的被推广方落地页。适用于点击后立即跳转的场景;需要先拿到链接再自行控制跳转时使用 6.1。调用方:推广方产品服务端。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
product_key | string | 是 | 推广方产品 key |
target_product_key | string | 是 | 被推广方产品 key |
user_id | string | 是 | 推广方产品内稳定的用户唯一标识 |
extra | string | 否 | JSON 字符串格式的扩展用户信息 |
GET /api/open/v1/oauth/authorizeAndRedirect?product_key=your_product_key&target_product_key=target_product_key&user_id=source_user_001 HTTP/1.1
Host: api-service.partnershare.net
X-Api-Key: pk_xxxxxxxxxxxxxxxxxxxxx
X-Api-Timestamp: 1776677721
X-Api-Sign: {signature}
成功响应:
HTTP/1.1 302 Found
Location: https://target.example.com/landing?ps_ref=INVITE_CODE&x_auth_code=2fwth3pfj8
失败响应:
{
"code": 1000001,
"message": "The target product was not found or is not accessible",
"data": null
}
6.3 通过授权码获取用户信息 #
/api/open/v1/oauth/getUserByAuthorizationCode被推广方落地页接收到 x_auth_code 后,由服务端调用本接口换取授权用户信息,再基于 user_key 完成本地账号绑定、自动注册或登录。调用方:被推广方产品服务端。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | 是 | 落地页接收到的 x_auth_code。字段名为 code |
{
"code": "2fwth3pfj8"
}
| 响应字段 | 类型 | 说明 |
|---|---|---|
user_key | string | 授权用户唯一标识,用于本地用户绑定 |
user_name | string | 授权用户展示名称 |
ref | string | 推广方产品名称 |
ref_product_key | string | 推广方产品 key |
locale | string | 用户语言偏好 |
extra | object | 推广方传入的扩展用户信息 |
{
"code": 0,
"message": "Success",
"data": {
"user_key": "uk_abc123xyz",
"user_name": "Demo User",
"ref": "Source Product",
"ref_product_key": "source_product_key",
"locale": "zh",
"extra": {
"user_name": "Demo User",
"email": "demo@example.com",
"locale": "zh"
}
}
}
- 授权码只能成功兑换一次,兑换后立即失效;有效期 5 分钟,过期需重新发起授权。
- 当前 API Key 所属产品必须是该授权码对应的被推广方产品。
- 接口不返回推广方产品内部的原始用户 ID。
| code | message | 原因 |
|---|---|---|
1000005 | The authorization code is required | 缺少 code |
1000004 | The authorization code has expired | 授权码超过 5 分钟 |
1000004 | The authorization code is invalid or has already been used | 授权码不存在或已兑换 |
1000004 | The authorization code cannot be used for this product | API Key 所属产品与授权目标产品不一致 |
6.4 获取调试授权码 #
/api/open/v1/oauth/getDebugAuthCode联调阶段生成测试授权码,用于验证落地页接收参数、服务端换码、自动注册、登录和注册事件回传流程。仅用于调试,正式流程使用 6.1 或 6.2。调用方:被推广方产品服务端,被推广方产品即当前 API Key 所属产品。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
source_product_key | string | 是 | 推广方产品 key |
user_id | string | 否 | 调试用户 ID,不传时自动生成 |
extra | object | 否 | 调试用户扩展信息,不传时使用默认调试资料 |
{
"source_product_key": "your_product_key",
"user_id": "debug_user_001",
"extra": {
"user_name": "OAuth Debug User",
"email": "debug_user@example.com",
"locale": "zh"
}
}
{
"code": 0,
"message": "Success",
"data": {
"code": "debug_code_example",
"redirect_url": "https://target.example.com/landing?ps_ref=INVITE_CODE&x_auth_code=debug_code_example"
}
}
6.5 回传注册事件 #
/api/open/v1/track/conversion被推广方完成自动注册或确认有效转化后回传注册事件,PartnerShare 按推广邀请码归因并用于分佣结算。完整参数见 推广转化事件回传。本场景下,落地页接收到的 ps_ref 作为 invite_code 传入。调用方:被推广方产品服务端。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
event_name | string | 是 | 注册事件固定传 signup |
invited_user_id | string | 是 | 被推广方产品内的本地用户唯一标识 |
invite_code | string | 是 | 落地页 URL 中的 ps_ref |
invited_user_name | string | 否 | 被推广方产品内的用户展示名称 |
click_id | string | 否 | 点击 ID。不确定 ps_ref 的归因类型时,可与 invite_code 传入相同值 |
{
"event_name": "signup",
"invited_user_id": "local_user_10001",
"invited_user_name": "Demo User",
"invite_code": "INVITE_CODE"
}
{
"code": 0,
"message": "Signup event reported successfully",
"data": {
"conversion_id": 10001,
"campaign_id": 20001,
"affiliate_id": 30001,
"event_type": 1,
"event_name": "signup",
"status": 1
}
}
- 注册事件在本地用户创建成功或确认有效注册后回传;同一
invited_user_id只回传一次。 - 后续付费事件基于同一
invited_user_id上报purchase。
6.6 调用顺序 #
- 推广方服务端调用
POST /api/open/v1/oauth/authorize获取推广链接。 - 推广方将用户跳转至
redirect_url。 - 被推广方落地页接收
ps_ref与x_auth_code。 - 被推广方服务端调用
POST /api/open/v1/oauth/getUserByAuthorizationCode换取用户信息。 - 被推广方基于
user_key完成本地自动注册或登录。 - 被推广方调用
POST /api/open/v1/track/conversion,将ps_ref作为invite_code回传注册事件。
7. 常见问题 #
| 问题 | 说明 |
|---|---|
提示 The API key and signature are required | 请求头缺少 X-Api-Key、X-Api-Timestamp 或 X-Api-Sign,或请求头名称拼写错误 |
提示 Signature verification failed | 密钥版本与算法不一致、使用了 API Key 而非 API Secret 签名、时间戳不是秒级,或签名内容与实际请求不一致。排查方法见 API 鉴权与签名机制 |
| 生成推广授权链接失败 | product_key 不属于当前 API Key;target_product_key 不存在;被推广方未完成基础配置或未填写推广 URL;被推广方没有可用的联盟计划活动或活动未处于进行中 |
推广链接没有 ps_ref 或 x_auth_code | 被推广方推广 URL 未配置或格式错误、联盟计划活动不可用、推广关系未生成,或业务侧重新拼接了 URL。直接使用返回的 redirect_url 跳转 |
| 落地页需要接收哪些参数 | x_auth_code 尽快提交到服务端换码;ps_ref 保留到注册事件回传阶段 |
| 换取用户信息失败 | 授权码已过期或已兑换、API Key 所属产品不是该授权码的被推广方产品、字段名错误(应传 code,不是 x_auth_code) |
| 授权码能否重复使用或作为登录凭证 | 不能。授权码一次性、5 分钟有效,兑换后失效。本地登录态和用户绑定基于 user_key 建立 |
如何处理 user_key | 按 user_key 查询本地绑定用户:存在则登录,不存在则创建本地用户并保存绑定关系,后续复用 |
| 注册事件回传后没有归因 | 未传 invite_code、invite_code 未使用落地页的 ps_ref、ps_ref 在注册流程中丢失、联盟计划活动不可用,或注册事件重复上报 |
ps_ref 与 invite_code 的关系 | ps_ref 是推广链接 URL 中的参数名,invite_code 是回传接口的字段名,取值相同 |
| 注册流程跨多个页面 | 落地页收到 ps_ref 后保存到服务端会话、短期缓存或安全 Cookie,注册成功时取出回传。不要只依赖页面参数传递 |
提示 A conversion event with the same business identifier already exists | 同一被推广方产品下相同 invited_user_id 的注册事件已上报。同一本地用户只回传一次,前端防重复点击,后端回调防重复触发 |
| 推广方是否需要自行创建推广账号或链接 | 不需要。首次发生授权推广登录时,PartnerShare 自动创建或复用推广关系并生成推广链接,推广方只需调用授权接口获取 redirect_url |
| 被推广方能否自行控制注册和登录逻辑 | 可以。PartnerShare 只负责授权中继、推广关系、换码和归因;本地账号创建、用户绑定、登录态和权限由被推广方负责 |
| 能否在前端直接调用换码接口 | 不能。换码接口需要签名,API Secret 只能在服务端。前端只把 x_auth_code 提交给自身服务端 |
extra 可以传什么 | 完成自动注册或登录所需的必要信息,如 user_name、email、locale。不传敏感数据或超出用户授权范围的数据 |
8. 链路检查清单 #
- 推广方可以成功获取
redirect_url,且其中包含ps_ref和x_auth_code。 - 被推广方落地页可以读取这两个参数。
- 被推广方服务端可以通过
x_auth_code换取用户信息。 - 被推广方可以基于
user_key完成自动注册或登录。 - 注册成功后可以将
ps_ref作为invite_code回传注册事件。 - PartnerShare 后台可以看到对应的归因和推广数据。