| s += form["orderAmount"][0] | s += form["orderAmount"][0] | ||||
| s += form["orderCurrency"][0] | s += form["orderCurrency"][0] | ||||
| s += form["customerId"][0] | s += form["customerId"][0] | ||||
| s += md5key | |||||
| s += Config.LeanWork.MD5Key | |||||
| } | } | ||||
| return md5str(s) | return md5str(s) | ||||
| } | } | ||||
| return r == sign | return r == sign | ||||
| } | } | ||||
| func md5RpnForm(form url.Values) string { | |||||
| func md4RpnFormP2P(form url.Values) string { | |||||
| return md5RpnForm(form, Config.Rpn.MD5P2P) | |||||
| } | |||||
| func md5RpnFormFAT(form url.Values) string { | |||||
| return md5RpnForm(form, Config.Rpn.MD5FAT) | |||||
| } | |||||
| func md5RpnForm(form url.Values, md5key string) string { | |||||
| s := "" | s := "" | ||||
| if _, ok := form["version"]; ok { | if _, ok := form["version"]; ok { | ||||
| s += "sign_type=" + form["sign_type"][0] + "|" | s += "sign_type=" + form["sign_type"][0] + "|" |
| var s = "123" | var s = "123" | ||||
| var h = md5.New() | var h = md5.New() | ||||
| fmt.Printf("md5=%x\n", h.Sum([]byte(s))) | fmt.Printf("md5=%x\n", h.Sum([]byte(s))) | ||||
| t.Errorf("something is wrong %d ", 1) | |||||
| //t.Errorf("something is wrong %d ", 1) | |||||
| } | } | ||||
| func buildForm() url.Values { | func buildForm() url.Values { | ||||
| expected := "06bcbd40cf6b914ef8ea6596730571ba" | expected := "06bcbd40cf6b914ef8ea6596730571ba" | ||||
| expectedkey := "492815086935204" | expectedkey := "492815086935204" | ||||
| assert := assert.New(t) | assert := assert.New(t) | ||||
| assert.Equal(expectedkey, md5key, "md5key should be 492815086935204") | |||||
| assert.Equal(expectedkey, Config.LeanWork.MD5Key, "md5key should be 492815086935204") | |||||
| result := md5LeanworkForm(form) | result := md5LeanworkForm(form) | ||||
| assert.Equal(expected, result, "expected signature should be equal") | assert.Equal(expected, result, "expected signature should be equal") | ||||
| } | } |
| var Config AppConfig | var Config AppConfig | ||||
| func readConfig() error { | func readConfig() error { | ||||
| log.Println("Read configration for production ") | |||||
| return readConfigFile("config.json") | return readConfigFile("config.json") | ||||
| } | } | ||||
| func readConfigForTest() error { | |||||
| log.Println("Read configration for Test ") | |||||
| return readConfigFile("config.test.json") | |||||
| } | |||||
| func readConfigFile(file string) error { | func readConfigFile(file string) error { | ||||
| log.Printf("Read configration from %s", file) | log.Printf("Read configration from %s", file) | ||||
| fmt.Println(string(j)) | fmt.Println(string(j)) | ||||
| return err | return err | ||||
| } | } | ||||
| func readConfigForTest() error { | |||||
| return readConfigFile("config.test.json") | |||||
| } |
| package main | |||||
| import ( | |||||
| "database/sql" | |||||
| "log" | |||||
| "net/http" | |||||
| "text/template" | |||||
| ) | |||||
| type Employee struct { | |||||
| Id int | |||||
| Name string | |||||
| City string | |||||
| } | |||||
| func dbConn() (db *sql.DB) { | |||||
| dbDriver := "mysql" | |||||
| dbUser := "sp" | |||||
| dbPass := "sp" | |||||
| dbName := "goblog" | |||||
| db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| return db | |||||
| } | |||||
| var tmpl = template.Must(template.ParseGlob("form/*")) | |||||
| func Index(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| selDB, err := db.Query("SELECT * FROM Employee ORDER BY id DESC") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp := Employee{} | |||||
| res := []Employee{} | |||||
| for selDB.Next() { | |||||
| var id int | |||||
| var name, city string | |||||
| err = selDB.Scan(&id, &name, &city) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp.Id = id | |||||
| emp.Name = name | |||||
| emp.City = city | |||||
| res = append(res, emp) | |||||
| } | |||||
| tmpl.ExecuteTemplate(w, "Index", res) | |||||
| defer db.Close() | |||||
| } | |||||
| func Show(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| nId := r.URL.Query().Get("id") | |||||
| selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp := Employee{} | |||||
| for selDB.Next() { | |||||
| var id int | |||||
| var name, city string | |||||
| err = selDB.Scan(&id, &name, &city) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp.Id = id | |||||
| emp.Name = name | |||||
| emp.City = city | |||||
| } | |||||
| tmpl.ExecuteTemplate(w, "Show", emp) | |||||
| defer db.Close() | |||||
| } | |||||
| func New(w http.ResponseWriter, r *http.Request) { | |||||
| tmpl.ExecuteTemplate(w, "New", nil) | |||||
| } | |||||
| func Edit(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| nId := r.URL.Query().Get("id") | |||||
| selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp := Employee{} | |||||
| for selDB.Next() { | |||||
| var id int | |||||
| var name, city string | |||||
| err = selDB.Scan(&id, &name, &city) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp.Id = id | |||||
| emp.Name = name | |||||
| emp.City = city | |||||
| } | |||||
| tmpl.ExecuteTemplate(w, "Edit", emp) | |||||
| defer db.Close() | |||||
| } | |||||
| func Insert(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| if r.Method == "POST" { | |||||
| name := r.FormValue("name") | |||||
| city := r.FormValue("city") | |||||
| insForm, err := db.Prepare("INSERT INTO Employee(name, city) VALUES(?,?)") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| insForm.Exec(name, city) | |||||
| log.Println("INSERT: Name: " + name + " | City: " + city) | |||||
| } | |||||
| defer db.Close() | |||||
| http.Redirect(w, r, "/", 301) | |||||
| } | |||||
| func Update(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| if r.Method == "POST" { | |||||
| name := r.FormValue("name") | |||||
| city := r.FormValue("city") | |||||
| id := r.FormValue("uid") | |||||
| insForm, err := db.Prepare("UPDATE Employee SET name=?, city=? WHERE id=?") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| insForm.Exec(name, city, id) | |||||
| log.Println("UPDATE: Name: " + name + " | City: " + city) | |||||
| } | |||||
| defer db.Close() | |||||
| http.Redirect(w, r, "/", 301) | |||||
| } | |||||
| func Delete(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| emp := r.URL.Query().Get("id") | |||||
| delForm, err := db.Prepare("DELETE FROM Employee WHERE id=?") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| delForm.Exec(emp) | |||||
| log.Println("DELETE") | |||||
| defer db.Close() | |||||
| http.Redirect(w, r, "/", 301) | |||||
| } |
| package main | package main | ||||
| import ( | import ( | ||||
| "database/sql" | |||||
| "fmt" | |||||
| "html/template" | |||||
| "log" | "log" | ||||
| "net/http" | "net/http" | ||||
| _ "github.com/go-sql-driver/mysql" | _ "github.com/go-sql-driver/mysql" | ||||
| ) | ) | ||||
| type Employee struct { | |||||
| Id int | |||||
| Name string | |||||
| City string | |||||
| } | |||||
| var md5key = "492815086935204" //for test only | |||||
| func dbConn() (db *sql.DB) { | |||||
| dbDriver := "mysql" | |||||
| dbUser := "sp" | |||||
| dbPass := "sp" | |||||
| dbName := "goblog" | |||||
| db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| return db | |||||
| } | |||||
| var tmpl = template.Must(template.ParseGlob("form/*")) | |||||
| func Index(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| selDB, err := db.Query("SELECT * FROM Employee ORDER BY id DESC") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp := Employee{} | |||||
| res := []Employee{} | |||||
| for selDB.Next() { | |||||
| var id int | |||||
| var name, city string | |||||
| err = selDB.Scan(&id, &name, &city) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp.Id = id | |||||
| emp.Name = name | |||||
| emp.City = city | |||||
| res = append(res, emp) | |||||
| } | |||||
| tmpl.ExecuteTemplate(w, "Index", res) | |||||
| defer db.Close() | |||||
| } | |||||
| func Show(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| nId := r.URL.Query().Get("id") | |||||
| selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp := Employee{} | |||||
| for selDB.Next() { | |||||
| var id int | |||||
| var name, city string | |||||
| err = selDB.Scan(&id, &name, &city) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp.Id = id | |||||
| emp.Name = name | |||||
| emp.City = city | |||||
| } | |||||
| tmpl.ExecuteTemplate(w, "Show", emp) | |||||
| defer db.Close() | |||||
| } | |||||
| func New(w http.ResponseWriter, r *http.Request) { | |||||
| tmpl.ExecuteTemplate(w, "New", nil) | |||||
| } | |||||
| func Edit(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| nId := r.URL.Query().Get("id") | |||||
| selDB, err := db.Query("SELECT * FROM Employee WHERE id=?", nId) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp := Employee{} | |||||
| for selDB.Next() { | |||||
| var id int | |||||
| var name, city string | |||||
| err = selDB.Scan(&id, &name, &city) | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| emp.Id = id | |||||
| emp.Name = name | |||||
| emp.City = city | |||||
| } | |||||
| tmpl.ExecuteTemplate(w, "Edit", emp) | |||||
| defer db.Close() | |||||
| } | |||||
| func Insert(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| if r.Method == "POST" { | |||||
| name := r.FormValue("name") | |||||
| city := r.FormValue("city") | |||||
| insForm, err := db.Prepare("INSERT INTO Employee(name, city) VALUES(?,?)") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| insForm.Exec(name, city) | |||||
| log.Println("INSERT: Name: " + name + " | City: " + city) | |||||
| } | |||||
| defer db.Close() | |||||
| http.Redirect(w, r, "/", 301) | |||||
| } | |||||
| func Update(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| if r.Method == "POST" { | |||||
| name := r.FormValue("name") | |||||
| city := r.FormValue("city") | |||||
| id := r.FormValue("uid") | |||||
| insForm, err := db.Prepare("UPDATE Employee SET name=?, city=? WHERE id=?") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| insForm.Exec(name, city, id) | |||||
| log.Println("UPDATE: Name: " + name + " | City: " + city) | |||||
| } | |||||
| defer db.Close() | |||||
| http.Redirect(w, r, "/", 301) | |||||
| } | |||||
| func Delete(w http.ResponseWriter, r *http.Request) { | |||||
| db := dbConn() | |||||
| emp := r.URL.Query().Get("id") | |||||
| delForm, err := db.Prepare("DELETE FROM Employee WHERE id=?") | |||||
| if err != nil { | |||||
| panic(err.Error()) | |||||
| } | |||||
| delForm.Exec(emp) | |||||
| log.Println("DELETE") | |||||
| defer db.Close() | |||||
| http.Redirect(w, r, "/", 301) | |||||
| } | |||||
| func StartPay(w http.ResponseWriter, r *http.Request) { | |||||
| if r.Method != "POST" { | |||||
| fmt.Fprintf(w, "fuck") | |||||
| return | |||||
| } | |||||
| r.ParseForm() | |||||
| if !isLeanworkFormValid(r.Form) { | |||||
| fmt.Fprintf(w, "invalid request") | |||||
| return | |||||
| } | |||||
| for key, value := range r.Form { | |||||
| fmt.Printf("%s= %s\n", key, value) | |||||
| fmt.Fprintf(w, "%s= %s\n", key, value) | |||||
| } | |||||
| sign := md5LeanworkForm(r.Form) | |||||
| fmt.Printf("my md5=%s, valid = %t", sign, isLeanworkFormValid(r.Form)) | |||||
| fmt.Fprintf(w, "my md5=%s", sign) | |||||
| } | |||||
| func main() { | func main() { | ||||
| readConfig() | readConfig() | ||||
| return | |||||
| log.Println("Server started on: http://localhost:8080") | log.Println("Server started on: http://localhost:8080") | ||||
| http.HandleFunc("/", StartPay) | http.HandleFunc("/", StartPay) | ||||
| //http.HandleFunc("/", Index) | //http.HandleFunc("/", Index) | ||||
| http.HandleFunc("/show", Show) | |||||
| http.HandleFunc("/new", New) | |||||
| http.HandleFunc("/edit", Edit) | |||||
| http.HandleFunc("/insert", Insert) | |||||
| http.HandleFunc("/update", Update) | |||||
| http.HandleFunc("/delete", Delete) | |||||
| // http.HandleFunc("/show", Show) | |||||
| // http.HandleFunc("/new", New) | |||||
| // http.HandleFunc("/edit", Edit) | |||||
| // http.HandleFunc("/insert", Insert) | |||||
| // http.HandleFunc("/update", Update) | |||||
| // http.HandleFunc("/delete", Delete) | |||||
| http.ListenAndServe(":8080", nil) | http.ListenAndServe(":8080", nil) | ||||
| } | } |
| func TestMain(m *testing.M) { | func TestMain(m *testing.M) { | ||||
| // call flag.Parse() here if TestMain uses flags | // call flag.Parse() here if TestMain uses flags | ||||
| readConfigForTest() | |||||
| readConfigForTest() //setup config for test cases | |||||
| os.Exit(m.Run()) | os.Exit(m.Run()) | ||||
| } | } |
| package main | |||||
| import ( | |||||
| "fmt" | |||||
| "net/http" | |||||
| ) | |||||
| func StartPay(w http.ResponseWriter, r *http.Request) { | |||||
| if r.Method != "POST" { | |||||
| fmt.Fprintf(w, "fuck") | |||||
| return | |||||
| } | |||||
| r.ParseForm() | |||||
| if !isLeanworkFormValid(r.Form) { | |||||
| fmt.Fprintf(w, "invalid request") | |||||
| return | |||||
| } | |||||
| for key, value := range r.Form { | |||||
| fmt.Printf("%s= %s\n", key, value) | |||||
| fmt.Fprintf(w, "%s= %s\n", key, value) | |||||
| } | |||||
| sign := md5LeanworkForm(r.Form) | |||||
| fmt.Printf("my md5=%s, valid = %t", sign, isLeanworkFormValid(r.Form)) | |||||
| fmt.Fprintf(w, "my md5=%s", sign) | |||||
| } |