收藏
回答

调用jsapi下单,签名错误什么原因?

我想调用jsapi下单,使用v3,我使用文档提供的工具验签通过了,同时使用postman测试,输入我的参数也返回了prepay_id,说明格式和参数都没错,为什么还会报错:签名错误,请检查后再试。

回答关注问题邀请回答
收藏

2 个回答

  • 一笑皆春
    一笑皆春
    05-13

    V3密钥是不参与签名的,这个你处理了吗

    05-13
    有用 1
    回复 4
    • Zanu.
      Zanu.
      05-13
      按照文档来的,没有使用v3密钥,但是也没有设置相关不使用密钥的地方
      05-13
      1
      回复
    • Zanu.
      Zanu.
      05-13
      // 构造签名串
      function generateSignature() {
          const timestamp = Math.floor(Date.now() / 1000); // 时间戳
          const nonceStr = crypto.randomBytes(16).toString('hex'); // 随机字符串
          let message = `GET\n/v3/certificates\n${timestamp}\n${nonceStr}\n\n`; // 构建签名串
          console.log(message);
          // 将私钥字符串转换为Buffer
          const privateKey = crypto.createPrivateKey({
              key: PRIVATE_KEY,
              format: 'pem',
          });
          // 使用SHA-256进行签名
          const sign = crypto.createSign('SHA-256');
          sign.update(message);
          sign.end();
          // 使用私钥对签名进行签名
          const signature = sign.sign(privateKey, 'base64');
          // console.log('签名结果:', signature);
          // 构建Authorization头
          const authHeaderValue = `WECHATPAY2-SHA256-RSA2048 mchid="${MCH_ID}",nonce_str="${nonceStr}",signature="${signature}",timestamp="${timestamp}",serial_no="${SERIAL_NO}"`;
          console.log('请求头:', authHeaderValue);
          return {
              signature: signature,
              authHeaderValue: authHeaderValue
          };
      }
      router.post('/aaaaa', async (req, res) => {
          const { authHeaderValue, signature } = await generateSignature();
          res.send('成功生成签名!');
          const description = 'shangpinmiaos'; //商品描述
          const out_trade_no = 'klii14888798579817'; //订单号
          const amount = {
              total: 10, // 设置支付金额,单位为分
              currency: "CNY" // 设置货币类型,人民币
          };
          const payer = {
              openid: req.body.openid // 将获取到的openid赋值给payer对象的openid属性
          };
          const url = `https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi`;
          const paymentData = {
              appid: APPID,
              mchid: MCH_ID,
              description,
              out_trade_no,
              notify_url: NOTIFY_URL,
              amount,
              payer,
          };
          // console.log(authHeaderValue);
          const headers = {
              'Authorization': authHeaderValue,
              'Accept': 'application/json',
              'Content-Type': 'application/json'
          };
          // 添加请求拦截器
          axios.interceptors.request.use(
              config => {
                  // 在发送请求之前,打印请求头和请求体
                  console.log('请求头:', config.headers);
                  console.log('请求体:', config.data);
                  return config; // 必须返回config
              },
              error => {
                  // 对请求错误做些什么
                  return Promise.reject(error);
              }
          );
          // 使用 axios 发送 POST 请求
          axios.post(url, paymentData, { headers })
              .then(response => {
                  console.log(response.data);
              })
              .catch(error => {
                  console.error('创建支付时发生错误:', error.response ? error.response.data : error);
              });
      });
      05-13
      1
      回复
    • Zanu.
      Zanu.
      05-13
      真不知道错哪了,按照文档对了好几遍了
      05-13
      1
      回复
    • 一笑皆春
      一笑皆春
      05-13回复Zanu.
      文档排查一下吧
      https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-faqs.html
      05-13
      回复
  • Memory (私信不回复)
    Memory (私信不回复)
    05-13

    下单成功,调起支付报错的情况下,检查一下计算签名参数和调起参数是否一致,参数是否和文档要求一致

    05-13
    有用
    回复 2
登录 后发表内容