78 lines
2.1 KiB
Go
78 lines
2.1 KiB
Go
package notify
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/base64"
|
|
"encoding/hex"
|
|
"encoding/xml"
|
|
"errors"
|
|
|
|
"github.com/silenceper/wechat/v2/util"
|
|
)
|
|
|
|
// reference: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10
|
|
|
|
// RefundedResult 退款回调
|
|
type RefundedResult struct {
|
|
ReturnCode *string `xml:"return_code"`
|
|
ReturnMsg *string `xml:"return_msg"`
|
|
|
|
AppID *string `xml:"appid"`
|
|
MchID *string `xml:"mch_id"`
|
|
NonceStr *string `xml:"nonce_str"`
|
|
ReqInfo *string `xml:"req_info"`
|
|
}
|
|
|
|
// RefundedReqInfo 退款结果(明文)
|
|
type RefundedReqInfo struct {
|
|
TransactionID *string `xml:"transaction_id"`
|
|
OutTradeNO *string `xml:"out_trade_no"`
|
|
RefundID *string `xml:"refund_id"`
|
|
OutRefundNO *string `xml:"out_refund_no"`
|
|
TotalFee *int `xml:"total_fee"`
|
|
SettlementTotalFee *int `xml:"settlement_total_fee"`
|
|
RefundFee *int `xml:"refund_fee"`
|
|
SettlementRefundFee *int `xml:"settlement_refund_fee"`
|
|
RefundStatus *string `xml:"refund_status"`
|
|
SuccessTime *string `xml:"success_time"`
|
|
RefundRecvAccount *string `xml:"refund_recv_accout"`
|
|
RefundAccount *string `xml:"refund_account"`
|
|
RefundRequestSource *string `xml:"refund_request_source"`
|
|
}
|
|
|
|
// RefundedResp 消息通知返回
|
|
type RefundedResp struct {
|
|
ReturnCode string `xml:"return_code"`
|
|
ReturnMsg string `xml:"return_msg"`
|
|
}
|
|
|
|
// DecryptReqInfo 对退款结果进行解密
|
|
func (notify *Notify) DecryptReqInfo(result *RefundedResult) (*RefundedReqInfo, error) {
|
|
var err error
|
|
if result == nil || result.ReqInfo == nil {
|
|
return nil, errors.New("empty refunded_result or req_info")
|
|
}
|
|
|
|
base64Decode, err := base64.StdEncoding.DecodeString(*result.ReqInfo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
hash := md5.New()
|
|
if _, err = hash.Write([]byte(notify.Key)); err != nil {
|
|
return nil, err
|
|
}
|
|
md5APIKey := hex.EncodeToString(hash.Sum(nil))
|
|
|
|
data, err := util.AesECBDecrypt(base64Decode, []byte(md5APIKey))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
res := &RefundedReqInfo{}
|
|
if err = xml.Unmarshal(data, res); err != nil {
|
|
return nil, err
|
|
}
|
|
return res, nil
|
|
}
|