接入总览
大约 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 | 含义 |
| ok | 200 | 记录成功 |
| ok_dup | 200 | 该订单已记录过,属于正常情况,不要重试 |
| missing_params | 400 | 缺 click_id / order_id / sign |
| sign_error | 403 | 签名不对,重点查金额格式与密钥 |
| unknown_click_id | 404 | click_id 不存在,可能没存下来或被改过 |
| unknown_order | 404 | 退款时找不到对应订单 |
| server_error | 500 | 平台侧异常,可重试并联系管理员 |
重试策略:只有 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 是两位小数字符串,与签名用的完全一致 |
| 3 | order_id 全局唯一,重试不会产生新订单号 |
| 4 | 回传失败有日志,5xx 会重试,ok_dup 不重试 |
| 5 | 退款流程接上了 event=refund |
| 6 | 活动落地页地址与线上一致,HTTPS 可访问 |