流量联盟

接入总览

大约 30 分钟能接完,代码改动不超过 20 行
Step 1

注册服务商

注册时选「我是服务商」,平台审核通过后进入「应用与回传」,拿到 app_id 与 app_secret。

Step 2

接收 click_id

在你的落地页(注册页)读取 URL 上的 click_id,注册成功时写进用户表。

Step 3

回传转化

注册成功或首单成交后,带着 click_id 与订单号调用回传地址,签名用 app_secret。

Step 4

发布活动

填写落地页地址与佣金规则,平台审核上线,推广者就能申请你的活动。

回传接口

GET https://8.1zb.com.cn/postback.php
参数必填说明
click_id是平台跳转时拼在你落地页 URL 上的参数
order_id是你侧业务唯一号,幂等键,重复回传只记一次
event否register / purchase / activate / refund,默认 register
amount否成交金额,CPS 与混合佣金按此计算,默认 0
sign是md5(click_id + order_id + amount + app_secret)

签名规则

sign = md5( click_id + order_id + amount + app_secret )

三个必须注意的点:

1. amount 必须格式化成两位小数的字符串,0 要写成 0.00,不能写 0。

2. 拼接时不要加任何分隔符,也不要对金额做四舍五入以外的处理。

3. 请求里的 amount 与参与签名的 amount 必须完全一致,建议先格式化再同时用于两处。

返回与错误码

返回HTTP含义
ok200记录成功
ok_dup200该订单已记录过,属于正常情况,不要重试
missing_params400缺 click_id / order_id / sign
sign_error403签名不对,重点查金额格式与密钥
unknown_click_id404click_id 不存在,可能没存下来或被改过
unknown_order404退款时找不到对应订单
server_error500平台侧异常,可重试并联系管理员
重试策略:只有 5xx 才需要重试;ok_dup 与 4xx 都不要重试,先查参数。

代码示例

复制后把 app_secret 换成你自己的

PHP

// 1) 落地页接收 click_id(注册页顶部) session_start(); if (!empty($_GET['click_id'])) { $_SESSION['click_id'] = $_GET['click_id']; } // 2) 注册成功后:落库 + 回传 $appSecret = '你的 app_secret'; $clickId = $_SESSION['click_id'] ?? ''; $orderId = 'U' . $newUserId; $amount = '0.00'; $sign = md5($clickId . $orderId . $amount . $appSecret); $query = http_build_query([ 'click_id' => $clickId, 'order_id' => $orderId, 'event' => 'register', 'amount' => $amount, 'sign' => $sign, ]); $res = file_get_contents('https://8.1zb.com.cn/postback.php' . '?' . $query); // $res: ok / ok_dup

Node.js

const crypto = require('crypto'); function postback({ clickId, orderId, amount = 0, event = 'register' }) { const secret = process.env.UNION_APP_SECRET; const amt = Number(amount).toFixed(2); // 必须两位小数 const sign = crypto.createHash('md5') .update(clickId + orderId + amt + secret) .digest('hex'); const qs = new URLSearchParams({ click_id: clickId, order_id: orderId, event, amount: amt, sign }); return fetch('https://8.1zb.com.cn/postback.php' + '?' + qs.toString()) .then(r => r.text()); // ok / ok_dup }

Java

String secret = "你的 app_secret"; String amount = String.format("%.2f", amountValue); // 0 -> 0.00 String raw = clickId + orderId + amount + secret; String sign = DigestUtils.md5Hex(raw); String url = "https://8.1zb.com.cn/postback.php" + "?click_id=" + URLEncoder.encode(clickId, "UTF-8") + "&order_id=" + URLEncoder.encode(orderId, "UTF-8") + "&event=register&amount=" + amount + "&sign=" + sign;

click_id 怎么存

最省事的做法是给你的用户表加一个字段,注册时写入,之后成交直接取用:

ALTER TABLE users ADD COLUMN click_id CHAR(32) NOT NULL DEFAULT ''; ALTER TABLE users ADD INDEX idx_click (click_id);

如果注册页和成交页不在同一个域,click_id 会丢,建议:

1. 注册时先写进隐藏表单,随注册请求一起提交。

2. 或者注册成功后立刻回传 register,成交时用 order_id 关联用户,不需要再带 click_id。

3. 落地页跳转中间有重定向时,记得把 query 透传下去。

退款与撤单

用户退款后,用同一个 order_id 再回传一次,event 设为 refund:

GET https://8.1zb.com.cn/postback.php?click_id=xxx&order_id=U10086&event=refund&amount=199.00&sign=xxx

平台的处理:

1. 转化标记为「已退款」,佣金从推广者余额扣回。

2. 未过退款期的佣金本来就没入账,只做标记。

3. 重复退款返回 ok_dup,不会重复扣。

退款同样要带 click_id:从用户表里取当初存下的值即可,不需要用户重新点击。

退款请在发现后 7 天内回传;超过结算周期的退款平台会走人工对账。

常见问题

同一个用户重复注册会不会重复计佣?

不会。幂等键是「服务商 + order_id」,同一个 order_id 无论回传多少次只记一条。

回传延迟有没有影响?

没有。click_id 永久有效,隔几天再回传也能正常归因。

CPS 的金额填什么?

填订单实付金额,不含运费与优惠前原价,平台按活动设置的比例算佣金。

怎么自测?

在「应用与回传」页用签名自测工具生成一条测试链接,点一次你的推广链接产生 click_id,再用它回传 register,后台能看到记录就说明通了。

密钥能换吗?

能。在「应用与回传」重置,旧密钥立即失效,记得同步更新线上代码。

能不能不用签名?

不行。没有签名任何人都能伪造转化,佣金会被刷。

上线自查清单

序号检查项
1落地页能正确读到 click_id,并写进了用户表(或 session)
2回传的 amount 是两位小数字符串,与签名用的完全一致
3order_id 全局唯一,重试不会产生新订单号
4回传失败有日志,5xx 会重试,ok_dup 不重试
5退款流程接上了 event=refund
6活动落地页地址与线上一致,HTTPS 可访问