442 lines
10 KiB
Go
442 lines
10 KiB
Go
package controller
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/json"
|
|
"encoding/xml"
|
|
"fmt"
|
|
"github.com/codinl/go-logger"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/rs/zerolog/log"
|
|
"io/ioutil"
|
|
"mh-server/config"
|
|
aliyun "mh-server/lib/ali"
|
|
"mh-server/lib/auth"
|
|
"mh-server/lib/status"
|
|
"mh-server/lib/wxpay"
|
|
"mh-server/model"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func GameCardList(c *gin.Context) {
|
|
req := struct {
|
|
Page int `json:"cur_page"`
|
|
PageSize int `json:"page_size"`
|
|
SortType int `json:"sort_type"` // 排序类型 1-默认 2-新品 3-销量 4-价格 大到小 5-价格 小到大
|
|
GameTypeIds []uint64 `json:"game_type_id"` // 游戏类型id
|
|
StoreId uint32 `json:"store_id"`
|
|
}{
|
|
Page: 1,
|
|
PageSize: 10,
|
|
}
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
RespJson(c, status.BadRequest, nil)
|
|
return
|
|
}
|
|
fmt.Println("游戏类型:GameTypeIds:", req.GameTypeIds)
|
|
|
|
cardList, totalPage, err := model.GetGameCardList(req.SortType, req.Page, req.PageSize, req.GameTypeIds, req.StoreId)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
|
|
ret := map[string]interface{}{
|
|
"card_list": cardList,
|
|
"cur_page": req.Page,
|
|
"total_page": totalPage,
|
|
}
|
|
RespOK(c, ret)
|
|
}
|
|
|
|
func GameCardInfo(c *gin.Context) {
|
|
req := struct {
|
|
GameId uint64 `json:"game_id"`
|
|
}{}
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
RespJson(c, status.BadRequest, nil)
|
|
return
|
|
}
|
|
uc := auth.GetCurrentUser(c)
|
|
if uc == nil {
|
|
RespJson(c, status.Unauthorized, nil)
|
|
return
|
|
}
|
|
|
|
go model.HistoryBrowsingAdd(uint64(uc.Uid), req.GameId)
|
|
|
|
info, err := model.GetGameCardInfo(req.GameId)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
|
|
userCollection := model.GameCardUserCollection(uint64(uc.Uid), req.GameId)
|
|
|
|
ret := map[string]interface{}{
|
|
"card_info": info,
|
|
"is_collection": userCollection,
|
|
}
|
|
RespOK(c, ret)
|
|
}
|
|
|
|
func GameCardSearch(c *gin.Context) {
|
|
req := struct {
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
Name string `json:"name"` // 搜索
|
|
StoreId uint32 `json:"store_id"`
|
|
}{
|
|
Page: 1,
|
|
PageSize: 10,
|
|
}
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
RespJson(c, status.BadRequest, nil)
|
|
return
|
|
}
|
|
uc := auth.GetCurrentUser(c)
|
|
if uc == nil {
|
|
RespJson(c, status.Unauthorized, nil)
|
|
return
|
|
}
|
|
|
|
cardList, totalPage, err := model.GetGameCardSearch(req.Name, req.Page, req.PageSize,req.StoreId)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
err = model.SearchHistoryAdd(uc.Uid, req.Name)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
ret := map[string]interface{}{
|
|
"card_list": cardList,
|
|
"cur_page": req.Page,
|
|
"total_page": totalPage,
|
|
}
|
|
RespOK(c, ret)
|
|
}
|
|
|
|
func GameCardSearchHistory(c *gin.Context) {
|
|
uc := auth.GetCurrentUser(c)
|
|
if uc == nil {
|
|
RespJson(c, status.Unauthorized, nil)
|
|
return
|
|
}
|
|
historyList, err := model.GetSearchHistoryList(uc.Uid)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
RespOK(c, historyList)
|
|
}
|
|
|
|
func GameCardHotSearch(c *gin.Context) {
|
|
searchList, err := model.HotSearchList()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
RespOK(c, searchList)
|
|
}
|
|
|
|
func HomeCarouselList(c *gin.Context) {
|
|
carouselList, err := model.GetHomeCarouselList()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
RespOK(c, carouselList)
|
|
}
|
|
|
|
func GameCardTypeList(c *gin.Context) {
|
|
gameTypes, err := model.GetGameCardTypeList()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
RespOK(c, gameTypes)
|
|
return
|
|
}
|
|
|
|
func GameCardTypes(c *gin.Context) {
|
|
req := struct {
|
|
GameId uint64 `json:"game_id"`
|
|
}{}
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
RespJson(c, status.BadRequest, nil)
|
|
return
|
|
}
|
|
gameCard := model.GameCard{}
|
|
gameCard.ID = uint32(req.GameId)
|
|
|
|
gameTypes, err := gameCard.GetGameType()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
RespJson(c, status.InternalServerError, nil)
|
|
return
|
|
}
|
|
RespOK(c, gameTypes)
|
|
return
|
|
}
|
|
|
|
type (
|
|
PushTemplateMessageTarget struct {
|
|
Uid uint32 `json:"uid"`
|
|
WxName string `json:"wx_name"`
|
|
WxOpenID string `json:"wx_open_id"`
|
|
FormIdID uint32 `json:"form_id_id"`
|
|
FormId string `json:"form_id"`
|
|
}
|
|
|
|
WXPayNoticeResp struct {
|
|
XMLName xml.Name `xml:"xml"`
|
|
ReturnCode string `xml:"return_code" json:"return_code"`
|
|
}
|
|
)
|
|
|
|
const (
|
|
PRIZE_WX_PAY_TYPE = "pwxpt"
|
|
FB_WX_PAY_TYPE = "fbwxpt"
|
|
)
|
|
|
|
// 0 元购 微信推送支付通知
|
|
func PushWXPayNotice(c *gin.Context) {
|
|
fmt.Println("微信推送支付通知")
|
|
body, err := ioutil.ReadAll(c.Request.Body)
|
|
if err != nil {
|
|
logger.Error(err)
|
|
}
|
|
|
|
logger.Error("xml Request.Body1:", string(body))
|
|
var notify wxpay.WechatNotifyInfo
|
|
//if err := c.ShouldBindXML(¬ify); err != nil {
|
|
// logger.Error(err)
|
|
// RespBodyXML(c, map[string]string{
|
|
// "return_code": "FAIL",
|
|
// })
|
|
// return
|
|
//}
|
|
|
|
err = xml.Unmarshal(body, ¬ify)
|
|
if err != nil {
|
|
logger.Error(err)
|
|
}
|
|
ret := WXPayNoticeResp{
|
|
ReturnCode: "FAIL",
|
|
}
|
|
correctSign, err := PayCallBackHandle(notify, config.AppConfig.WxMchSecret)
|
|
|
|
if err != nil {
|
|
logger.Error("PushWXPayNotice sign create fail")
|
|
RespBodyXML(c, ret)
|
|
return
|
|
}
|
|
if notify.Sign != correctSign {
|
|
logger.Error("PushWXPayNotice sign verification fail")
|
|
RespBodyXML(c, ret)
|
|
return
|
|
}
|
|
|
|
if notify.Attach == wxpay.WxPayRentCard {
|
|
|
|
logger.Info("租借游戏卡 支付成功:")
|
|
//orderSn, err := strconv.Atoi(notify.OutTradeNo)
|
|
|
|
//if err != nil {
|
|
// logger.Error("err:", err)
|
|
//} else {
|
|
// //err = model.NewOrderQuerySet(model.DB).IDEq(uint32(orderId)).GetUpdater().
|
|
// // SetPayStatus(model.PayStatusPaid).Update()
|
|
// //if err != nil {
|
|
// // logger.Error("err:", err)
|
|
// //}
|
|
// err = model.NewOrderQuerySet(model.DB).OrderSnEq(notify.OutTradeNo).GetUpdater().
|
|
// SetPayStatus(model.PayStatusPaid).Update()
|
|
// if err != nil {
|
|
// logger.Error("err:", err)
|
|
// }
|
|
//}
|
|
err = model.NewOrderQuerySet(model.DB).OrderSnEq(notify.OutTradeNo).GetUpdater().
|
|
SetPayStatus(model.PayStatusPaid).SetPayTime(time.Now()).Update()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
}
|
|
|
|
//if err := model.NewUserPrizeOrderQuerySet(model.DB).OrderSnEq(notify.OutTradeNo).GetUpdater().
|
|
// SetOrderStatus(model.PRIZE_ORDER_STATUS_PROGRESS).Update(); err != nil {
|
|
// logger.Error(err)
|
|
//}
|
|
|
|
} else if notify.Attach == wxpay.WxPayMember {
|
|
|
|
logger.Info("开通会员 支付成功:")
|
|
|
|
logger.Info("用户uid:", notify.OutTradeNo)
|
|
|
|
//uid, err := strconv.Atoi(notify.OutTradeNo)
|
|
//if err != nil {
|
|
// logger.Error("err:", err)
|
|
// return
|
|
//}
|
|
record := &model.UserOpenMemberRecord{OpenNo: notify.OutTradeNo}
|
|
err := record.GetByOpenNo()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
}
|
|
var user model.User
|
|
err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).One(&user)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
} else {
|
|
expireTime := user.MemberExpire.AddDate(1, 0, 0)
|
|
if user.MemberLevel == 1 {
|
|
expireTime = time.Now().AddDate(1, 0, 0)
|
|
}
|
|
|
|
err = model.UserUpdate(&model.User{Uid: uint32(record.Uid), MemberLevel: 2, MemberExpire: expireTime})
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
}
|
|
|
|
count, err := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).Count()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
} else {
|
|
if count == 0 {
|
|
userInvite := &model.UserInvite{
|
|
FromUid: 0,
|
|
UserType: 0,
|
|
StoreId: 0,
|
|
MemberOpenTime: time.Now(),
|
|
MemberType: 2,
|
|
ToUid: record.Uid,
|
|
MemberStatus: 2,
|
|
}
|
|
err := userInvite.Create(model.DB)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
}
|
|
} else {
|
|
num, err := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater().
|
|
SetMemberOpenTime(time.Now()).SetMemberType(2).SetMemberStatus(2).UpdateNum()
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
}
|
|
if num == 0 {
|
|
logger.Error("更新错误")
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
fmt.Println("notify.TotalFee:", notify.TotalFee)
|
|
fmt.Println("notify.OutTradeNo:", notify.OutTradeNo)
|
|
|
|
}
|
|
|
|
logger.Debug("微信推动支付通知")
|
|
ret.ReturnCode = "SUCCESS"
|
|
RespBodyXML(c, ret)
|
|
}
|
|
|
|
func PayCallBackHandle(notify wxpay.WechatNotifyInfo, payKey string) (string, error) {
|
|
|
|
m, err := struct2Map(notify)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
sign, err := GenWechatPaySign(m, payKey)
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
sign = strings.ToUpper(sign)
|
|
logger.Error("微信推送支付通知 sign : payKey", sign, payKey)
|
|
return sign, err
|
|
}
|
|
|
|
func GenWechatPaySign(m map[string]string, payKey string) (string, error) {
|
|
delete(m, "sign")
|
|
var signData []string
|
|
for k, v := range m {
|
|
if v != "" && v != "0" {
|
|
signData = append(signData, fmt.Sprintf("%s=%s", k, v))
|
|
}
|
|
}
|
|
|
|
sort.Strings(signData)
|
|
signStr := strings.Join(signData, "&")
|
|
signStr = signStr + "&key=" + payKey
|
|
logger.Error("签字符串1 :", signStr)
|
|
c := md5.New()
|
|
_, err := c.Write([]byte(signStr))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
signByte := c.Sum(nil)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return fmt.Sprintf("%x", signByte), nil
|
|
}
|
|
|
|
func struct2Map(r interface{}) (s map[string]string, err error) {
|
|
var temp map[string]interface{}
|
|
var result = make(map[string]string)
|
|
|
|
bin, err := json.Marshal(r)
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
|
|
if err := json.Unmarshal(bin, &temp); err != nil {
|
|
return nil, err
|
|
}
|
|
for k, v := range temp {
|
|
switch v2 := v.(type) {
|
|
case string:
|
|
result[k] = v2
|
|
case uint, int8, uint8, int, int16, uint16, int32, uint32, int64, uint64:
|
|
result[k] = fmt.Sprintf("%d", v2)
|
|
case float32, float64:
|
|
result[k] = fmt.Sprintf("%.0f", v2)
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func AliyunStsTokenGet(c *gin.Context) {
|
|
uploadInfo, err := aliyun.GenStsToken("21000505")
|
|
if err != nil {
|
|
log.Error().Msgf("err=%v", err)
|
|
return
|
|
}
|
|
|
|
stsToken := model.RspAliyunStsToken{
|
|
AccessKeyId: uploadInfo.AccessKeyId,
|
|
AccessKeySecret: uploadInfo.AccessKeySecret,
|
|
SecurityToken: uploadInfo.SecurityToken,
|
|
BucketName: uploadInfo.BucketName,
|
|
Expiration: uint64(uploadInfo.Expiration),
|
|
}
|
|
|
|
RespOK(c, stsToken)
|
|
}
|