生成签名并构建请求 URL
生成签名和构建请求 URL 的检查清单:
| 条目 | 值 | 备注 |
|---|---|---|
| 秘密/私钥 | 由 Expedia Group 分享。 | 密钥是一个字母 数字字符串,由 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:
https://expedia.com/go/hotel/search/Destination/2025-12-22/2025-12-25?mdpcid=Expedia-IE.DPS.Expedia.ExtFlightEmail-Xsell_CTA.Hotel&CityName=ORD&SortBy=distance&NumRoom=1&NumAdult1=3&NumChild1=2&Rm1child1age=9&Rm1child2age=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.Expedia.ExtFlightEmail-Xsell_CTA.Hotel%26CityName%3DORD%26SortBy%3Ddistance%26NumRoom%3D1%26NumAdult1%3D3%26NumChild1%3D2%26Rm1child1age%3D9%26Rm1child2age%3D6
步骤 3:添加所有必需参数以启用附加速率
outboundEndDateTime(已编码)+ originTLA + returnStartDateTime(已编码)+ destinationTLA + bookingDateTime(已编码)+ PartnerId +attachDL
步骤 4:构建用于生成签名的 URL(不要包含域名)
端点 + 编码后的深度链接 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 Group 共享的秘密/私钥,通过 HMAC-SHA1 算法对从步骤 4 获得的字符串(URL)进行签名。在大多数加密库中,生成的签名将采用二进制格式,因此可能需要将密钥解码为其原始二进制格式。
RFC 2104 中定义了这种加密哈希函数,并针对多种计算机语言和框架进行了多种实现。以下列表仅列出部分可用实现:
- Java
- Javascript
- C#
- Python
- Ruby
步骤 6:对生成的二进制签名进行编码
使用修改后的 Base64 对 URL 的二进制签名进行编码,将 Base64 输出中的 +和 /字符分别替换为 -(连字符)和 _(下划线),以使 URL 安全(有关更多信息,请参阅 RFC 4648)。它应该看起来像这样:
bj01fgT85mUiRmzxxSufSmlGpiI
此外,需要注意的是,应从 base64 编码字符串中删除填充 =(如果有)。
步骤 7:构建最终请求 URL
按如下所示构建最终的深度链接 URL:
域名 + 端点 + 编码后的深度链接 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 路径(e.g.电子邮件)中
核对清单
请确保以下事项:
- 签名
- 签名格式正确(Base64),而非十六进制。
- 签名在转换为 Base64 编码时被视为整数(而不是字符串)。
- 如有必要,请将签名中的
+替换为-(Base64 编码应该会自动执行此操作):m6y13j0747-x/h81wEzR9jE1fco= - 如有必要,请将签名中的
/替换为_(Base64 编码应该会自动执行此操作):m6y13j0747-x_h81wEzR9jE1fco=
- 如有必要,请将签名中的
- 从 Base64 编码字符串中移除填充
=(如果有)。 - 签名长度正好是 27 个字符。
- 客户端不会公开显示密钥;密钥只能在服务器端用于生成签名。
- 参数
- 所有参数值均为 percent-encoded UTF-8。
- 所有必需参数均已传递。
- 域和端点
- 端点正确
/xsell-redirect-pwa
- 端点正确
- 最终请求 URL 应为域名 + 端点 + 编码后的深度链接的组合:
URL+outboundEndDateTime(编码后)+originTLA+returnStartDateTime(编码后)+destinationTLA+bookingDateTime(编码后)+PartnerId+attachDL+signature
测试
在测试/生产部署之前,请确认模块已正确附加。
验证最终请求 URL:
- 该请求将根据编码后的深度链接 URL 中的搜索条件重定向到房源结果页面。
注意:Expedia 解决方案仅支持生产环境 希望在 pre-production 中进行测试的合作伙伴需要将其 pre-production 指向 Expedia 的生产环境。