mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-17 08:46:38 +08:00
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package wx
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// Message 转账消息
|
|
type Message struct {
|
|
Des string
|
|
Url string
|
|
}
|
|
|
|
// Transaction 解析后的交易信息
|
|
type Transaction struct {
|
|
TransId string `json:"trans_id"` // 微信转账交易 ID
|
|
Amount float64 `json:"amount"` // 微信转账交易金额
|
|
Remark string `json:"remark"` // 转账备注
|
|
}
|
|
|
|
// 解析微信转账消息
|
|
func parseTransactionMessage(xmlData string) *Message {
|
|
decoder := xml.NewDecoder(strings.NewReader(xmlData))
|
|
message := Message{}
|
|
for {
|
|
token, err := decoder.Token()
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
switch se := token.(type) {
|
|
case xml.StartElement:
|
|
var value string
|
|
if se.Name.Local == "des" && message.Des == "" {
|
|
if err := decoder.DecodeElement(&value, &se); err == nil {
|
|
message.Des = strings.TrimSpace(value)
|
|
}
|
|
break
|
|
}
|
|
if se.Name.Local == "weapp_path" && !strings.Contains(message.Url, "customerDetails.html") {
|
|
if err := decoder.DecodeElement(&value, &se); err == nil {
|
|
message.Url = strings.TrimSpace(value)
|
|
}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return &message
|
|
}
|
|
|
|
// 导出交易信息
|
|
func extractTransaction(message *Message) Transaction {
|
|
var tx = Transaction{}
|
|
// 导出交易金额和备注
|
|
lines := strings.Split(message.Des, "\n")
|
|
for _, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
if len(line) == 0 {
|
|
continue
|
|
}
|
|
// 解析收款金额
|
|
prefix := "收款金额¥"
|
|
if strings.HasPrefix(line, prefix) {
|
|
if value, err := strconv.ParseFloat(line[len(prefix):], 64); err == nil {
|
|
tx.Amount = value
|
|
continue
|
|
}
|
|
}
|
|
// 解析收款备注
|
|
prefix = "付款方备注"
|
|
if strings.HasPrefix(line, prefix) {
|
|
tx.Remark = line[len(prefix):]
|
|
break
|
|
}
|
|
}
|
|
|
|
// 解析交易 ID
|
|
parse, err := url.Parse(message.Url)
|
|
if err == nil {
|
|
tx.TransId = parse.Query().Get("id")
|
|
}
|
|
return tx
|
|
}
|