payment_utils.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package payment
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_ht_api/common/component/cache"
  5. logger "eta/eta_mini_ht_api/common/component/log"
  6. "eta/eta_mini_ht_api/common/utils/redis"
  7. "fmt"
  8. "github.com/google/uuid"
  9. "github.com/mitchellh/mapstructure"
  10. "strings"
  11. "time"
  12. )
  13. const (
  14. PENDING = "pending"
  15. READY = "ready"
  16. USED = "used"
  17. EXPIRED = "expired"
  18. )
  19. var (
  20. rdb = cache.GetInstance()
  21. )
  22. // PaymentToken Redis存储结构
  23. type PaymentToken struct {
  24. PaymentParams *PaymentParam `json:"payment_params"`
  25. ExpireTime int64 `json:"expire_time"`
  26. }
  27. // PaymentParam 支付参数结构
  28. type PaymentParam struct {
  29. ProductOrderNo string `json:"product_order_no" mapStruct:"ProductOrderNo"`
  30. PayOrderNo string `json:"pay_order_no" mapStruct:"PayOrderNo"`
  31. Package string `json:"package" mapStruct:"Package"`
  32. Timestamp string `json:"timestamp" mapStruct:"Timestamp"`
  33. NonceStr string `json:"nonce_str" mapStruct:"NonceStr"`
  34. PaySign string `json:"pay_sign" mapStruct:"PaySign"`
  35. SignType string `json:"sign_type" mapStruct:"SignType"`
  36. Status string `json:"status" mapStruct:"Status"`
  37. }
  38. // SavePaymentToken Redis操作辅助函数
  39. func SavePaymentToken(pt *PaymentToken) (token string, err error) {
  40. //需要过期所有的对应产品订单的历史支付订单
  41. keys, _ := rdb.Keys("payment:token:*")
  42. for _, key := range keys {
  43. payParam, _ := GetPaymentParam(strings.TrimPrefix(key, "payment:token:"))
  44. if payParam.PayOrderNo != "" && payParam.ProductOrderNo != "" && payParam.Status != "" {
  45. payParam.Status = EXPIRED
  46. jsonData, _ := json.Marshal(pt)
  47. _ = rdb.UpdateHSetNoExpire(key, jsonData)
  48. }
  49. }
  50. token = generateWechatOrderToken()
  51. paramMap, err := StructToMap(pt.PaymentParams)
  52. if err != nil {
  53. return
  54. }
  55. err = rdb.SetHSet(redis.GenerateWechatOrderToken(token), time.Until(time.Unix(pt.ExpireTime, 0)), paramMap)
  56. return
  57. }
  58. func StructToMap(v interface{}) (mapResult map[string]string, err error) {
  59. mapResult = make(map[string]string)
  60. decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
  61. Result: &mapResult,
  62. TagName: "mapStruct",
  63. })
  64. if err != nil {
  65. return nil, err
  66. }
  67. err = decoder.Decode(v)
  68. if err != nil {
  69. return nil, err
  70. }
  71. return
  72. }
  73. func MapToStruct(mapResult map[string]string, v interface{}) (err error) {
  74. decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
  75. Result: v,
  76. TagName: "mapStruct",
  77. })
  78. if err != nil {
  79. return
  80. }
  81. err = decoder.Decode(mapResult)
  82. if err != nil {
  83. return
  84. }
  85. return
  86. }
  87. func GetPaymentParam(token string) (paymentParam PaymentParam, err error) {
  88. val := rdb.GetHSet("payment:token:" + token)
  89. err = MapToStruct(val, &paymentParam)
  90. if err != nil {
  91. logger.Error("生成微信订单token失败,%v", err)
  92. return
  93. }
  94. if paymentParam.ProductOrderNo == "" || paymentParam.PayOrderNo == "" {
  95. err = fmt.Errorf("订单信息不存在:" + token)
  96. }
  97. return
  98. }
  99. // GenerateWechatOrderToken 生成token
  100. func generateWechatOrderToken() (token string) {
  101. return strings.ReplaceAll(uuid.New().String(), "-", "")
  102. }