You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Magento 1.9.4.1升级后Authorize.net扣款未生成订单及OAuth错误求助

Magento 1.9.4.1: Authorize.net Charges But No Order Created (oauth_problem=token_rejected)

我之前帮好几个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:05:17