生成签名并构建请求 URL
生成签名和构建请求 URL 的检查清单:
| 条目 | 来源 | 备注 |
|---|---|---|
| 密钥/私钥 | 由 Expedia Group 分享。 | 密钥是一个 36 个字符的字母数字字符串,用于生成签名。它与……有关partnerId。例子: 6f437404-261d-4beb-a7fc-43b92f694831。注意: 将密钥保存在安全的地方,并且仅在 server-side 上使用它来生成签名。它不应该作为参数在 URL 构建过程中传递。 |
| 领域 | 合作伙伴领域 | 您网站的域名元素。 |
| 端点 | /xsell-redirect-pwa? | 请注意,我们的端点是 case-sensitive,因此所有参数名称必须与本文档中所示的拼写完全一致。 |
Step-by-step 指南
步骤 1:构建指向房源结果页面的深度链接请求 URL
使用合作伙伴域名代替示例中的 Expedia 域名,构建指向房产结果页面的深度链接请求 URL。根据深度 链接指南格式化搜索参数和跟踪代码。
请求 URL 参数
| 参数 | 类型 | 必填 | 说明 | 样本值 |
|---|---|---|---|---|
partnerId | 字符串 | Y | 由 Expedia Group 提供。 | partnername-POS-Ext-Flight-Conf-EmailDL |
url | 字符串 | Y | 按照深度链接指南,使用合作伙伴域名、搜索参数和跟踪代码创建酒店结果页面的深度链接请求 URL。请确保已包含跟踪代码 (mdpcid),并且输出参数的值正确为 URL-encoded。>> 阅读深度链接指南 | url = https%3A%2F%2Fexpedia.com%2Fgo%2Fhotel%2Fsearch%2FDestination%2F2025-12-22%2F2025-12-25%3FMDPCID%3DExpedia-IE.DPS.en_IE.confemail.attachDL.Flight%26CityName%3DORD%26SortBy%3Ddistance%26NumRoom%3D1%26NumAdult-Room1%3D3%26NumChild-Room1%3D2%26Room1-Child1Age%3D9%26Room1-Child2Age%3D6 |
outboundEndDateTime | 符合 ISO 8601 标准的日期字符串表示形式。 | Y | 请注明行程抵达目的地的日期和时间。根据 ISO 8601 标准,它应该只包含日期、时间和时区。 该参数值需要进行编码。 | 2025-10-30T20%3A12%3A17.928020Z |
originTla | 字符串(3 个字母) | Y | 指定行程出发地的 IATA 机场代码。 | LAS |
returnStartDateTime | 符合 ISO 8601 标准的日期字符串表示形式。 | 仅往返需要 | 请指定从目的地返回的日期和时间。根据 ISO 8601 标准,它可以只包含日期、时间和时区。 该参数值需要进行编码。 | 2025-11-10T20%3A12%3A17.928020Z |
destinationTla | 字符串(3 个字母) | Y | 指定行程目的地的 IATA 机场代码。 | JFK |
bookingDateTime | 符合 ISO 8601 标准的日期字符串表示形式。 | Y | 请注明预订日期和时间。根据 ISO 8601 标准,它可以只包含日期、时间和时区。 该参数值需要进行编码。 | 2025-07-25T20%3A12%3A17.928020Z |
bookingStatus | 字符串 | 如未提供相关信息,我们将默认预订已确认。 | 此参数的有效值为:confirmed、pending或failed**注意:**折扣率仅在 bookingStatus为confirmed时适用。 | confirmed |
attachDL | 布尔值 | Y | 将该值设置为 true 可启用折扣附加费率。 | true |
signature | 字符串 | Y | 由合作伙伴根据 Expedia Group 提供的密钥生成 server-side。这个字符串的长度正好是 27 个字符。对生成的二进制签名进行编码。 | BcND1F7KElTyGtyUHeXHd2JJLFs |
注意: 请求参数区分大小写。大小写错误会导致程序出错。
深度链接请求 URL:
https://expedia.com/go/hotel/search/Destination/2025-12-22/2025-12-25?MDPCID=Expedia-IE.DPS.en_IE.confemail.attachDL.Flight&CityName=ORD&SortBy=distance&NumRoom=1&NumAdult-Room1=3&NumChild-Room1=2&Room1-Child1Age=9&Room1-Child2Age=6
步骤 2:使用 UTF-8 对深度链接 URL 进行编码
编码后的深度链接 URL:
https%3A%2F%2Fexpedia.com%2Fgo%2Fhotel%2Fsearch%2FDestination%2F2025-12-22%2F2025-12-25%3FMDPCID%3DExpedia-IE.DPS.en_IE.confemail.attachDL.Flight%26CityName%3DORD%26SortBy%3Ddistance%26NumRoom%3D1%26NumAdult-Room1%3D3%26NumChild-Room1%3D2%26Room1-Child1Age%3D9%26Room1-Child2Age%3D6
步骤 3:添加所有必需参数以启用附加速率
outboundEndDateTime(已编码)+ originTLA + returnStartDateTime(已编码)+ destinationTLA + bookingDateTime(已编码)+ partnerid +attachDL
步骤 4:构建用于生成签名的 URL(不要包含域名)
endpoint+ 已编码的深度链接 url + outboundEndDateTime(已编码)+ originTLA + returnStartDateTime(已编码)+ destinationTLA + bookingDateTime(已编码)+ partnerid +attachDL
示例
/xsell-redirect-pwa?url=https%3A%2F%2Fexpedia.com%2Fgo%2Fhotel%2Fsearch%2FDestination%2F2025-12-22%2F2025-12-25%3Fmdpcid%3DExpedia-IE.DPS.Expedia.ExtFlightEmail-Xsell_CTA.Hotel%26CityName%3DORD%26SortBy%3Ddistance%26NumRoom%3D1%26NumAdult1%3D3%26NumChild1%3D2%26Rm1child1age%3D9%26Rm1child2age%3D6&outboundEndDateTime=2025-10-30T20%3A12%3A17.928020Z&destinationTLA=LAS&returnStartDateTime=2025-11-10T20%3A12%3A17.928020Z&originTLA=JFK&bookingDateTime=2025-07-25T20%3A12%3A17.928020Z&attachDL=true&partnerid=new-pwa-xsell-testing-airnz注意:请将 Expedia替换为您的品牌名称
步骤五:签署请求/生成签名
应使用 Expedia Group 共享的秘密/私钥,通过 HMAC-SHA1 算法对从步骤 4 获得的字符串(URL)进行签名。在大多数加密库中,生成的签名将采用二进制格式,因此可能需要将密钥解码为其原始二进制格式。
RFC 2104 中定义了这种加密哈希函数,并针对多种计算机语言和框架进行了多种实现。以下列表仅列出部分可用实现:
- Java
- Javascript
- C#
- Python
- Ruby
步骤 6:对生成的二进制签名进行编码
使用修改后的 Base64URL 对二进制签名进行编码,将 Base64URL 输出中的 +和 /字符分别替换为 -(连字符)和 _(下划线),以使 URL 安全(有关更多信息,请参阅 RFC 4648)。签名长度必须正好是 27 个字符。
示例
bj01fgT85mUiRmzxxSufSmlGpiI
9Wzh3Er5-ob35Hbxbk1ltyYHex4
FeW_4NNu4ITpGaSt1KZl-vLb9PI此外,需要注意的是,应从 Base64URL 编码字符串中删除填充 =(如果有)。
步骤 7:构建最终请求 URL
使用以下元素构建最终的深度链接 URL:
domain+ endpoint + 编码后的深度链接 url + outboundEndDateTime(已编码)+ originTLA + returnStartDateTime(已编码)+ destinationTLA + bookingDateTime(已编码)+ partnerid + attachDL +signature
示例
https://www.expedia.com/xsell-redirect-pwa?url=https%3A%2F%2Fexpedia.com%2Fgo%2Fhotel%2Fsearch%2FDestination%2F2025-12-22%2F2025-12-25%3Fmdpcid%3DExpedia-IE.DPS.Expedia.ExtFlightEmail-Xsell_CTA.Hotel%26CityName%3DORD%26SortBy%3Ddistance%26NumRoom%3D1%26NumAdult1%3D3%26NumChild1%3D2%26Rm1child1age%3D9%26Rm1child2age%3D6&outboundEndDateTime=2025-10-30T20%3A12%3A17.928020Z&destinationTla=LAS&returnStartDateTime=2025-11-10T20%3A12%3A17.928020Z&originTla=JFK&bookingDateTime=2025-07-25T20%3A12%3A17.928020Z&attachDL=true&partnerId=new-pwa-xsell-testing-airnz&signature=3WQjtTHsSCRxrogs3xhY7edWfgE
步骤 8:将最终 URL 嵌入到航空公司 post-booking 路径中
核对清单
在嵌入到 post-booking 路径(例如电子邮件)之前,请检查以下元素。
签名
- 以 Base64URL 格式(非十六进制)表示。
- 转换为 Base64URL 编码时,将其视为整数(而非字符串):替换
+和-和/和_如有必要。例如:m6y13j0747-x_h81wEzR9jE1fco=。 - 去除填充物
=(如果有的话)来自 Base64URL 编码字符串。 - 正好 27 个字符长。
- 客户端不公开可见密钥。
参数
- 值为 percent-encoded UTF-8
>> 阅读有关 UTF-8 百分比编码的内容. - 所有必需参数均已传递。
域和端点
- 正确值是
/xsell-redirect-pwa。 - 最终请求 URL 应为以下各项的组合:
domain+endpoint+ 编码深度链接url+outboundEndDateTime(已编码)+originTLA+returnStartDateTime(已编码)+destinationTLA+bookingDateTime(已编码)+partnerid+attachDL+signature
测试
在测试/生产部署之前,请确认模块已正确附加。根据编码后的深度链接 URL 中的搜索条件,请求应重定向到房源结果页面。
笔记: Expedia 解决方案仅支持生产环境。如果你想在 pre-production 中进行测试,你需要将你的 pre-production 域名指向 Expedia 的生产域名。