Realex支付集成中SHA1哈希计算错误解析与解决方案


Realex支付集成中SHA1哈希计算错误解析与解决方案

本文旨在解决realex/global payments集成中常见的“sha1hash incorrect”错误,特别是针对`payer-new`请求类型。核心问题在于为`payer-new`请求计算sha1哈希时,误将支付金额和货币信息包含在哈希字符串中。教程将详细解释realex哈希生成机制,指出错误原因,并提供正确的哈希字符串构建方法,以确保api请求的安全性与准确性。

Realex/Global Payments SHA1哈希机制概述

Realex(现Global Payments)的API集成依赖于SHA1哈希算法来验证请求数据的完整性和真实性。每个发送到Realex的请求都必须包含一个正确的SHA1哈希值。这个哈希值通常由一系列关键数据字段和一个预共享密钥(secret)通过特定顺序拼接后计算得出。如果哈希计算不正确,Realex服务器会返回错误代码505,并附带消息“sha1hash incorrect - check your code and the Developers Documentation”。

哈希计算通常遵循两步过程:

  1. 第一步哈希: 将一系列特定字段按规定顺序拼接成一个字符串,然后计算其SHA1值。
  2. 第二步哈希: 将第一步计算出的SHA1值与您的预共享密钥拼接,再计算一次SHA1值。

最终的SHA1哈希值将包含在请求的XML或POST数据中。

“sha1hash incorrect”错误:payer-new请求的常见陷阱

在集成Realex支付解决方案时,开发者可能会遇到在提交payer-new请求时收到“sha1hash incorrect”的错误。payer-new请求的目的是在Realex系统中注册一个新的付款人(payer)信息,而不是进行实际的支付交易。

问题描述

当尝试向Realex发送包含客户姓名、客户编号、客户参考等信息的payer-new请求时,可能会收到如下错误响应:

<response timestamp="20251208142721">
<merchantid>OUR MERCHANT ID IS INSERTED HERE</merchantid>
<account>website</account>
<orderid>scsi45880</orderid>
<result>505</result>
<message>sha1hash incorrect - check your code and the Developers Documentation</message>
</response>

这表明计算出的SHA1哈希与Realex期望的不符。

错误原因分析

根据Realex的文档,不同类型的请求需要包含不同的字段来计算SHA1哈希。对于一个payer-new请求,其核心目的是注册付款人信息,因此,与支付金额和货币相关的字段(如amount和currency)不应被包含在哈希计算的原始字符串中。

Animate AI Animate AI

Animate AI是个一站式AI动画故事视频生成工具

Animate AI 234 查看详情 Animate AI

在提供的代码示例中,用于计算payer-new请求的哈希(payersha1hash)的临时变量payer_temp_var被错误地构建:

// 错误的哈希字符串构建
$payer_temp_var = "$timestamp.$merchantid.$rlx_orderid.$pay_amount.$currency.$payer_ref";
$payersha1hash = sha1($payer_temp_var);
$payertmp = "$payersha1hash.$payer_secret";
$payersha1hash = sha1($payertmp);

这里,$pay_amount和$currency被不当地包含在了payer_temp_var中。由于payer-new请求本身不涉及具体的交易金额,Realex在验证此请求的哈希时,不会期望这些字段出现在哈希计算字符串中。

解决方案:正确构建payer-new请求的哈希字符串

解决此问题的关键是移除payer_temp_var中不属于payer-new请求哈希计算的字段。根据Realex的API规范,对于payer-new请求,用于生成第一步哈希的字符串应只包含时间戳、商户ID、订单ID和付款人参考(payer reference)。

修正后的哈希字符串构建

将payer_temp_var的构建方式修改为:

// 正确的哈希字符串构建
$payer_temp_var = "$timestamp.$merchantid.$rlx_orderid.$payer_ref";
$payersha1hash = sha1($payer_temp_var);
$payertmp = "$payersha1hash.$payer_secret";
$payersha1hash = sha1($payertmp);

通过移除$pay_amount和$currency,现在payer_temp_var只包含payer-new请求所需的核心字段。

示例代码(关键部分)

以下是PHP中正确计算payer-new请求SHA1哈希的关键代码片段:

<?php

// ... (省略了初始化和其它不相关的代码) ...

$merchantid = 'your_merchant_id'; // 替换为您的商户ID
$account = 'your_account';         // 替换为您的账户名
$secret = 'your_auth_secret';     // 替换为您的主密钥(用于auth请求)
$payer_secret = 'your_payer_secret'; // 替换为您的付款人密钥(如果不同)

$timestamp = strftime("%Y%m%d%H%M%S"); // 获取当前时间戳
$rlx_orderid = "scsi" . rand(10000, 99999); // 生成唯一的订单ID
$payer_ref = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
            mt_rand(0, 0xffff), mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0x0C2f) | 0x4000,
            mt_rand(0, 0x3fff) | 0x8000,
            mt_rand(0, 0x2Aff), mt_rand(0, 0xffD3), mt_rand(0, 0xff4B)
    ); // 生成付款人参考

// --- 针对 Payer-New 请求的 SHA1 哈希计算 ---
// 重要的:这里不包含 $pay_amount 和 $currency
$payer_temp_var = "$timestamp.$merchantid.$rlx_orderid.$payer_ref";
$payersha1hash = sha1($payer_temp_var);
$payertmp = "$payersha1hash.$payer_secret"; // 使用付款人密钥
$payersha1hash = sha1($payertmp);

// 构建 Payer-New XML 请求
$payer_string = "<?xml version='1.0' encoding='UTF-8'?>
    <request type='payer-new' timestamp='$timestamp'>
      <merchantid>$merchantid</merchantid>
      <account>$account</account>
      <orderid>$rlx_orderid</orderid>
      <payer ref='$payer_ref' type='Retail'>
        <!-- ... 更多付款人详细信息 ... -->
      </payer>
      <sha1hash>$payersha1hash</sha1hash>
    </request>";

// ... (使用 cURL 发送请求的代码) ...

// --- 针对 Auth (支付授权) 请求的 SHA1 哈希计算 (作为对比) ---
// 注意:这里需要包含 $pay_amount, $currency 和 $cardNumber
$amount = $_POST['amount'];
$pay_amount = $amount * 100; // 金额通常以最小货币单位表示 (例如:欧元分)
$currency = "EUR";
$cardNumber = $_POST['cardnnumber']; // 实际卡号,用于哈希,但通常不直接发送到API

$auth_temp_var = "$timestamp.$merchantid.$rlx_orderid.$pay_amount.$currency.$cardNumber";
$sha1hash_auth = sha1($auth_temp_var);
$authtmp = "$sha1hash_auth.$secret"; // 使用主密钥
$sha1hash_auth = sha1($authtmp);

// 构建 Auth XML 请求
$field_string = "<request timestamp='$timestamp' type='auth'>
    <merchantid>$merchantid</merchantid>
    <account>$account</account>
    <channel>MOTO</channel>
    <orderid>$rlx_orderid</orderid>
    <amount currency='$currency'>$pay_amount</amount>               
    <card>
                <number>$cardNumber</number>
                <expdate>...</expdate>
                <chname>...</chname>
                <type>...</type>
                <cvn>...</cvn>
    </card>
    <autosettle flag='1' />
    <sha1hash>$sha1hash_auth</sha1hash>
</request>";

// ... (使用 cURL 发送请求的代码) ...

?>

注意事项与最佳实践

  1. 查阅官方文档: Realex/Global Payments的API文档是生成正确哈希的最终权威来源。务必针对您正在使用的具体API版本和请求类型,仔细查阅其哈希计算要求。
  2. 区分请求类型: 不同API请求(如auth、payer-new、settle等)的哈希字符串组成可能完全不同。不要混淆或复用哈希计算逻辑。
  3. 密钥管理: Realex可能为不同的操作(如主交易、付款人管理)提供不同的共享密钥。确保为每个哈希计算使用正确的密钥。密钥是敏感信息,应妥善保管,切勿硬编码在前端代码中或通过不安全的方式传输。
  4. 数据类型和格式: 确保所有参与哈希计算的字段都符合Realex要求的格式(例如,金额通常是整数,表示最小货币单位)。
  5. 调试技巧: 如果遇到哈希错误,可以使用error_log或类似的调试工具输出payer_temp_var和payertmp在计算前的完整字符串,以及最终生成的哈希值。然后对照Realex文档,手动验证这些字符串和哈希是否正确。
  6. 错误日志: 详细记录Realex的响应,包括result代码和message,这对于诊断问题至关重要。

总结

Realex/Global Payments集成中的“sha1hash incorrect”错误通常源于对哈希计算字符串中包含字段的误解。对于payer-new这类非交易性请求,关键在于只包含与付款人注册直接相关的字段(时间戳、商户ID、订单ID、付款人参考),而排除支付金额和货币等交易性字段。遵循Realex的API文档,并仔细核对每个请求类型的哈希计算规则,是确保集成顺利和交易安全的关键。

以上就是Realex支付集成中SHA1哈希计算错误解析与解决方案的详细内容,更多请关注php中文网其它相关文章!


# 计算出  # 日照SEO整站优化报价  # 旋风网站建设  # seo引流操作  # 如何成为seo工作  # 小说网站怎么推广小说  # 四川网站推广专业定制  # seo排名技巧哪里有  # 厚街抖音seo合作  # 口碑好的seo排名优化系统  # 东莞seo外包推广公司  # 出现在  # 是在  # 是个  # php  # 移除  # 怎么看  # 发送到  # 商户  # 文档  # 您的  #   # ai  # curl  # 工具  # 编码  # 前端 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口  Golang如何操作指针参数_Go pointer参数传递规则  百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法  如何查找哪个composer包引入了特定的依赖?  我的世界游戏平台入口 我的世界官方官网直达链接  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  韩剧圈正版官网入口_韩剧圈官方指定登录  2025SNH48年度青春盛典门票价格及购买方式  漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程  如何使用 composer 和 aop-php 实现 AOP 编程?  PHP utf8_encode 字符编码转换陷阱与解决方案  谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  汽水音乐官网网页版入口 汽水音乐官网网页版在线入口  电脑开不了机怎么办 电脑无法开机的解决方法  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  键盘测试软件哪个好_键盘故障检测工具推荐  vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足  《i莞家》修改昵称方法  poki官网最新入口 poki小游戏大全入口  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  tiktok国际版入口_tiktok官网网页版链接  263企业邮箱如何设置邮件转发功能  《深林》冬季章节图文攻略  Python定时发送QQ消息  喜茶GO更换登录账号方法  Go Template中优雅处理循环最后一项:自定义函数实践  Chart.js 教程:自定义插件实现图表与图例间距调整  Git命令与VS Code UI操作的对应关系解析  抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  晓晓优选app支付宝绑定方法  优酷官网登录入口电脑版 优酷官网网址入口  《偃武》甘宁技能详解  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  Bootstrap 5导航栏折叠功能失效:数据属性迁移指南  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  快递物流路径揭秘  顺丰快递单号查询寄件人 顺丰寄件人查询入口  Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】  BunnyStream TUS视频上传指南:解决401认证错误与参数配置  使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留  《搜书吧》阅读书籍方法  秋风萧瑟洪波涌起中的萧瑟指的是什么  12306售票时间最新规定 | 网上订票和车站窗口时间一样吗  猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程  网页版网易云音乐入口_网易云音乐在线官网登录  Composer如何使用composer-plugin-api开发自定义插件 

 2025-11-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.