refund.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package notify
  2. import (
  3. "crypto/md5"
  4. "encoding/base64"
  5. "encoding/hex"
  6. "encoding/xml"
  7. "errors"
  8. "github.com/silenceper/wechat/v2/util"
  9. )
  10. // reference: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10
  11. // RefundedResult 退款回调
  12. type RefundedResult struct {
  13. ReturnCode *string `xml:"return_code"`
  14. ReturnMsg *string `xml:"return_msg"`
  15. AppID *string `xml:"appid"`
  16. MchID *string `xml:"mch_id"`
  17. NonceStr *string `xml:"nonce_str"`
  18. ReqInfo *string `xml:"req_info"`
  19. }
  20. // RefundedReqInfo 退款结果(明文)
  21. type RefundedReqInfo struct {
  22. TransactionID *string `xml:"transaction_id"`
  23. OutTradeNO *string `xml:"out_trade_no"`
  24. RefundID *string `xml:"refund_id"`
  25. OutRefundNO *string `xml:"out_refund_no"`
  26. TotalFee *int `xml:"total_fee"`
  27. SettlementTotalFee *int `xml:"settlement_total_fee"`
  28. RefundFee *int `xml:"refund_fee"`
  29. SettlementRefundFee *int `xml:"settlement_refund_fee"`
  30. RefundStatus *string `xml:"refund_status"`
  31. SuccessTime *string `xml:"success_time"`
  32. RefundRecvAccount *string `xml:"refund_recv_account"`
  33. RefundAccount *string `xml:"refund_account"`
  34. RefundRequestSource *string `xml:"refund_request_source"`
  35. }
  36. // RefundedResp 消息通知返回
  37. type RefundedResp struct {
  38. ReturnCode string `xml:"return_code"`
  39. ReturnMsg string `xml:"return_msg"`
  40. }
  41. // DecryptReqInfo 对退款结果进行解密
  42. func (notify *Notify) DecryptReqInfo(result *RefundedResult) (*RefundedReqInfo, error) {
  43. var err error
  44. if result == nil || result.ReqInfo == nil {
  45. return nil, errors.New("empty refunded_result or req_info")
  46. }
  47. base64Decode, err := base64.StdEncoding.DecodeString(*result.ReqInfo)
  48. if err != nil {
  49. return nil, err
  50. }
  51. hash := md5.New()
  52. if _, err = hash.Write([]byte(notify.Key)); err != nil {
  53. return nil, err
  54. }
  55. md5APIKey := hex.EncodeToString(hash.Sum(nil))
  56. data, err := util.AesECBDecrypt(base64Decode, []byte(md5APIKey))
  57. if err != nil {
  58. return nil, err
  59. }
  60. res := &RefundedReqInfo{}
  61. if err = xml.Unmarshal(data, res); err != nil {
  62. return nil, err
  63. }
  64. return res, nil
  65. }