使用教程

嵌入 tracker.js,在业务节点调用百度官方事件函数;系统自动选择域名 Token 或兜底 Token,并保存完整回传结果。

四步上手

1
配置 Token

在 Token 管理 填写百度 API Token 与落地页域名并启用,可将一条 Token 设为兜底。

2
嵌入 tracker.js

在落地页 </body> 前加入采集脚本(见下方代码)。

3
上报事件

点击表单按钮时调用 表单按钮点击()(编码 5);确认提交成功后再调用 表单提交成功()(编码 3)。

4
回传百度

业务事件会按官方编码自动回传,优先匹配落地页域名 Token,未匹配则使用兜底 Token;结果可到 回传记录 查看。

无需安装百度官方页面埋码 JS;回传由本系统服务端对接百度 API。

嵌入采集脚本

复制到落地页

采集脚本统一在此维护。每个投放落地页只需一段脚本,data-endpoint 指向本系统(可与后台不同域名),data-project-id 填写项目管理中的项目 ID,无需填写项目域名。登记访客和后续事件自动携带同一 ID。

<script src="http://tkhuichuan.xcentre.top/assets/tracker.js" data-endpoint="http://tkhuichuan.xcentre.top/api/collect.php" data-project-id="你的项目ID"></script>

默认不会在打开页时自动上报;需要「关键页面浏览」(编码 20)时,在 script 上加 data-page-view="1",或在业务节点调用 关键页面浏览()。控制台 [百度采集] 表示行为已写入本系统,[百度回传] 才是服务端回传结果。

上报转化

先 tracker,再业务 script

加载 tracker 后可调用点击/浏览函数,例如 trackEvent('20')。支付、购买、注册、表单成功等业务结果必须由服务端验证后提交,否则返回 403。金额仅在服务端服务购买成功事件中传入,单位为人民币分。

<script>
  // 浏览器只上报点击/浏览,业务成功事件使用服务端 API
  表单按钮点击();
  关键页面浏览();
</script>

请把逻辑写在独立 <script> 中,避免 onclick 内联;访客链接需带 bd_vid(从百度广告点击进入)。

排查:F12 看是否请求 http://tkhuichuan.xcentre.top/api/collect.php;在线体验 可模拟采集和自动回传。

服务端 API 对接教程

支付结果以服务端为准
  1. 配置回传系统:在本系统服务器设置高强度随机 BAIDU_RETURN_API_KEY,在 Token 管理配置与广告落地页主机名完全一致的 Token。
  2. 配置业务项目:设置 BAIDU_RETURN_API_URL=http://tkhuichuan.xcentre.top/api/server-return.php 和相同的 BAIDU_RETURN_API_KEY。密钥只能保存在服务端环境变量,不能写进网页、APP 或仓库。
  3. 保存广告来源:访客从百度广告进入时读取 URL 中的 bd_vid,连同原始落地页 URL 保存到 Session,并在创建订单时固化到订单表。
  4. 支付确认后调用:支付异步通知先完成验签、金额校验和订单状态更新,再由服务器请求本接口;前端支付结果页不能作为支付成功依据。
  5. 保存并核对结果:业务项目保存响应中的 recordId,到 回传记录 核对百度最终响应。

第一步:落地页保存 bd_vid,并随订单入库

订单表建议增加 baidu_bd_vid VARCHAR(255) 和 baidu_page_url TEXT。不要等支付回调时再取 bd_vid,支付平台通知地址通常没有该参数。

<?php
session_start();

// 广告首次到站时保存百度点击标识和原始落地页,支付回调本身通常没有 bd_vid。
$bdVid = isset($_GET['bd_vid']) && is_string($_GET['bd_vid']) ? trim($_GET['bd_vid']) : '';
if ($bdVid !== '' && strlen($bdVid) <= 255 && !preg_match('/\s/', $bdVid)) {
    $_SESSION['baidu_bd_vid'] = $bdVid;
    $_SESSION['baidu_page_url'] = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

// 创建订单时把这两个值写入订单表;字段名可按你的项目调整。
$orderData['baidu_bd_vid'] = $_SESSION['baidu_bd_vid'] ?? '';
$orderData['baidu_page_url'] = $_SESSION['baidu_page_url'] ?? '';

第二步:支付回调中调用服务端 API

下面代码可直接放入 PHP 项目的支付服务层,配置 BAIDU_RETURN_PROJECT_ID 为项目管理中的 ID。pageUrl 应使用订单保存的原始广告落地页,系统据此精确选择域名 Token;接口会自动把 bdVid 合入百度 logidUrl。

<?php
/** 支付成功后调用百度回传系统;同一支付订单始终使用同一个 requestId。 */
function huiChuanBaiduZhiFu(array $order): array
{
    $apiUrl = getenv('BAIDU_RETURN_API_URL');
    $apiKey = getenv('BAIDU_RETURN_API_KEY');
    if (!$apiUrl || !$apiKey) {
        throw new RuntimeException('未配置百度回传 API 地址或密钥');
    }

    $projectId = (int)getenv('BAIDU_RETURN_PROJECT_ID'); // 项目管理中查看项目 ID
    $payload = array(
        'projectId' => $projectId,
        'requestId' => 'payment:'.$projectId.':' . $order['pay_channel'] . ':' . $order['order_no'],
        'orderId' => $order['order_no'], // 同域名内唯一订单号,跨请求标识去重
        'newType' => 90, // 商品支付成功;服务购买成功改为 10
        'bdVid' => $order['baidu_bd_vid'],
        'pageUrl' => $order['baidu_page_url'],
    );
    // newType=10 时可增加:$payload['convertValue'] = (int)$order['amount_fen'];

    $curl = curl_init($apiUrl);
    curl_setopt_array($curl, array(
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
        CURLOPT_HTTPHEADER => array(
            'Authorization: Bearer ' . $apiKey,
            'Content-Type: application/json',
        ),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CONNECTTIMEOUT => 3,
        CURLOPT_TIMEOUT => 12,
    ));
    $body = curl_exec($curl);
    $error = curl_error($curl);
    $httpCode = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);
    curl_close($curl);

    if ($body === false) {
        throw new RuntimeException('百度回传系统网络错误:' . $error);
    }
    $result = json_decode($body, true);
    if ($httpCode !== 200 || !is_array($result) || empty($result['success'])) {
        throw new RuntimeException('百度回传失败 HTTP ' . $httpCode . ':' . $body);
    }
    return $result;
}

// 支付异步通知:必须先验签、核对金额,并把订单状态更新为已支付。
// $order = verifyPaymentAndMarkPaid($_POST);
if (!empty($order['baidu_bd_vid']) && !empty($order['baidu_page_url'])) {
    $returnResult = huiChuanBaiduZhiFu($order);
    // 保存 $returnResult['recordId'],便于和回传系统后台记录核对。
}

字段与结果处理

字段是否必填说明
projectId新接入必填项目管理中的正整数 ID,用于区分项目;旧调用省略时兼容域名归属
requestId是全局唯一幂等标识,推荐 payment:项目ID:渠道:商户订单号;同一订单永远复用同一个值
newType / eventName至少一个商品支付成功=90,服务购买成功=10;同时传时必须对应同一事件
bdVid是广告首次落地 URL 中的 bd_vid,创建订单时保存
pageUrl是HTTP(S) 原始广告落地页,用于匹配 Token 和生成 logidUrl
convertValue否仅 newType=10 可传,人民币分正整数,如 30 元传 3000

响应判断:HTTP 200 且 success=true 表示百度已受理;duplicate=true 表示相同请求已处理,本次没有重发。HTTP 401 检查密钥,409 表示同一 requestId 被不同载荷复用,422 检查字段或官方编码,503 表示回传系统未配置 API 密钥。

不要盲目补发:失败、超时或处理中请求不会自动再次请求百度,防止百度已收到但响应丢失时重复计数。不得换一个新 requestId 强行重试;先按 recordId 到回传记录核对,再人工决定是否处理。

API 回传编码

与服务端白名单一致
编码含义调用
1咨询按钮点击window.baiduReturn.trackEvent('1')
2电话按钮点击window.baiduReturn.trackEvent('2')
3表单提交成功window.baiduReturn.trackEvent('3')
4激活window.baiduReturn.trackEvent('4')
5表单按钮点击window.baiduReturn.trackEvent('5')
6下载(预约)按钮点击window.baiduReturn.trackEvent('6')
7购买按钮点击window.baiduReturn.trackEvent('7')
8短信咨询按钮点击window.baiduReturn.trackEvent('8')
10服务购买成功window.baiduReturn.trackEvent('10')
14订单提交成功window.baiduReturn.trackEvent('14')
17三句话咨询window.baiduReturn.trackEvent('17')
18留线索window.baiduReturn.trackEvent('18')
20关键页面浏览window.baiduReturn.trackEvent('20')
25注册window.baiduReturn.trackEvent('25')
26付费window.baiduReturn.trackEvent('26')
27客户自定义window.baiduReturn.trackEvent('27')
28次日留存window.baiduReturn.trackEvent('28')
297日留存window.baiduReturn.trackEvent('29')
30电话拨通window.baiduReturn.trackEvent('30')
32QQ咨询按钮点击window.baiduReturn.trackEvent('32')
35微信复制按钮点击window.baiduReturn.trackEvent('35')
41申请window.baiduReturn.trackEvent('41')
42授信window.baiduReturn.trackEvent('42')
45商品下单成功window.baiduReturn.trackEvent('45')
46加入购物车window.baiduReturn.trackEvent('46')
47商品收藏window.baiduReturn.trackEvent('47')
48商品详情页到达window.baiduReturn.trackEvent('48')
49登录(注册激活后登录)window.baiduReturn.trackEvent('49')
50预约window.baiduReturn.trackEvent('50')
52深度使用window.baiduReturn.trackEvent('52')
56到店window.baiduReturn.trackEvent('56')
57店铺调起window.baiduReturn.trackEvent('57')
61二次跳转window.baiduReturn.trackEvent('61')
67微信调起按钮点击window.baiduReturn.trackEvent('67')
68粉丝关注成功window.baiduReturn.trackEvent('68')
71应用调起window.baiduReturn.trackEvent('71')
72聊到相关业务window.baiduReturn.trackEvent('72')
73回访-电话接通window.baiduReturn.trackEvent('73')
74回访-信息确认window.baiduReturn.trackEvent('74')
75回访-发现意向window.baiduReturn.trackEvent('75')
76回访-高潜成交window.baiduReturn.trackEvent('76')
77回访-成单客户window.baiduReturn.trackEvent('77')
78店铺停留window.baiduReturn.trackEvent('78')
79微信加粉成功window.baiduReturn.trackEvent('79')
89放款window.baiduReturn.trackEvent('89')
90商品支付成功window.baiduReturn.trackEvent('90')
92有效咨询window.baiduReturn.trackEvent('92')
93付费阅读window.baiduReturn.trackEvent('93')
94进入书城并阅读window.baiduReturn.trackEvent('94')
953日留存window.baiduReturn.trackEvent('95')
964日留存window.baiduReturn.trackEvent('96')
975日留存window.baiduReturn.trackEvent('97')
986日留存window.baiduReturn.trackEvent('98')
10014日留存window.baiduReturn.trackEvent('100')
112微信小程序调起window.baiduReturn.trackEvent('112')
117进件window.baiduReturn.trackEvent('117')
118付费观剧window.baiduReturn.trackEvent('118')
119关键行为window.baiduReturn.trackEvent('119')

核对回传结果请打开 回传记录。

常见问题

咨询按钮点击没有日志?
先加载 tracker.js 再调用 咨询按钮点击() 或 window.baiduReturn.trackEvent('1')。默认立即打印调用记录;若设置 data-debug="0" 则不打印。若只有调用日志,请检查访客登记请求是否一直等待。打开控制台保留日志可避免跳转后日志被清空。
没有访问记录?
确认落地页已发布嵌入代码,且浏览器未拦截对 http://tkhuichuan.xcentre.top/api/collect.php 的请求。
有行为但没回传百度?
所有受支持的业务事件都会自动回传。请到回传记录查看是否缺少域名/兜底 Token、bd_vid,或百度接口是否拒绝;历史“未回传”记录不会自动补发。
支付 API 应该在前端还是支付回调调用?
只能在服务端确认支付成功后调用。先验证支付平台签名、核对金额并更新订单,再读取订单保存的 bd_vid 和原始落地页发起回传;API 密钥不得下发到浏览器或 APP。
和后台不同域名可以吗?
可以,保持 data-endpoint 为本系统地址即可跨域上报。