首页 前端知识 vue接入小红书分享JS SDK,node生成signature过程

vue接入小红书分享JS SDK,node生成signature过程

2025-03-11 15:03:50 前端知识 前端哥 498 664 我要收藏

1.vue使用步骤

先调用后端返回的接口,然后使用接口返回的数据去调用小红书的分享方法。

// 分享到小红书
const shareXhs = async() => {
  const data = await getXhsSignature() //调用接口
  xhs.share({
    shareInfo: {
      type: 'normal',  // 或 'video'
      title: '', // 分享标题
      content: ``, // 分享内容
      images: [`${baseUrl}/images/${props.image.image}.jpg`],  // 图片地址(必须是服务器地址)
    },
    verifyConfig: {
      appKey: data.appKey,
      nonce: data.nonce,
      timestamp: data.timestamp,
      signature: data.signature,
    },
    fail: (e) => {
      console.error('分享失败', e);
    }
  });
}

2.node生成签名步骤

获取token,生成小红书签名函数。token根据expires_in有效时间作了缓存。

const axios = require('axios');
const crypto = require("crypto-js");
const appKey = "xxxx";
const appSecret = "xxxx";
let cachedAccessToken = null;
let accessTokenExpiresAt = 0; // 记录 access_token 过期时间

// 生成小红书签名
function generateSignature(appKey, nonce, timeStamp, appSecret) {
  console.log( nonce, timeStamp);
  
  const params = {
    appKey,
    nonce,
    timeStamp,
  };
  const sortedParams = Object.keys(params)
    .sort()
    .map((key) => `${key}=${params[key]}`)
    .join("&");
  const stringToSign = sortedParams + appSecret;
  return crypto.SHA256(stringToSign).toString();
}

// 获取小红书access_token
const getAccessToken = async (nonce, timestamp) => {
  if (cachedAccessToken && Date.now() < accessTokenExpiresAt) {
    // 如果 access_token 未过期,则直接返回缓存的 token
    return cachedAccessToken;
  }

  const signature = generateSignature(appKey, nonce, timestamp, appSecret);
  try {
    const response = await axios.post("https://edith.xiaohongshu.com/api/sns/v1/ext/access/token", {
      app_key: appKey,
      nonce: nonce,
      timestamp: timestamp,
      signature: signature,
    }, {
      headers: {
        "Content-Type": "application/json",
      },
    });
    const { access_token, expires_in } = response.data.data;

    // 缓存 access_token 和计算过期时间
    cachedAccessToken = access_token;
    accessTokenExpiresAt = expires_in; 

    return cachedAccessToken;
  } catch (error) {
    console.error('请求失败:', error);
    throw error; // 处理错误
  }
};

 使用

const nonce = Math.random().toString(36).substring(2); 
const timestamp = Date.now();
const accessToken = await getAccessToken(nonce, timestamp);
const signature = generateSignature(appKey, nonce, timestamp, accessToken);

注意:每次调用需保证nonce,timestamp重新生成。

官方文档:小红书分享开放平台

转载请注明出处或者链接地址:https://www.qianduange.cn//article/23270.html
标签
评论
发布的文章

面试题之强缓存协商缓存

2025-03-11 15:03:21

【C语言】数组篇

2025-03-11 15:03:19

正则表达式(复习)

2025-03-11 15:03:17

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!