| "crypto/md5" | "crypto/md5" | ||||
| "fmt" | "fmt" | ||||
| "io" | "io" | ||||
| "net/url" | |||||
| ) | ) | ||||
| func md5str(s string) string { | func md5str(s string) string { | ||||
| io.WriteString(h, s) | io.WriteString(h, s) | ||||
| return fmt.Sprintf("%x", h.Sum(nil)) | return fmt.Sprintf("%x", h.Sum(nil)) | ||||
| } | } | ||||
| func md5LeanworkForm(form url.Values) string { | |||||
| s := "" | |||||
| if _, ok := form["pickupUrl"]; ok { | |||||
| s += form["pickupUrl"][0] | |||||
| s += form["receiveUrl"][0] | |||||
| s += form["signType"][0] | |||||
| s += form["orderNo"][0] | |||||
| s += form["orderAmount"][0] | |||||
| s += form["orderCurrency"][0] | |||||
| s += form["customerId"][0] | |||||
| s += md5key | |||||
| } | |||||
| return md5str(s) | |||||
| } | |||||
| func isLeanworkFormValid(form url.Values) bool { | |||||
| r := md5LeanworkForm(form) | |||||
| sign := form["sign"][0] | |||||
| return r == sign | |||||
| } | |||||
| func md5RpnForm(form url.Values) string { | |||||
| s := "" | |||||
| if _, ok := form["version"]; ok { | |||||
| s += "sign_type=" + form["sign_type"][0] + "|" | |||||
| s += "mid=" + form["mid"][0] + "|" | |||||
| s += "notify_url=" + form["notify_url"][0] + "|" | |||||
| s += "order_id=" + form["order_id"][0] + "|" | |||||
| s += "order_amount=" + form["order_amount"][0] + "|" | |||||
| s += "order_time=" + form["order_time"][0] + "|" | |||||
| s += "user_id=" + form["user_id"][0] + "|" | |||||
| s += "user_name=" + form["user_name"][0] + "|" | |||||
| s += "user_cardno=" + form["user_cardno"][0] + "|" | |||||
| s += "key=" + md5key | |||||
| } | |||||
| return md5str(s) | |||||
| } |
| t.Errorf("something is wrong %d ", 1) | t.Errorf("something is wrong %d ", 1) | ||||
| } | } | ||||
| func TestRequestForm(t *testing.T) { | |||||
| func buildForm() url.Values { | |||||
| // receiveUrl= [http://publicapi.lwork.com:8080/notify/default_notify] | // receiveUrl= [http://publicapi.lwork.com:8080/notify/default_notify] | ||||
| // orderAmount= [1200] | // orderAmount= [1200] | ||||
| // customerId= [123] | // customerId= [123] | ||||
| form.Add("orderCurrency", "CNY") | form.Add("orderCurrency", "CNY") | ||||
| form.Add("customerId", "123") | form.Add("customerId", "123") | ||||
| form.Add("sign", "06bcbd40cf6b914ef8ea6596730571ba") | form.Add("sign", "06bcbd40cf6b914ef8ea6596730571ba") | ||||
| return form | |||||
| } | |||||
| func TestRequestForm(t *testing.T) { | |||||
| form := buildForm() | |||||
| md5key := "492815086935204" | md5key := "492815086935204" | ||||
| expected := "06bcbd40cf6b914ef8ea6596730571ba" | expected := "06bcbd40cf6b914ef8ea6596730571ba" | ||||
| assert := assert.New(t) | assert := assert.New(t) | ||||
| assert.Equal(expected, md5str(s), "the md5 result should be equal") | assert.Equal(expected, md5str(s), "the md5 result should be equal") | ||||
| } | } | ||||
| func TestMd5Form(t *testing.T) { | |||||
| form := buildForm() | |||||
| expected := "06bcbd40cf6b914ef8ea6596730571ba" | |||||
| expectedkey := "492815086935204" | |||||
| assert := assert.New(t) | |||||
| assert.Equal(expectedkey, md5key, "md5key should be 492815086935204") | |||||
| result := md5LeanworkForm(form) | |||||
| assert.Equal(expected, result, "expected signature should be equal") | |||||
| } |
| package main | |||||
| import ( | |||||
| "encoding/json" | |||||
| "fmt" | |||||
| "io/ioutil" | |||||
| "log" | |||||
| ) | |||||
| type AppConfig struct { | |||||
| Rpn struct { | |||||
| Url string `json:Url` | |||||
| UrlTest string `json:UrlTest` | |||||
| MD5P2P string `json:MD5P2P` | |||||
| MD5FAT string `json:MD5FAT` | |||||
| } `json:Rpn` | |||||
| LeanWork struct { | |||||
| MD5Key string `json:MD5Key` | |||||
| } `json:LeanWork` | |||||
| } | |||||
| var Config AppConfig | |||||
| func readConfig() error { | |||||
| log.Printf("Read configration from config.json") | |||||
| body, err := ioutil.ReadFile("config.json") | |||||
| if err != nil { | |||||
| log.Fatal("Fatal error Cannot read config ..") | |||||
| return err | |||||
| } | |||||
| err = json.Unmarshal(body, &Config) | |||||
| if err != nil { | |||||
| log.Fatal("cannot read config into json") | |||||
| return err | |||||
| } | |||||
| j, err := json.MarshalIndent(Config, "", "\t") | |||||
| if err != nil { | |||||
| log.Fatal("cannot print back to json") | |||||
| return err | |||||
| } | |||||
| fmt.Println(string(j)) | |||||
| return err | |||||
| } |
| { | |||||
| "Rpn": { | |||||
| "Url" : "https://deposit.paylomo.net/pay.php?r=payEasy", | |||||
| "UrlTest" : "https://deposit-mac.chinapaytech.com/pay.php?r=payEasy", | |||||
| "MD5P2P" : "370296119874502", | |||||
| "MD5FAT" : "207841502473198" | |||||
| }, | |||||
| "LeanWork" :{ | |||||
| "MD5Key" : "492815086935204" | |||||
| } | |||||
| } |
| package main | package main | ||||
| import ( | import ( | ||||
| "crypto/md5" | |||||
| "database/sql" | "database/sql" | ||||
| "fmt" | "fmt" | ||||
| "html/template" | "html/template" | ||||
| fmt.Fprintf(w, "fuck") | fmt.Fprintf(w, "fuck") | ||||
| return | return | ||||
| } | } | ||||
| s := "" | |||||
| r.ParseForm() | r.ParseForm() | ||||
| if !isLeanworkFormValid(r.Form) { | |||||
| fmt.Fprintf(w, "invalid request") | |||||
| return | |||||
| } | |||||
| for key, value := range r.Form { | for key, value := range r.Form { | ||||
| fmt.Printf("%s= %s\n", key, value) | fmt.Printf("%s= %s\n", key, value) | ||||
| fmt.Fprintf(w, "%s= %s\n", key, value) | fmt.Fprintf(w, "%s= %s\n", key, value) | ||||
| } | } | ||||
| if _, ok := r.Form["pickupUrl"]; ok { | |||||
| s += r.Form["pickupUrl"][0] | |||||
| s += r.Form["receiveUrl"][0] | |||||
| s += r.Form["signType"][0] | |||||
| s += r.Form["orderNo"][0] | |||||
| s += r.Form["orderAmount"][0] | |||||
| s += r.Form["orderCurrency"][0] | |||||
| s += r.Form["customerId"][0] | |||||
| s += md5key | |||||
| } | |||||
| //var h = md5.New() | |||||
| data := []byte(s) | |||||
| fmt.Printf("my md5=%x", md5.Sum(data)) | |||||
| fmt.Fprintf(w, "my md5=%x", md5.Sum(data)) | |||||
| 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() | |||||
| 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) |
| package main | |||||
| import "net/url" | |||||
| // var url = "https://deposit.paylomo.net/pay.php?r=payEasy" //production | |||||
| // var url = "https://deposit-mac.chinapaytech.com/pay.php?r=payEasy" //test | |||||
| // var md5p2p = "370296119874502" | |||||
| // var md5fat = "207841502473198" | |||||
| //send request to RPN to initiate transaction | |||||
| func sendReq(form url.Values) { | |||||
| } |