小程序
小游戏
企业微信
微信支付
扫描小程序码分享
https://api.mch.weixin.qq.com/v3/facemch/users
请求实名认证接口返回加密的敏感数据,参考文档https://pay.weixin.qq.com/doc/v3/merchant/4013053265,使用商户API证书私钥apiclient_key.pem解密失败
2 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
这个接口返回的数据,字段不是标准APIv3加密的,java需要用 RSA/ECB/PKCS1Padding 去解密
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
给你段代码验证一下,纯html+js本地解密
html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>RSA 解密</title> </head> <body> <h2>RSA 解密</h2> <h3>上传私钥</h3> <input type="file" id="privateKeyFile" accept=".pem" /> <h3>输入需要解密的内容(Base64编码的密文)</h3> <textarea id="contentToDecrypt"></textarea> <button onclick="decryptContent()">解密</button> <h4>解密结果:</h4> <pre id="decryptedContent"></pre> <script src="https://cdn.jsdelivr.net/npm/node-forge/dist/forge.min.js"></script> <script src="decrypt.js"></script> </body> </html>
decrypt.js
let privateKey; document.getElementById('privateKeyFile').addEventListener('change', handlePrivateKeyUpload); function handlePrivateKeyUpload(event) { const reader = new FileReader(); reader.onload = function(e) { privateKey = forge.pki.privateKeyFromPem(e.target.result); }; reader.readAsText(event.target.files[0]); } function decryptContent() { const content = document.getElementById('contentToDecrypt').value; if (privateKey) { try { let decrypted; // 尝试 RSA/ECB/PKCS1Padding 解密 try { const decodedContent = forge.util.decode64(content); // 解码Base64内容 decrypted = privateKey.decrypt(decodedContent, 'RSAES-PKCS1-V1_5'); // PKCS1Padding 解密 if (decrypted) { document.getElementById('decryptedContent').innerText = decrypted.replace(/\n/g, ' '); return; // 解密成功,直接返回 } } catch (e) { console.log("RSA/ECB/PKCS1Padding 解密失败,尝试 RSA/OAEP 解密"); } // 如果 RSA/ECB/PKCS1Padding 解密失败,尝试 RSA/OAEP 解密 try { const decodedContent = forge.util.decode64(content); // 解码Base64内容 decrypted = privateKey.decrypt(decodedContent, 'RSA-OAEP'); // 使用RSA v1.5/OAEP解密 if (decrypted) { document.getElementById('decryptedContent').innerText = decrypted.replace(/\n/g, ' '); return; } } catch (error) { alert('解密失败,请检查密文或私钥'); } } catch (error) { alert('解密失败,可能是密文格式不正确或私钥无效'); } } else { alert('请先上传私钥文件'); } }
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
这个接口返回的数据,字段不是标准APIv3加密的,java需要用 RSA/ECB/PKCS1Padding 去解密
有示例解密代码,cv试试不能用就联系微信技术支持,问他们怎么回事
给你段代码验证一下,纯html+js本地解密
html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>RSA 解密</title> </head> <body> <h2>RSA 解密</h2> <h3>上传私钥</h3> <input type="file" id="privateKeyFile" accept=".pem" /> <h3>输入需要解密的内容(Base64编码的密文)</h3> <textarea id="contentToDecrypt"></textarea> <button onclick="decryptContent()">解密</button> <h4>解密结果:</h4> <pre id="decryptedContent"></pre> <script src="https://cdn.jsdelivr.net/npm/node-forge/dist/forge.min.js"></script> <script src="decrypt.js"></script> </body> </html>
decrypt.js
let privateKey; document.getElementById('privateKeyFile').addEventListener('change', handlePrivateKeyUpload); function handlePrivateKeyUpload(event) { const reader = new FileReader(); reader.onload = function(e) { privateKey = forge.pki.privateKeyFromPem(e.target.result); }; reader.readAsText(event.target.files[0]); } function decryptContent() { const content = document.getElementById('contentToDecrypt').value; if (privateKey) { try { let decrypted; // 尝试 RSA/ECB/PKCS1Padding 解密 try { const decodedContent = forge.util.decode64(content); // 解码Base64内容 decrypted = privateKey.decrypt(decodedContent, 'RSAES-PKCS1-V1_5'); // PKCS1Padding 解密 if (decrypted) { document.getElementById('decryptedContent').innerText = decrypted.replace(/\n/g, ' '); return; // 解密成功,直接返回 } } catch (e) { console.log("RSA/ECB/PKCS1Padding 解密失败,尝试 RSA/OAEP 解密"); } // 如果 RSA/ECB/PKCS1Padding 解密失败,尝试 RSA/OAEP 解密 try { const decodedContent = forge.util.decode64(content); // 解码Base64内容 decrypted = privateKey.decrypt(decodedContent, 'RSA-OAEP'); // 使用RSA v1.5/OAEP解密 if (decrypted) { document.getElementById('decryptedContent').innerText = decrypted.replace(/\n/g, ' '); return; } } catch (error) { alert('解密失败,请检查密文或私钥'); } } catch (error) { alert('解密失败,可能是密文格式不正确或私钥无效'); } } else { alert('请先上传私钥文件'); } }