小程序的分享,分享到微信聊天对话框,自己可以看到自定义的标题和图片。但分享到聊天,对话框中对方收到的是默认标题和无图片。目前图片已采用oss。downloadFile的合法域名也配置正常。找不到问题出在哪里,朋友圈分享可以正常显示自定义标题和图片。
appId:wxc8778936ea8a23fe
远程的图片大小约400K左右,5:4比例。
/**
* 直接分享给朋友
* @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
}
}

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