mirror of
https://github.com/hicccc77/WeFlow.git
synced 2026-03-24 23:06:51 +00:00
新增转账消息的解析
This commit is contained in:
@@ -2489,6 +2489,13 @@
|
||||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.transfer-desc {
|
||||
font-size: 12px;
|
||||
margin-bottom: 4px;
|
||||
opacity: 0.9;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.transfer-memo {
|
||||
font-size: 13px;
|
||||
margin-bottom: 8px;
|
||||
|
||||
@@ -1972,6 +1972,10 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat, o
|
||||
const [voiceWaveform, setVoiceWaveform] = useState<number[]>([])
|
||||
const voiceAutoDecryptTriggered = useRef(false)
|
||||
|
||||
// 转账消息双方名称
|
||||
const [transferPayerName, setTransferPayerName] = useState<string | undefined>(undefined)
|
||||
const [transferReceiverName, setTransferReceiverName] = useState<string | undefined>(undefined)
|
||||
|
||||
// 视频相关状态
|
||||
const [videoLoading, setVideoLoading] = useState(false)
|
||||
const [videoInfo, setVideoInfo] = useState<{ videoUrl?: string; coverUrl?: string; thumbUrl?: string; exists: boolean } | null>(null)
|
||||
@@ -2136,6 +2140,26 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat, o
|
||||
}
|
||||
}, [isGroupChat, isSent, message.senderUsername, myAvatarUrl])
|
||||
|
||||
// 解析转账消息的付款方和收款方显示名称
|
||||
useEffect(() => {
|
||||
const payerWxid = (message as any).transferPayerUsername
|
||||
const receiverWxid = (message as any).transferReceiverUsername
|
||||
if (!payerWxid && !receiverWxid) return
|
||||
// 仅对转账消息类型处理
|
||||
if (message.localType !== 49 && message.localType !== 8589934592049) return
|
||||
|
||||
window.electronAPI.chat.resolveTransferDisplayNames(
|
||||
session.username,
|
||||
payerWxid || '',
|
||||
receiverWxid || ''
|
||||
).then((result: { payerName: string; receiverName: string }) => {
|
||||
if (result) {
|
||||
setTransferPayerName(result.payerName)
|
||||
setTransferReceiverName(result.receiverName)
|
||||
}
|
||||
}).catch(() => { })
|
||||
}, [(message as any).transferPayerUsername, (message as any).transferReceiverUsername, session.username])
|
||||
|
||||
// 自动下载表情包
|
||||
useEffect(() => {
|
||||
if (emojiLocalPath) return
|
||||
@@ -3002,6 +3026,7 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat, o
|
||||
let url = ''
|
||||
let appMsgType = ''
|
||||
let textAnnouncement = ''
|
||||
let parsedDoc: Document | null = null
|
||||
|
||||
try {
|
||||
const content = message.rawContent || message.parsedContent || ''
|
||||
@@ -3009,13 +3034,13 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat, o
|
||||
const xmlContent = content.substring(content.indexOf('<msg>'))
|
||||
|
||||
const parser = new DOMParser()
|
||||
const doc = parser.parseFromString(xmlContent, 'text/xml')
|
||||
parsedDoc = parser.parseFromString(xmlContent, 'text/xml')
|
||||
|
||||
title = doc.querySelector('title')?.textContent || '链接'
|
||||
desc = doc.querySelector('des')?.textContent || ''
|
||||
url = doc.querySelector('url')?.textContent || ''
|
||||
appMsgType = doc.querySelector('appmsg > type')?.textContent || doc.querySelector('type')?.textContent || ''
|
||||
textAnnouncement = doc.querySelector('textannouncement')?.textContent || ''
|
||||
title = parsedDoc.querySelector('title')?.textContent || '链接'
|
||||
desc = parsedDoc.querySelector('des')?.textContent || ''
|
||||
url = parsedDoc.querySelector('url')?.textContent || ''
|
||||
appMsgType = parsedDoc.querySelector('appmsg > type')?.textContent || parsedDoc.querySelector('type')?.textContent || ''
|
||||
textAnnouncement = parsedDoc.querySelector('textannouncement')?.textContent || ''
|
||||
} catch (e) {
|
||||
console.error('解析 AppMsg 失败:', e)
|
||||
}
|
||||
@@ -3143,19 +3168,10 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat, o
|
||||
// 转账消息 (type=2000)
|
||||
if (appMsgType === '2000') {
|
||||
try {
|
||||
const content = message.rawContent || message.content || message.parsedContent || ''
|
||||
|
||||
// 添加调试日志
|
||||
|
||||
|
||||
const parser = new DOMParser()
|
||||
const doc = parser.parseFromString(content, 'text/xml')
|
||||
|
||||
const feedesc = doc.querySelector('feedesc')?.textContent || ''
|
||||
const payMemo = doc.querySelector('pay_memo')?.textContent || ''
|
||||
const paysubtype = doc.querySelector('paysubtype')?.textContent || '1'
|
||||
|
||||
|
||||
// 使用外层已解析好的 parsedDoc(已去除 wxid 前缀)
|
||||
const feedesc = parsedDoc?.querySelector('feedesc')?.textContent || ''
|
||||
const payMemo = parsedDoc?.querySelector('pay_memo')?.textContent || ''
|
||||
const paysubtype = parsedDoc?.querySelector('paysubtype')?.textContent || '1'
|
||||
|
||||
// paysubtype: 1=待收款, 3=已收款
|
||||
const isReceived = paysubtype === '3'
|
||||
@@ -3163,6 +3179,11 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat, o
|
||||
// 如果 feedesc 为空,使用 title 作为降级
|
||||
const displayAmount = feedesc || title || '微信转账'
|
||||
|
||||
// 构建转账描述:A 转账给 B
|
||||
const transferDesc = transferPayerName && transferReceiverName
|
||||
? `${transferPayerName} 转账给 ${transferReceiverName}`
|
||||
: undefined
|
||||
|
||||
return (
|
||||
<div className={`transfer-message ${isReceived ? 'received' : ''}`}>
|
||||
<div className="transfer-icon">
|
||||
@@ -3173,6 +3194,7 @@ function MessageBubble({ message, session, showTime, myAvatarUrl, isGroupChat, o
|
||||
</div>
|
||||
<div className="transfer-info">
|
||||
<div className="transfer-amount">{displayAmount}</div>
|
||||
{transferDesc && <div className="transfer-desc">{transferDesc}</div>}
|
||||
{payMemo && <div className="transfer-memo">{payMemo}</div>}
|
||||
<div className="transfer-label">{isReceived ? '已收款' : '微信转账'}</div>
|
||||
</div>
|
||||
|
||||
1
src/types/electron.d.ts
vendored
1
src/types/electron.d.ts
vendored
@@ -85,6 +85,7 @@ export interface ElectronAPI {
|
||||
}>
|
||||
getContact: (username: string) => Promise<Contact | null>
|
||||
getContactAvatar: (username: string) => Promise<{ avatarUrl?: string; displayName?: string } | null>
|
||||
resolveTransferDisplayNames: (chatroomId: string, payerUsername: string, receiverUsername: string) => Promise<{ payerName: string; receiverName: string }>
|
||||
getContacts: () => Promise<{
|
||||
success: boolean
|
||||
contacts?: ContactInfo[]
|
||||
|
||||
@@ -64,6 +64,9 @@ export interface Message {
|
||||
fileSize?: number // 文件大小
|
||||
fileExt?: string // 文件扩展名
|
||||
xmlType?: string // XML 中的 type 字段
|
||||
// 转账消息
|
||||
transferPayerUsername?: string // 转账付款方 wxid
|
||||
transferReceiverUsername?: string // 转账收款方 wxid
|
||||
// 名片消息
|
||||
cardUsername?: string // 名片的微信ID
|
||||
cardNickname?: string // 名片的昵称
|
||||
|
||||
Reference in New Issue
Block a user