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

