123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package payment
- import (
- "encoding/json"
- "eta/eta_mini_ht_api/common/component/cache"
- logger "eta/eta_mini_ht_api/common/component/log"
- "eta/eta_mini_ht_api/common/utils/redis"
- "fmt"
- "github.com/google/uuid"
- "github.com/mitchellh/mapstructure"
- "strings"
- "time"
- )
- const (
- PENDING = "pending"
- READY = "ready"
- USED = "used"
- EXPIRED = "expired"
- )
- var (
- rdb = cache.GetInstance()
- )
- // PaymentToken Redis存储结构
- type PaymentToken struct {
- PaymentParams *PaymentParam `json:"payment_params"`
- ExpireTime int64 `json:"expire_time"`
- }
- // PaymentParam 支付参数结构
- type PaymentParam struct {
- ProductOrderNo string `json:"product_order_no" mapStruct:"ProductOrderNo"`
- PayOrderNo string `json:"pay_order_no" mapStruct:"PayOrderNo"`
- Package string `json:"package" mapStruct:"Package"`
- Timestamp string `json:"timestamp" mapStruct:"Timestamp"`
- NonceStr string `json:"nonceStr" mapStruct:"NonceStr"`
- PaySign string `json:"paySign" mapStruct:"PaySign"`
- SignType string `json:"signType" mapStruct:"SignType"`
- Status string `json:"status" mapStruct:"Status"`
- }
- // SavePaymentToken Redis操作辅助函数
- func SavePaymentToken(pt *PaymentToken) (token string, err error) {
- //需要过期所有的对应产品订单的历史支付订单
- keys, _ := rdb.Keys("payment:token:*")
- for _, key := range keys {
- payParam, _ := GetPaymentParam(strings.TrimPrefix(key, "payment:token:"))
- if payParam.PayOrderNo != "" && payParam.ProductOrderNo != "" && payParam.Status != "" {
- payParam.Status = EXPIRED
- jsonData, _ := json.Marshal(pt)
- _ = rdb.UpdateHSetNoExpire(key, jsonData)
- }
- }
- token = generateWechatOrderToken()
- paramMap, err := StructToMap(pt.PaymentParams)
- if err != nil {
- return
- }
- err = rdb.SetHSet(redis.GenerateWechatOrderToken(token), time.Until(time.Unix(pt.ExpireTime, 0)), paramMap)
- return
- }
- func StructToMap(v interface{}) (mapResult map[string]string, err error) {
- mapResult = make(map[string]string)
- decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
- Result: &mapResult,
- TagName: "mapStruct",
- })
- if err != nil {
- return nil, err
- }
- err = decoder.Decode(v)
- if err != nil {
- return nil, err
- }
- return
- }
- func MapToStruct(mapResult map[string]string, v interface{}) (err error) {
- decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
- Result: v,
- TagName: "mapStruct",
- })
- if err != nil {
- return
- }
- err = decoder.Decode(mapResult)
- if err != nil {
- return
- }
- return
- }
- func GetPaymentParam(token string) (paymentParam PaymentParam, err error) {
- val := rdb.GetHSet("payment:token:" + token)
- err = MapToStruct(val, &paymentParam)
- if err != nil {
- logger.Error("生成微信订单token失败,%v", err)
- return
- }
- if paymentParam.ProductOrderNo == "" || paymentParam.PayOrderNo == "" {
- err = fmt.Errorf("订单信息不存在:" + token)
- }
- return
- }
- // GenerateWechatOrderToken 生成token
- func generateWechatOrderToken() (token string) {
- return strings.ReplaceAll(uuid.New().String(), "-", "")
- }
- func Ready(token string, param PaymentParam) (err error) {
- param.Status = READY
- paramMap, _ := StructToMap(param)
- return rdb.UpdateHSetNoExpire(token, paramMap)
- }
- func Used(token string, param PaymentParam) (err error) {
- param.Status = USED
- paramMap, _ := StructToMap(param)
- return rdb.UpdateHSetNoExpire(token, paramMap)
- }
|