Nodejs 支付宝支付求助

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

Nodejs 支付宝支付求助

最近被卡在签名验证上了,好烦,不知道哪里错了,服务器加密出来的数据和支付宝工具加密的完全不一样,有没有 V 友已经集成过支付宝支付,求个 demo 例子。项目很急,微信已经搞定了就差支付宝了。万分感谢!!!

18 回复

……公司有保密协议呀,不能随便贴代码。签名不就是 crypto.createSign(“RSA-SHA256”) 么。你把你代码贴出来俺看看好咯。


你说的是验证签名?不是生成签名?验证签名用的是
const verify = crypto.createVerify(“RSA-SHA256”)
verify.update(strValues)
return verify.verify(appInfo.public, Buffer.from(strSign, “base64”))
返回的是布尔值表示签名是否正确。strValues 是参数按顺序拼成的字符串,strSign 是支付宝给的签名。


生成我贴下代码
const privateKey =
-----BEGIN EC PRIVATE KEY-----<br>MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCZUqn6UL7/PIM0m4r4gZhDNWy6narKRfwZGpmOX3CPxvVFWMu7qmJsRRm7o3Di82YE7y9smwertorEtrptjZNPh+7vkVKGX8njC/IlfJhKWKViYFNlGzCmtXVbA7+bP9GE+62f6PAu1wEmPP8lQd6to6yxNKAnqt1UMagx25KGQaVrhYbuk9ACPb9MzA2VszZwSHEYJ+5g+VKLNikxmvbh6XoUWNmo2+ROYxyFb00v7rYaucxY284p3vUUS4qu40bUPcZ3jIY/S7VSe+CGEjhtrf+jF3zTrjtZj3CXLJs1M3xWnmqW5GEArRMWxIZqmWupWwJ4iswULhS3QjfUdLbvAgMBAAECggEAeqXGtScsci4s4sNeGsZIT9MHxAxl1+K99DL0DRDJkSndf/i1GM0GaIeqOxBWOCXuQRo4fI9TRogCX7OwU/yBj4g0mU1Nj5JGhCpFLLmLdUWOHrDhZSqn82OKmiDYgE8/wjo1vIpwv3dcQwNeMqaLg6k/do2bY7/pxvTmD+QORPgyctVcv+DaQVKbjYuwjpFmPiy62Ro2zj7aoL8R4M3o9JJ7sBk0XH7afBi6dvasIb+Jn0RUX2PgfFw857Lv6QeBIWiUpVgJe138SE09P5Oeo3dR8ioNmbNsHXTjeKTeAN/coawV9o/TsbB7lYTncjFu3x5NIRWEn3Cd0dLD2i2sqQKBgQDseqagDq6r/vtdJyP9B5N10evHgvOdmcxaCFTrcLc5cYvwSf/gGzLNegVrzbuEL8osJPM/DWZxhMMOn+b32uiAyJXFNhneswyPOapZDmgnnYYYHqSyfe5p9/g/GVjmbsDXmp/JQXqKMrb5OvkJDkhDeR00Zi6fmYeXTNYBoOCmswKBgQCl+rsSOyYUzQIMW9+EdLPV2knO9FuA3r5VXdoul4P8tm/KTdFMdhLiETMNeY718rNz5hxSVjb/5JdsajUU72+DwwkEvNtXNUAzTfRc7Rro407PuWbGJ/qwtCK4a6oyMhkPMI1lcD4ZbE1RYpKhWV0A09JfxNTtFgbS4PVuJy/s1QKBgQCUq59p7REfjNSXAe58O3EXl3w2GDv0jyaMS8SnqFtov9wMm1lEmZTc3aPe3J7RQgJGsoxCzbfkEmVXImxg0r1tia2vKI4nFkYFHWndR1Nv5HbTXyCIHufuszjc4qCjbmnKoqlmK8ZQcAXctpiues4vrUsREFSrfihilKnOqEfURQKBgD2Yc84LN1Gm1ujBO4zLRmXJcXSlCEQl5VqGzs5Vmjyxc4EPKeoHM3DD0z9f6ibp36DWN5Jyvkxuh6dLLtHLHYY3XeRtNbUCZQXlGxdVQpRErt21vycwdP8Yin4ILowcPWJ+sSqA4frLT1Ixk5rfL/17nmm+AQrPDs85frtXPZjVAoGBAKTUJrfQs6PrWfUbr0n+oHLa7Fll/z2zrpJvM68cwg6mF734C0lJe5UJ9zSg00DhwrnDr+aKZ1z+ZPZfI4tbD4GyKPwi5PtvQjqlVssTQV+1tOr+hSrbF8Gm+I6inKvYJW1UYR5DxAu/lpSTdONgGZuM6O3VA6/GDF911+ub5iah<br>-----END EC PRIVATE KEY-----;
var sign = crypto.createSign(‘RSA-SHA256’);
sign.update(str);
var signstr = sign.sign(privateKey, ‘Base64’);
我加密出来的和工具的就是不一样,私钥的格式错了么

可以通过支付宝的签名验证工具来比对啊,验证工具里面会给出每一步的数据,你一步一步对比看看哪一步出问题了

我就是加密出来和工具不一样,所以纠结。明天再看看,一个人做 2 个项目。很纠结。很烦

私钥我加的是 -----BEGIN RSA PRIVATE KEY----- 不是 EC
排序对吗? biz_content: JSON.stringify({}) 对吗?算加密的时候不用 querystring.escape 值但生成 url 时要 escape。

#3 把 key 都贴出来真的好吗 = =

如果有中文的话,你应该是少了一个编码参数,曾经我也遇到这样的问题。

<br>let verify = crypto.createVerify( "RSA-SHA1", 'utf8' );<br><br>verify.update( signstr, "utf8" );<br>

没事,还有公钥,到时候会替换下。

嗯,明天上班再看看。不懂再问,感谢各位回答

为什么有关 node.js 的贴都是黑的

我把 key EC 改成 RSA 会提示 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag

o 那还是保留不报错的把 XD 那只能是参数排序编码的问题咯

可以了。应该是加密的数据组装、编码的时候错了。现在可以了 感谢各位~

恩。刚刚重新写方法。可以啦

针对你提到的Node.js中实现支付宝支付的问题,以下是一个基本的实现思路和代码示例:

首先,你需要在支付宝开放平台创建一个应用,并获取相关的appId、私钥、公钥等配置信息。然后,你可以使用支付宝提供的Node.js SDK来实现支付功能。

以下是一个简单的示例代码:

const express = require('express');
const AlipaySdk = require('alipay-sdk').default;
const fs = require('fs');

const app = express();
const alipaySdk = new AlipaySdk({
  appId: '你的appId',
  signType: 'RSA2',
  privateKey: fs.readFileSync('./path/to/your/private-key.pem', 'ascii'),
  alipayPublicKey: fs.readFileSync('./path/to/your/alipay-public-key.pem', 'ascii'),
  gateway: 'https://openapi.alipay.com/gateway.do'
});

app.post('/pay', async (req, res) => {
  const bizContent = {
    out_trade_no: req.body.outTradeNo,
    total_amount: req.body.totalAmount,
    subject: req.body.subject,
    product_code: 'FAST_INSTANT_TRADE_PAY'
  };

  try {
    const result = await alipaySdk.exec('alipay.trade.page.pay', {}, { bizContent });
    res.json({ url: result });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

请确保你已经安装了alipay-sdk,并正确配置了私钥和公钥。上述代码创建了一个简单的Express服务器,监听在3000端口,并提供了一个/pay的POST接口来处理支付请求。你需要根据实际情况调整bizContent中的参数。

回到顶部