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

Node.js集成M-PESA时RSA加密失效问题求助

M-PESA Node.js RSA加密Bearer令牌问题解决

首先明确M-PESA官方Java示例的核心逻辑:用RSA算法(ECB模式+PKCS1填充)加密API Key,将加密结果转成Base64字符串,以此作为Bearer授权令牌的核心部分。Node.js的crypto模块和Java的加密实现存在细节差异,这大概率是你失败的原因,以下是正确实现和常见坑点:

正确实现代码

const crypto = require('crypto');

function generateBearerToken(apiKey, publicKey) {
  // 确保公钥是标准PEM格式(若公钥无头尾标识,需手动补充)
  const formattedPublicKey = publicKey.startsWith('-----BEGIN PUBLIC KEY-----') 
    ? publicKey 
    : `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----`;

  try {
    // 用RSA PKCS1填充加密API Key
    const encryptedBuffer = crypto.publicEncrypt(
      {
        key: formattedPublicKey,
        padding: crypto.constants.RSA_PKCS1_PADDING
      },
      Buffer.from(apiKey, 'utf8')
    );
    // 将加密结果转成Base64字符串,即为所需加密内容
    return encryptedBuffer.toString('base64');
  } catch (error) {
    console.error('加密失败:', error);
    throw error;
  }
}

// 使用示例
const apiKey = '你的M-PESA API Key';
const publicKey = '从M-PESA获取的公钥';
const bearerToken = generateBearerToken(apiKey, publicKey);
console.log('Bearer Token:', bearerToken);

常见错误排查点

  • 公钥格式错误:M-PESA提供的公钥可能不带PEM格式的头尾标识(-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----),Node.js的crypto模块要求必须是标准PEM格式,否则会抛出加密错误。
  • 填充方式不匹配:Java默认的RSA加密填充是RSA/ECB/PKCS1Padding,对应Node.js必须指定padding: crypto.constants.RSA_PKCS1_PADDING,若用了默认的OAEP填充(部分Node.js版本默认是OAEP),加密结果会和Java不一致。
  • 编码处理错误:加密前要把API Key转成UTF-8格式的Buffer,加密后的二进制结果必须转成Base64字符串,不能直接转成UTF-8字符串(会出现乱码或无效内容)。
  • 公钥换行问题:有些公钥是一行字符串,需要手动插入换行符(每64个字符换一行),否则crypto模块无法正确解析公钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:17:11