Magento 1.9.4.1升级后Authorize.net扣款未生成订单及OAuth错误求助
我之前帮好几个Magento商家处理过升级到1.9.4.x后遇到的这个问题——Authorize.net已经扣款,但Magento没生成订单,客户重复提交导致多笔扣款,核心就是你日志里的oauth_problem=token_rejected错误。下面是经过验证的解决步骤:
问题根源
Magento 1.9.4.x版本对API2的OAuth验证逻辑做了严格升级,但Authorize.net官方(或第三方)的支付模块没有及时适配这个新逻辑,导致支付完成后的回调请求被Magento的OAuth验证拦截,无法触发订单创建流程,而Authorize.net已经完成了扣款操作。
解决步骤
1. 先排查基础配置(最快见效)
- 登录Magento后台,进入
System > Configuration > Payment Methods > Authorize.net - 核对API Login ID和Transaction Key是否完全正确(注意不要有多余空格、大小写错误)
- 找到
Enable OAuth选项,如果当前是开启状态,尝试暂时关闭(很多旧版Authorize.net模块不支持Magento 1.9.4.x的OAuth机制) - 保存配置后,刷新Magento的所有缓存(
System > Cache Management)
2. 重写OAuth验证逻辑(如果关闭OAuth无效)
直接修改核心文件会导致升级时丢失,所以建议用local重写:
- 复制
app/code/core/Mage/Api2/Model/Auth/Adapter/Oauth.php到app/code/local/Mage/Api2/Model/Auth/Adapter/Oauth.php(如果local目录不存在,手动创建对应路径) - 打开重写后的文件,修改
getUserParams方法,添加对Authorize.net回调请求的特殊处理,跳过OAuth验证:
public function getUserParams(Mage_Api2_Model_Request $request) { // 新增:识别Authorize.net的回调请求,跳过OAuth验证 $requestPath = $request->getPathInfo(); if (strpos($requestPath, 'authorizenet') !== false || strpos($requestPath, 'payment/authorizenet') !== false) { // 返回Authorize.net配置的用户标识(根据实际情况调整) return array('user_id' => Mage::getStoreConfig('payment/authorizenet/api_login')); } // 保留原有OAuth验证逻辑,不影响其他API请求 try { $oauthServer = $this->_getOauthServer(); $oauthServer->verifyRequest($request); return array('user_id' => $oauthServer->getToken()->getUserIdentifier()); } catch (OAuthException $e) { throw new Mage_Api2_Exception($e->getMessage(), Mage_Api2_Model_Server::HTTP_UNAUTHORIZED); } }
- 保存文件后,再次清除所有缓存,测试支付流程
3. 紧急防止重复扣款的前端处理
在修复后端逻辑的同时,给结账页面添加防重复提交的限制,避免客户多次点击:
- 打开主题目录下的
app/design/frontend/[你的主题包]/[你的主题]/template/checkout/onepage/review/button.phtml - 在文件末尾添加这段JS代码:
document.observe('dom:loaded', function() { var submitBtn = $('review-buttons-container').down('button'); if (submitBtn) { submitBtn.observe('click', function(e) { if (!this.hasClassName('disabled')) { this.disabled = true; this.addClassName('disabled'); } else { e.stop(); } }); } });
- 上传文件后,刷新前端缓存,客户点击提交订单后按钮会立即禁用,无法重复点击
4. 检查服务器时间同步
OAuth令牌的验证依赖服务器时间的准确性,如果你的服务器和Authorize.net的服务器时间差超过5分钟,也会导致令牌被拒绝:
- 用SSH登录服务器,执行
date命令查看当前时间 - 对比Authorize.net服务器的时间(可以用
curl -I https://api.authorize.net查看响应头的Date字段) - 如果时间差过大,联系主机商调整服务器时间,或者手动同步NTP服务器
补充说明
这个问题在Magento 1.9.4.0到1.9.4.3版本中很常见,主要是官方对API安全的升级和第三方支付模块适配滞后导致的。如果以上方法都无效,建议尝试升级Authorize.net的支付模块到最新兼容版,或者切换到Authorize.net的新API(比如AIM替代旧的SIM模块)。
内容的提问来源于stack exchange,提问作者rfdbm
相关产品推荐
相关产品推荐

