Skip to content

Instantly share code, notes, and snippets.

@npomocc
Last active December 1, 2015 06:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save npomocc/082611c6a9ddb1dee3b8 to your computer and use it in GitHub Desktop.
Save npomocc/082611c6a9ddb1dee3b8 to your computer and use it in GitHub Desktop.
Qiwi request handler
type fn func (r render.Render, db *mgo.Database, agent *partner.Partner, req *request.Request)
func check(r render.Render, db *mgo.Database, agent *partner.Partner, req *request.Request) {
res, _ := validator.Go(req)
r.XML(200, res)
}
func pay(r render.Render, db *mgo.Database, agent *partner.Partner, req *request.Request) {
r.XML(200, 301)
}
func unknown(r render.Render, db *mgo.Database, agent *partner.Partner, req *request.Request) {
rsp := &response.Response {
Result: "300",
Comment: "Другая ошибка провайдера",
}
r.XML(200, rsp)
}
func checkAgent(req *http.Request, db *mgo.Database) (*partner.Partner, error) {
ip := strings.TrimSpace(strings.Split(req.RemoteAddr,":")[0]);
if agent, err := partner.GetByIp(db, ip); err != nil {
glog.Error("Указанный адрес в базе не существует: ",ip)
return nil, err;
} else {
return agent, nil;
}
}
func Go(req *http.Request, r render.Render, db *mgo.Database, params martini.Params) {
if agent, err := checkAgent(req, db); err != nil {
r.XML(500, nil)
} else {
rs := req.URL.Query()
newRequest := &request.Request{
Command: rs.Get("command"),
TxnId: rs.Get("txn_id"),
TxnDate: rs.Get("txn_date"),
Account: rs.Get("account"),
Sum: rs.Get("sum"),
PayType: rs.Get("pay_type"),
TrnId: rs.Get("trn_id"),
}
m := map[string] fn {
"check" : check,
"pay" : pay,
"unknown": unknown,
}
switch(rs.Get("command")) {
case "check": m["check"](r, db, agent, newRequest)
case "pay": m["pay"](r, db, agent, newRequest)
default: m["unknown"](r, db, agent, newRequest)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment