Compare commits

..

No commits in common. "master" and "init" have entirely different histories.
master ... init

11 changed files with 56 additions and 204 deletions

View File

@ -45,7 +45,7 @@ func HGamePreOrder(w http.ResponseWriter, r *http.Request) {
uid := r.PostFormValue("uid") uid := r.PostFormValue("uid")
sid := r.PostFormValue("server") sid := r.PostFormValue("server")
if !redis.IsValidServerId(util.StringToUint32(sid)) { if !redis.HExists("game_info", sid) {
log.Error("not Found server ", r.Form.Encode()) log.Error("not Found server ", r.Form.Encode())
return return
} }

View File

@ -48,7 +48,7 @@ func HuaweiPreOrder(w http.ResponseWriter, r *http.Request) {
sid := r.PostFormValue("server") sid := r.PostFormValue("server")
log.Debugf("HuaweiPreOrder Param %+v", r.Form) log.Debugf("HuaweiPreOrder Param %+v", r.Form)
if !redis.IsValidServerId(util.StringToUint32(sid)) { if !redis.HExists("game_info", sid) {
log.Error("not Found server ", r.Form.Encode()) log.Error("not Found server ", r.Form.Encode())
return return
} }

View File

@ -5,8 +5,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"game/base/log" "game/base/log"
//"game/base/redis" "game/base/redis"
"game/config"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/url" "net/url"
@ -14,7 +13,6 @@ import (
"os/signal" "os/signal"
"syscall" "syscall"
"time" "time"
"strconv"
) )
// Server 服务器 // Server 服务器
@ -31,7 +29,6 @@ func (srv *PayServer) Run() {
//开始access Token服务 //开始access Token服务
//platApi.StartAccessTokenMgr() //platApi.StartAccessTokenMgr()
/*
http.HandleFunc("/qqPreOrder", QQPreOrder) http.HandleFunc("/qqPreOrder", QQPreOrder)
http.HandleFunc("/qqCallback", srv.QQPayCallBack) http.HandleFunc("/qqCallback", srv.QQPayCallBack)
http.HandleFunc("/oppoPreOrder", OppoPreOrder) http.HandleFunc("/oppoPreOrder", OppoPreOrder)
@ -49,9 +46,7 @@ func (srv *PayServer) Run() {
http.HandleFunc("/huaweiPreOrder", HuaweiPreOrder) http.HandleFunc("/huaweiPreOrder", HuaweiPreOrder)
http.HandleFunc("/checkRegisterReward", srv.CheckRegisterReward) http.HandleFunc("/checkRegisterReward", srv.CheckRegisterReward)
http.HandleFunc("/RegisterReward", srv.RegisterReward) http.HandleFunc("/RegisterReward", srv.RegisterReward)
http.HandleFunc("/testGameProxy", srv.TestGameProxy)
http.HandleFunc("/selfChecking", srv.SelfChecking)
*/
server := http.Server{Addr: srv.addr, Handler: http.DefaultServeMux} server := http.Server{Addr: srv.addr, Handler: http.DefaultServeMux}
go func() { go func() {
err := server.ListenAndServe() err := server.ListenAndServe()
@ -124,73 +119,8 @@ type ServerInfo struct {
WorldName string `json:"worldName"` WorldName string `json:"worldName"`
} }
func (srv *PayServer) forwardKsGame(sid int, urlPath string, msg interface{}, name string) (respData []byte, e error) {
var data []byte
data, e = json.Marshal(msg)
if e != nil {
log.Debug("SendMsgToGameProxy e:", e)
return
}
var domain_name = "game1009proxy.kingsome.cn"
if config.CmConfig.IsProxyDebug {
domain_name = "game1009proxy-test.kingsome.cn"
}
sUrl := fmt.Sprintf("https://%s/webapp/index.php?c=GameProxy&a=forwardMsg&sid=%d&urlPath=%s&msg=%s&name=%s",
domain_name,
sid,
urlPath,
url.QueryEscape(string(data)),
url.QueryEscape(string(name)))
ss, _ := url.QueryUnescape(sUrl)
log.Info("SendMsgToGameProxy Url ", ss)
var resp *http.Response
resp, e = http.Get(sUrl)
if e != nil {
log.Error("SendMsgToGameProxy Get fail err:", e)
return
}
respData, e = ioutil.ReadAll(resp.Body)
if e != nil {
log.Error("SendMsgToGameProxy ReadAll fail err:", e)
return
}
resp.Body.Close()
log.Info("response", string(respData))
return respData, nil;
}
func (srv *PayServer) TestGameProxy(w http.ResponseWriter, r *http.Request) {
var msg = make(map[string]string)
var e error
if e = json.Unmarshal([]byte(r.FormValue("msg")), &msg); e != nil {
log.Error("SendMsgToGame Unmarshal fail err:", e)
return
}
var sid, _ = strconv.Atoi(r.FormValue("sid"));
var urlPath = "selfChecking"
if config.CmConfig.IsProxyDebug {
urlPath = r.FormValue("urlPath")
}
var name = r.FormValue("name")
var respData, _ = srv.forwardKsGame(
sid,
urlPath,
msg,
name)
log.Info("response", string(respData))
w.Write(respData)
}
func (srv *PayServer) SendMsgToGame(sid int, urlPath string, msg interface{}, name string) (respData []byte, e error) { func (srv *PayServer) SendMsgToGame(sid int, urlPath string, msg interface{}, name string) (respData []byte, e error) {
respData, e = srv.forwardKsGame(sid, urlPath, msg, name) info := redis.HGet("game_info", sid)
return respData, e
/*info := redis.HGet("game_info", sid)
if info == "" { if info == "" {
log.Debug("SendMsgToGame info=nil") log.Debug("SendMsgToGame info=nil")
return return
@ -234,10 +164,5 @@ func (srv *PayServer) SendMsgToGame(sid int, urlPath string, msg interface{}, na
return return
} }
log.Info("SendMail Fail msg:", msg, " sid:", sid, " name:", name, " rr:", rr) log.Info("SendMail Fail msg:", msg, " sid:", sid, " name:", name, " rr:", rr)
return*/ return
} }
func (srv *PayServer) SelfChecking(w http.ResponseWriter, r *http.Request) {
w.Write([] byte(`{"errcode":0,"errmsg":"","healthy":1,"max_rundelay":1}`))
}

View File

@ -6,10 +6,8 @@ import (
"game/base/platApi" "game/base/platApi"
"game/base/util" "game/base/util"
"game/config" "game/config"
"game/excel"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"strings"
) )
func QQPreOrder(w http.ResponseWriter, r *http.Request) { func QQPreOrder(w http.ResponseWriter, r *http.Request) {
@ -24,14 +22,11 @@ func QQPreOrder(w http.ResponseWriter, r *http.Request) {
r.ParseForm() r.ParseForm()
openid := r.Form.Get("openid") openid := r.Form.Get("openid")
//uid := r.Form.Get("uid") zone := r.Form.Get("zone")
zone := r.Form.Get("sid") item := r.Form.Get("item")
item := r.Form.Get("produce") amt := r.Form.Get("amt")
sessionKey := r.Form.Get("session") sessionKey := r.Form.Get("sessionKey")
//amt := r.Form.Get("amt") amount := util.StringToUint32(r.Form.Get("amount"))
//amount := util.StringToUint32(r.Form.Get("amount"))
amt := "1"
amount := uint32(1)
token := platApi.GetAppAccessToken(config.QQAppID, config.QQAppSecret, platApi.Plat_QQ) token := platApi.GetAppAccessToken(config.QQAppID, config.QQAppSecret, platApi.Plat_QQ)
ret, err := platApi.QQPrePay(openid, config.QQAppID, zone, amt, item, amount, token, sessionKey) ret, err := platApi.QQPrePay(openid, config.QQAppID, zone, amt, item, amount, token, sessionKey)
@ -45,10 +40,8 @@ func QQPreOrder(w http.ResponseWriter, r *http.Request) {
} }
func (srv *PayServer) QQPayCallBack(w http.ResponseWriter, r *http.Request) { func (srv *PayServer) QQPayCallBack(w http.ResponseWriter, r *http.Request) {
ret := &platApi.QQPayCallBackRet{} var data []byte
defer func() { defer func() {
log.Info("QQPayCallBack ret:", ret)
data, _ := json.Marshal(ret)
w.Write(data) w.Write(data)
}() }()
@ -66,47 +59,22 @@ func (srv *PayServer) QQPayCallBack(w http.ResponseWriter, r *http.Request) {
if err != nil { if err != nil {
return return
} }
log.Info(" req:", req)
ok := platApi.QQCallBackVerify(req, r.URL.Path, config.QQAppSecret) ok := platApi.QQCallBackVerify(req, r.URL.Path, config.QQAppSecret)
if !ok { if !ok {
ret.Code = 1
ret.Msg = "签名检验失败"
return return
} }
extInfo := strings.Split(req.AppRemark, "-") ret := &platApi.QQPayCallBackRet{}
if len(extInfo) != 3 { //ret.Code=
ret.Code = 2 //ret.Msg =
ret.Msg = "app_remark参数格式错误"
log.Info("QQPayCallBack ret:", ret, " req:", req)
data, err = json.Marshal(ret)
if err != nil {
return return
} }
sid := util.StringToInt(extInfo[0])
produce := util.StringToUint32(extInfo[1])
uid := util.StringToUint64(extInfo[2])
info := excel.GetPlatformIdById(produce)
msg := &RechargeCommonC2SMsg{
RoleId: uid,
Rmb: float32(info.Money),
ChargeYb: info.Money * 10,
GiftYb: 0,
OrderId: r.FormValue("bill_no"),
POrderId: r.FormValue("bill_no"),
PlatformIp: r.Header.Get("X-Real_IP"),
AttType: info.Type,
AttValue: info.Index,
}
code, _ := srv.DeliverGood(sid, msg)
if code == 1 || code == 1002 {
ret.Code = 0
} else {
ret.Code = 3
}
log.Info("QQCallback DeliverRecv sid:", sid, " Role:", uid, " OrderId:", msg.OrderId, " POrderId:", msg.POrderId,
" Money:", info.Money, " produce:", produce, " Code:", ret.Code, " code:", code, " err:", err)
//TODO 发货 //TODO 发货
//var serverId uint64 //var serverId uint64
//var uid uint64 //var uid uint64

View File

@ -52,7 +52,7 @@ func XiaomiPreOrder(w http.ResponseWriter, r *http.Request) {
} }
return return
} }
if !redis.IsValidServerId(util.StringToUint32(sid)) { if !redis.HExists("game_info", sid) {
log.Error("not Found server ", r.Form.Encode()) log.Error("not Found server ", r.Form.Encode())
return return
} }

View File

@ -49,20 +49,6 @@ type QQPrePayRes struct {
PrepayId string `json:"prepayId"` PrepayId string `json:"prepayId"`
} }
type QQPrePayReq struct {
OpenId string `json:"openid"`
AppId string `json:"appid"`
Ts int `json:"ts"`
ZoneId string `json:"zone_id"`
Pf string `json:"pf"`
Amt int `json:"amt"`
GoodId string `json:"goodid"`
GoodNum int `json:"good_num"`
AppRemark string `json:"app_remark"`
BillNo string `json:"bill_no"`
Sig string `json:"sig"`
}
func QQPrePay(openid string, appid string, zone string, amt string, goodId string, goodNum uint32, token string, sessionKey string) (*QQPrePayRes, error) { func QQPrePay(openid string, appid string, zone string, amt string, goodId string, goodNum uint32, token string, sessionKey string) (*QQPrePayRes, error) {
u := "https://api.q.qq.com/api/json/openApiPay/GamePrePay?access_token=" + token u := "https://api.q.qq.com/api/json/openApiPay/GamePrePay?access_token=" + token
value := url.Values{} value := url.Values{}
@ -72,10 +58,9 @@ func QQPrePay(openid string, appid string, zone string, amt string, goodId strin
value.Add("zone_id", zone) value.Add("zone_id", zone)
value.Add("pf", "qq_m_qq-2001-android-2011") value.Add("pf", "qq_m_qq-2001-android-2011")
value.Add("amt", amt) value.Add("amt", amt)
value.Add("goodid", "31b654ce0caeda34ad583d069551481c") value.Add("goodid", goodId)
//value.Add("goodid", goodId) value.Add("good_nun", util.Uint32ToString(goodNum))
value.Add("good_num", util.Uint32ToString(goodNum)) value.Add("app_remark", appid)
value.Add("app_remark", zone + "-" + goodId + "-" + openid)
billNo, _ := util.NextId() billNo, _ := util.NextId()
value.Add("bill_no", util.Int64ToString(billNo)) value.Add("bill_no", util.Int64ToString(billNo))
@ -84,14 +69,7 @@ func QQPrePay(openid string, appid string, zone string, amt string, goodId strin
h.Write([]byte(param)) h.Write([]byte(param))
sign := hex.EncodeToString(h.Sum(nil)) sign := hex.EncodeToString(h.Sum(nil))
value.Set("sig", sign) value.Set("sig", sign)
req := &QQPrePayReq{}; data, _ := json.Marshal(value)
raw_data, _ := json.Marshal(util.UrlValuesToMap(value))
err := json.Unmarshal(raw_data, &req)
req.ZoneId = "1"
req.Amt = 1
req.Ts = int(time.Now().Unix())
req.GoodNum = 1
data, _ := json.Marshal(req)
resp, err := http.Post(u, "application/json;charset=UTF-8", bytes.NewReader(data)) resp, err := http.Post(u, "application/json;charset=UTF-8", bytes.NewReader(data))
if err != nil { if err != nil {
log.Error("Post error ", err) log.Error("Post error ", err)

View File

@ -69,7 +69,3 @@ func initPool() {
} }
} }
} }
func IsValidServerId(sid uint32) (bool) {
return sid > 0 && sid < 200000000;
}

View File

@ -4,7 +4,6 @@ import (
"encoding/binary" "encoding/binary"
"math" "math"
"math/rand" "math/rand"
"net/url"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -402,15 +401,3 @@ func CombineMapU64U32(m1, m2 map[uint64]uint32) map[uint64]uint32 {
return m1 return m1
} }
func UrlValuesToMap(v url.Values) map[string]string {
ret := make(map[string]string)
for k := range v {
if len(v[k]) > 0 {
ret[k] = v[k][0]
} else {
ret[k] = ""
}
}
return ret
}

View File

@ -66,8 +66,7 @@ func (id *idWorker) nextid() (int64, error) {
} else { } else {
id.sequence = 0 id.sequence = 0
} }
var sarly int64 = 1 sarly := time.Now().Unix() % nodeMask
//sarly := time.Now().Unix() % nodeMask
id.lastTimestamp = timestamp id.lastTimestamp = timestamp
return ((timestamp - id.twepoch) << timestampLeftShift) | (sarly << nodeIdShift) | id.sequence, nil return ((timestamp - id.twepoch) << timestampLeftShift) | (sarly << nodeIdShift) | id.sequence, nil
} }

View File

@ -12,7 +12,6 @@ type CommonConfig struct {
Debug bool `yaml:"debug"` // 是否测试环境 Debug bool `yaml:"debug"` // 是否测试环境
IsHGameDebug bool `yaml:"isHGameDebug"` // 测试的充值渠道 IsHGameDebug bool `yaml:"isHGameDebug"` // 测试的充值渠道
IsHuaweiPayDebug bool `yaml:"isHuaweiPayDebug"` // 测试华为的充值渠道 IsHuaweiPayDebug bool `yaml:"isHuaweiPayDebug"` // 测试华为的充值渠道
IsProxyDebug bool `yaml:"isProxyDebug"` // 测试代理服务器
} }
type RedisConfig struct { type RedisConfig struct {

View File

@ -3,8 +3,8 @@ package config
const ( const (
WXAppID = "" WXAppID = ""
WXAppSecret = "" WXAppSecret = ""
QQAppID = "1109788480" QQAppID = ""
QQAppSecret = "a6xKTrhGM2IvGEaU" QQAppSecret = ""
// oppo的APPid // oppo的APPid
OppoAppID = "30203124" OppoAppID = "30203124"
// OPPO的支付秘钥 // OPPO的支付秘钥
@ -49,34 +49,34 @@ NF3guaUf9bEOBc8WVQIDAQAB`
// 华为 // 华为
const ( const (
HuaweiAppId = "101381633" HuaweiAppId = "101381633"
HuaweiPayId = "890086000300096364" HuaweiPayId = "890086000300110644"
HuaweiAppSecret = "a78915d8df88e59d0a2b552d2abe147d3f8c62cfc345176a198bbea3f905b076" HuaweiAppSecret = "a78915d8df88e59d0a2b552d2abe147d3f8c62cfc345176a198bbea3f905b076"
HuaweiPublicKey = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsO0P48iyB/lJpyooyUd+ HuaweiPublicKey = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqpRCMMJqNgP2oj40Isnh
n+XCc2T3SQjDkb9Ci4AuiW61z3oRv6JBtLyhT3z55HdJL87W3IgJdERDHiPt7XMmMs806w6K15Q diRh9eRqWHg9NFOaDTB7zL/TRSJ++SUlB2WoLHoZzM2aw/L+grWFRO4XvTI4hT9sivWNa37pmTu
Xp9xi17x/aDA956oHT54qbK6akZuHb35Yf9ptFK5tjd1eJjHJywg2tUzLEl032QKTYZd9NkPWMv b+Q1+r7Iszwwq1NuOaW+9tpvDespq3H+YMOqCGhZCBNZrtHIw86kIDfjjG26UI0TgW/LGo8Jv0k
q6+E4UbXWSGZpEEwG6UxYfqKh9uFoF9AD8cIwKIrZeJLalQj4GODxyPYvjPy2Ce57oFCl4HJsbH q4RiI7Ok2hzM26+Rcf7L42EQuEcVfixQnHNQTUSwrGZX6M2LBT6YjBceqzYRhZsRHe5V2y8Uo80
Oxzh0So7PP5kg2G4OhXrEHrQkekF88nSLXRWeby2aQqX/Jye+0WDkuANkB2j8ycoEToOvOdvAMK zUe0+cyi/faPjCZy2fdkMJ5OQixpAmSndh4PyIrxLSufgfm153dceRPb/okPcXsA/kbJ03lA6Yp
gBRHcTjQGuLjHnbNqFgjWwIDAQAB` u4WRNs02gjH3nagKLOEcOwIDAQAB`
HuaweiPrivateKey = `MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCw7Q/jyLIH+Umn HuaweiPrivateKey = `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` ssQoYIQzDNNyRZd23XhvOYLffVyuN3tNsOSQ/2GlAD45YWrcKhNNiQHz2wE=`
) )