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

Monnify支付集成调用交易验证接口返回invalid_token错误咨询

报错原因

直接把base64编码后的API Key、Secret Key拼接在Bearer后作为授权头传入是完全错误的鉴权方式。Monnify的业务接口要求传入的是JWT格式的访问令牌,你传入的base64字符串不符合JWT的JSON结构要求,接口无法解析,才会返回Cannot convert access token to JSON的invalid_token错误。

Monnify的鉴权流程分两步:

  • 第一步调用专属登录接口,用API Key和Secret Key换取有效期1小时的access_token
  • 第二步调用交易查询这类业务接口时,才将获取到的access_token放在Authorization: Bearer {token}请求头中传递
修复方案

第一步:新增获取访问令牌的方法

单独封装令牌获取逻辑,注意登录接口的授权头要用Basic前缀,不是Bearer,示例代码适配Laravel环境:

private function getMonnifyAccessToken()
{
    $url = env('MONNIFY_BASE_URL') . '/api/v1/auth/login';
    $curl = curl_init($url);
    
    $authCode = base64_encode(env('MONNIFY_API_KEY') . ':' . env('MONNIFY_SECRET_KEY'));
    $headers = [
        "Authorization: Basic " . $authCode
    ];
    
    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false
    ]);
    
    $response = json_decode(curl_exec($curl), true);
    curl_close($curl);
    
    if (isset($response['requestSuccessful']) && $response['requestSuccessful']) {
        return $response['responseBody']['accessToken'];
    }
    
    throw new \Exception('获取Monnify令牌失败:' . json_encode($response));
}

第二步:修改原交易查询逻辑

原有方法中不要直接拼接密钥生成授权头,先获取合法access_token再发起业务请求:

public function validatePayment(Request $request)
{
    $transactionRef = urlencode($request->transactionReference);
    $url = env('MONNIFY_BASE_URL') . '/api/v2/transactions/' . $transactionRef;
    $curl = curl_init($url);
    
    $accessToken = $this->getMonnifyAccessToken();
    $headers = [
        "Content-Type: application/json",
        "Authorization: Bearer " . $accessToken
    ];
    
    curl_setopt_array($curl, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false
    ]);
    
    $resp = curl_exec($curl);
    curl_close($curl);
    $resp = json_decode($resp, true);
    dd($resp);
}
注意事项
  • 代码中关闭SSL校验的配置仅适合本地沙箱调试,生产环境必须开启SSL证书校验,避免中间人攻击风险
  • access_token有效期为1小时,不要每次业务请求都重新调用登录接口获取,建议存入缓存,过期后再重新拉取,减少无效接口调用
  • 测试交易号包含|特殊字符,当前代码用urlencode处理的逻辑是正确的,无需调整

使用提供的沙箱密钥验证,按上述逻辑调整后即可正常获取交易状态返回,不会再触发invalid_token报错。

内容的提问来源于stack exchange,提问作者DingRealT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:18:53