#!/usr/bin/env php 'Summer Sale', 'p2' => '120345678', 'p3' => 'US Adset', 'p4' => '987654', 'p5' => 'Creative A', 'p6' => '111222', 'ad_spm_id' => '6a0HTjW6bd', 'time' => '1719491234567', 'utm_source'=> 'facebook', 'site_source' => 'fb', 'placement' => 'feed', 'fbclid' => 'IwAR1234567890123456789012', ]; $merged = AttributionUrlMerger::merge($adjustTarget, $incoming); vassert('merge: p0 保留', strpos($merged, 'p0=1ynqxx65') !== false, $merged); vassert('merge: p1 展开', strpos($merged, 'p1=Summer%20Sale') !== false, $merged); vassert('merge: p2 展开', strpos($merged, 'p2=120345678') !== false, $merged); vassert('merge: 无 ad_spm_id', strpos($merged, 'ad_spm_id') === false, $merged); vassert('merge: 无 time', strpos($merged, 'time=') === false, $merged); vassert('merge: 无 utm_source', strpos($merged, 'utm_source') === false, $merged); vassert('merge: 透传 fbclid', strpos($merged, 'fbclid=IwAR1234567890123456789012') !== false, $merged); vassert('merge: 无双重编码', strpos($merged, '%257B') === false, $merged); $masterummyTarget = 'https://www.masterummy.online/623-2/?p0=20fm2y6y&p1=%7B%7Bcampaign.name%7D%7D&p2=%7B%7Bcampaign.id%7D%7D&p3=%7B%7Badset.name%7D%7D&p4=%7B%7Badset.id%7D%7D&p5=%7B%7Bad.name%7D%7D&p6=%7B%7Bad.id%7D%7D'; $incoming623 = [ 'p1' => 'IN-master-623-2', 'p2' => '120247249921340752', 'p3' => '新销量广告组', 'p4' => '120247249921360752', 'p5' => '2', 'p6' => '120247249998390752', 'fbclid' => 'IwAR0abcdefghijklmnopqrst', 'ad_spm_id' => '6WLT21GWrVKx', ]; $merged623 = AttributionUrlMerger::merge($masterummyTarget, $incoming623); vassert('623: p1 展开', strpos($merged623, 'p1=IN-master-623-2') !== false, $merged623); vassert('623: p3 中文', strpos($merged623, 'p3=%E6%96%B0%E9%94%80%E9%87%8F%E5%B9%BF%E5%91%8A%E7%BB%84') !== false, $merged623); vassert('623: fbclid 透传', strpos($merged623, 'fbclid=IwAR0abcdefghijklmnopqrst') !== false, $merged623); vassert('623: 无 ad_spm_id', strpos($merged623, 'ad_spm_id') === false, $merged623); $plainTarget = 'https://example.com/landing?p1={{campaign.name}}&token=static'; $mergedPlain = AttributionUrlMerger::merge($plainTarget, ['p1' => 'My Campaign', 'token' => 'ignored']); vassert('merge: 明文宏替换', strpos($mergedPlain, 'p1=My%20Campaign') !== false, $mergedPlain); vassert('merge: 静态 token 保留', strpos($mergedPlain, 'token=static') !== false, $mergedPlain); $clidTarget = 'https://aindl.com/x?p0=abc&fbclid=%7B%7Bfbclid%7D%7D'; $mergedClid = AttributionUrlMerger::merge($clidTarget, ['fbclid' => 'realclid123']); vassert('merge: 目标含 fbclid 宏时替换', strpos($mergedClid, 'fbclid=realclid123') !== false, $mergedClid); $result = ['ok' => $failed === 0, 'passed' => $passed, 'failed' => $failed]; echo json_encode($result, JSON_UNESCAPED_UNICODE) . "\n"; exit($failed > 0 ? 1 : 0);