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
相关产品推荐
相关产品推荐

