收藏
回答

小程序自定义分享,标题和图片仍为默认。查了没有违规记录,是哪里出问题了吗?

小程序的分享,分享到微信聊天对话框,自己可以看到自定义的标题和图片。但分享到聊天,对话框中对方收到的是默认标题和无图片。目前图片已采用oss。downloadFile的合法域名也配置正常。找不到问题出在哪里,朋友圈分享可以正常显示自定义标题和图片。

appId:wxc8778936ea8a23fe

远程的图片大小约400K左右,54比例。


/**
 * 直接分享给朋友
 * @param {Object} options - 分享选项
 * @param {string} options.title - 分享标题
 * @param {string} options.path - 分享路径
 * @param {string} options.imageUrl - 分享图片
 * @param {string} options.scene - 分享场景,可选值:WXSceneSession(好友)、WXSceneGroupChat(群聊)
 * @returns {Promise<Object>} - 分享结果
 */
export const shareAppMessage = async (options = {}) => {
  try {
    // 默认分享参数
    const defaultOptions = {
      title: '遛养派宠物管家 - 专业的宠物服务平台',
      path: '/pages/index/index',
      imageUrl: 'https://***oss.com/share/index1.png'
    }
    
    // 合并选项
    const shareOptions = { ...defaultOptions, ...options }
    
    // 获取当前页面路径
    const getCurrentPagePath = () => {
      try {
        const pages = getCurrentPages()
        if (pages && pages.length > 0) {
          const currentPage = pages[pages.length - 1]
          return `/${currentPage.route}`
        }
      } catch (e) {
        console.error('获取当前页面路径失败:', e)
      }
      return '/pages/index/index'
    }
    
    // 尝试获取分享签名
    let signatureData = null
    const enableSignature = storage.get('enableShareSignature')
    
    if (enableSignature !== false) {
      try {
        // 使用新的AuthService方式确保token有效
        const authService = getAuthService()
        
        // 检查并维护登录状态
        await authService.checkAndMaintainLogin()
        
        // 直接调用已修复的getShareSignature函数,使用最终路径
        signatureData = await getShareSignature({
          path: pathWithQuery,
          imageUrl: shareOptions.imageUrl,
          title: shareOptions.title,
          signatureAlgorithm: shareOptions.signatureAlgorithm || 'RSAwithSHA256'
        })
      } catch (err) {
        console.error('获取分享签名失败:', err)
      }
    }
    
    // 构建分享参数
    const shareParams = {
      title: shareOptions.title,
      path: pathWithQuery,
      imageUrl: shareOptions.imageUrl
    }
    
    // 如果有签名数据,添加到分享参数中
    if (signatureData) {
      shareParams.signature = signatureData.signature
      if (signatureData.appid) {
        shareParams.miniProgram = {
          appId: signatureData.appid,
          path: signatureData.path || (shareOptions.path || currentPath)
        }
      }
    }
    
    // 添加场景参数
    if (shareOptions.scene) {
      shareParams.scene = shareOptions.scene
    }
    
    // 调用小程序的分享API
    return new Promise((resolve, reject) => {
      try {
        // 使用uni-app的API,它会自动适配不同平台
        if (uni.shareAppMessage) {
          uni.shareAppMessage({
            ...shareParams,
            success: (res) => {
              uni.$emit('shareAppMessage:success', res)
              resolve(res)
            },
            fail: (err) => {
              console.error('直接分享失败', err)
              uni.$emit('shareAppMessage:fail', err)
              reject(err)
            }
          })
        } else if (typeof wx !== 'undefined' && wx.shareAppMessage) {
          // 降级到原生wx API
          wx.shareAppMessage({
            ...shareParams,
            success: (res) => {
              uni.$emit('shareAppMessage:success', res)
              resolve(res)
            },
            fail: (err) => {
              console.error('直接分享失败(wx)', err)
              uni.$emit('shareAppMessage:fail', err)
              reject(err)
            }
          })
        } else {
          // 如果两种API都不可用,则使用显示分享菜单的方式
          console.warn('分享API不可用,使用分享菜单方式')
          
          // 显示分享菜单
          try {
            if (typeof wx !== 'undefined' && wx.showShareMenu) {
              wx.showShareMenu({
                withShareTicket: true,
                menus: ['shareAppMessage', 'shareTimeline']
              })
              
              // 显示提示
              uni.showModal({
                title: '分享提示',
                content: '请点击右上角"..."选择转发给朋友',
                showCancel: false,
                success: () => {
                  // 模拟成功回调
                  setTimeout(() => {
                    uni.$emit('shareAppMessage:success', { errMsg: 'showShareMenu:ok' })
                    resolve({ errMsg: 'showShareMenu:ok' })
                  }, 500)
                }
              })
            } else {
              throw new Error('分享功能不可用')
            }
          } catch (shareMenuError) {
            console.error('显示分享菜单失败', shareMenuError)
            uni.showToast({
              title: '分享功能不可用',
              icon: 'none'
            })
            uni.$emit('shareAppMessage:fail', shareMenuError)
            reject(shareMenuError)
          }
        }
      } catch (error) {
        console.error('调用分享API异常:', error)
        reject(error)
      }
    })
  } catch (error) {
    console.error('直接分享异常:', error)
    throw error
  }
}
回答关注问题邀请回答
收藏

2 个回答

  • 奔牛
    奔牛
    2025-12-13

    https://developers.weixin.qq.com/s/t6T9immc8U5h

    2025-12-13
    有用
    回复
  • 智能回答 智能回答 本次回答由AI生成
    2025-12-13
    有用
    回复
登录 后发表内容