
本文旨在解决realex/global payments集成中常见的“sha1hash incorrect”错误,特别是针对`payer-new`请求类型。核心问题在于为`payer-new`请求计算sha1哈希时,误将支付金额和货币信息包含在哈希字符串中。教程将详细解释realex哈希生成机制,指出错误原因,并提供正确的哈希字符串构建方法,以确保api请求的安全性与准确性。
Realex(现Global Payments)的API集成依赖于SHA1哈希算法来验证请求数据的完整性和真实性。每个发送到Realex的请求都必须包含一个正确的SHA1哈希值。这个哈希值通常由一系列关键数据字段和一个预共享密钥(secret)通过特定顺序拼接后计算得出。如果哈希计算不正确,Realex服务器会返回错误代码505,并附带消息“sha1hash incorrect - check your code and the Developers Documentation”。
哈希计算通常遵循两步过程:
最终的SHA1哈希值将包含在请求的XML或POST数据中。
在集成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)不应被包含在哈希计算的原始字符串中。
Zyro AI Background Remover
Zyro推出的AI图片背景移除工具
145
查看详情
在提供的代码示例中,用于计算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_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>
<acc
ount>$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 发送请求的代码) ...
?>Realex/Global Payments集成中的“sha1hash incorrect”错误通常源于对哈希计算字符串中包含字段的误解。对于payer-new这类非交易性请求,关键在于只包含与付款人注册直接相关的字段(时间戳、商户ID、订单ID、付款人参考),而排除支付金额和货币等交易性字段。遵循Realex的API文档,并仔细核对每个请求类型的哈希计算规则,是确保集成顺利和交易安全的关键。
以上就是Realex支付集成中SHA1哈希计算错误解析与解决方案的详细内容,更多请关注php中文网其它相关文章!
# 键值
# 网站建设方法及步骤
# 磐安整合营销推广
# 网站优化外推技巧
# 推广算在营销范畴内吗
# 钟祥百度推广网站地址
# 云南网站优化方法
# 开原百度seo网站优化公司
# 无锡外贸型网站优化方法
# 公墓网站建设
# 六个网站平台推广
# 是在
# 转数
# 计算出
# php
# 发送到
# 移除
# 商户
# 文档
# 多维
# 您的
# 币
# ai
# curl
# 工具
# 编码
# 前端
相关文章:
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
顺丰国际快递查询 国际件官方查询入口
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
蛙漫2台版漫画地址 Manwa2正版网页版链接
J*aScript中localStorage数据的获取、清洗与格式化教程
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
Python Sounddevice 音频卡顿问题解析与队列数据安全处理
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
C++如何实现单例模式_C++设计模式之线程安全的单例写法
Golang如何使用new_Go new分配内存机制讲解
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
Lar*el Form Request 中唯一性验证更新操作的正确实践
J*aScript生成器_j*ascript异步迭代
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
LINUX怎么安装MySQL_LINUX数据库安装配置教程
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
J*a中实现Go语言select通道多路复用机制
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
Archive of Our Own官网直达 AO3最新可用地址一览
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
python3时间如何用calendar输出?
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
jQuery Mask 插件中实现电话号码固定前导零的教程
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
J*a应用集成GitHub CLI与API认证指南
Shopware订单对象中获取产品自定义字段的正确方法
excel如何生成目录 excel一键生成工作表目录超链接
J*a里如何使用forEach遍历Map_Map遍历方法说明
微信聊天记录怎么加密_微信聊天记录加密方法
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
离线运行Go语言之旅:本地部署与GOPATH配置指南
Lar*el拼写容错搜索策略:基于语音编码的优化实践
PHP中高效并行检查多链接状态的教程
Python类型检查:优化关联可选属性的Mypy推断策略
J*aScript实现单选按钮与关联输入框的联动禁用教程
*请认真填写需求信息,我们会在24小时内与您取得联系。