diff --git a/checksum.go b/checksum.go index 6948c9c..3901dd1 100644 --- a/checksum.go +++ b/checksum.go @@ -64,7 +64,7 @@ func md5RpnForm(r RpnOut, md5key string) string { s += "user_name=" + r.User_name + "|" s += "user_cardno=" + r.User_cardno + "|" s += "key=" + md5key - fmt.Println(s) - fmt.Println(md5str(s)) + // fmt.Println(s) + // fmt.Println(md5str(s)) return md5str(s) } diff --git a/db.go b/db.go index 3e511bf..c6988a1 100644 --- a/db.go +++ b/db.go @@ -21,9 +21,11 @@ func (m *TransactionDB) conn(c AppConfig) error { dbUser := c.DB.User dbPass := c.DB.Pass dbName := c.DB.Schema - h, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName+"?parseTime=true") + dbURL := dbUser + ":" + dbPass + "@/" + dbName + "?parseTime=true" + h, err := sql.Open(dbDriver, dbURL) if err != nil { m.h = nil + log.Println("ERROR: open database " + dbDriver + " " + dbURL + " " + err.Error()) panic(err.Error()) } m.h = h @@ -59,18 +61,19 @@ func (m *TransactionDB) addRequest(r *http.Request, md5key string) (row Leanwork insForm, err := m.h.Prepare("INSERT INTO leanworkIn (pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4, md5key) VALUES(?,?,?,?,?,?,?,?,?,?,?)") if err != nil { - log.Printf("Failed to prepare SQL statment for insert") + log.Printf("Failed to prepare SQL statment for insert LeanworkIn") return } res, err := insForm.Exec(pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4, md5key) if err != nil { - log.Printf("Error inserting leanworkIn with orderNo =%s \n", orderNo) + log.Printf("Error inserting leanworkIn with orderNo =%s \n%+v\n%s", orderNo, r.Form, err.Error()) return } id, err := res.LastInsertId() if err != nil { + log.Printf("Cannot Get lastinsert ID for %+v, error= %s\n", r.Form, err.Error()) return } @@ -104,6 +107,7 @@ func (m *TransactionDB) logNewLeanworkIn(row LeanworkIn) { func (m *TransactionDB) addRpnOut(r RpnOut) (row RpnOut, err error) { if err = m.conn(Config); err != nil { + log.Printf("ERROR adding RpnOut Failed, DB error, RPNOut %+v, Error: %s\n", r, err.Error()) return row, err } defer m.close() @@ -137,11 +141,13 @@ func (m *TransactionDB) addRpnOut(r RpnOut) (row RpnOut, err error) { user_id, user_name, user_cardno, signature, leanwork, ip4) if err != nil { log.Println("Failed to execute sql statment for insert RpnOut order_id=" + r.Order_id + " " + err.Error()) + log.Printf("%+v", r) return } id, err := res.LastInsertId() if err != nil { log.Println("Cannot get last insert ID with new RpnOut record") + log.Printf("%+v\n", r) return } row = r diff --git a/debug.go b/debug.go index 9045401..fa07f45 100644 --- a/debug.go +++ b/debug.go @@ -1,13 +1,12 @@ package main import ( - "fmt" "log" ) func logRequestDebug(data []byte, err error) { if err == nil { - fmt.Printf("%s\n\n", string(data)) + log.Printf("%s\n\n", string(data)) } else { log.Fatalf("%s\n\n", err) } diff --git a/leanworkIn.go b/leanworkIn.go index c040095..e6832ed 100644 --- a/leanworkIn.go +++ b/leanworkIn.go @@ -2,6 +2,7 @@ package main import ( "errors" + "log" "time" ) @@ -43,6 +44,7 @@ func getRequestRowByIdAndSign(id string, sign string) (row LeanworkIn, err error defer db.close() selDB, err := db.h.Query("SELECT * FROM leanworkIn WHERE id=? and sign=?", id, sign) if err != nil { + log.Printf("Trying to get LeanworkIn id=%s, sign=%s, with Error:%s\n", id, sign, err.Error()) return } count := 0 @@ -51,8 +53,12 @@ func getRequestRowByIdAndSign(id string, sign string) (row LeanworkIn, err error &row.OrderNo, &row.OrderAmount, &row.OrderCurrency, &row.CustomerId, &row.Sign, &row.Valid, &row.Ts, &row.Ip4, &row.Ip4Location, &row.MD5Key) if err != nil { + log.Printf("Cannot Retrieve LeanworkIn Record for id=%s, sign=%s, Error=%s", id, sign, err.Error()) return } + if count >= 1 { + log.Printf("WARNING: LeanworkIn has %d id=%s and sign=%s \n", count, id, sign) + } count++ } diff --git a/leanworkOut.go b/leanworkOut.go index 9373a2f..fcda9b3 100644 --- a/leanworkOut.go +++ b/leanworkOut.go @@ -54,14 +54,16 @@ func (m *LeanworkOut) DoHttp() (retry bool, err error) { bodyBytes, err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("Fatal: Cannot read leanwork Http Response " + err.Error()) - } - bodyString := string(bodyBytes) - m.LeanworkResp = bodyString - m.add2db() - if strings.Contains(strings.ToLower(bodyString), "success") { - retry = false } else { - log.Println("Leanwork response without success word : " + bodyString) + bodyString := string(bodyBytes) + m.LeanworkResp = bodyString + m.add2db() + if strings.Contains(strings.ToLower(bodyString), "success") { + log.Printf("Leanwork Out [%d]: orderNo=%s, %s %s success\n", m.Leanwork, m.OrderNo, m.OrderCurrency, m.OrderAmount) + retry = false + } else { + log.Println("Leanwork response without 'success' : " + bodyString) + } } retry = false } @@ -93,6 +95,7 @@ func startLeanworkCallBack(ri RpnIn) { func buildLeanworkOutByRpnIn(ri RpnIn) (ret LeanworkOut, err error) { li, err := getLeanworkInById(ri.Leanwork) if err != nil { + log.Println("cannot get LeanworkIn by ID %s, %s", ri.Leanwork, err.Error()) return } ret.Leanwork = ri.Leanwork @@ -118,7 +121,7 @@ func (m *LeanworkOut) UpdateSignature() { func (m *LeanworkOut) getLeanworkMD5Key() string { li, err := getLeanworkInById(m.Leanwork) if err != nil { - log.Printf("Error determin P2P or FAT, leanworkIn = %d", m.Leanwork) + log.Printf("ERROR unknown P2P or FAT, leanworkIn id= %d", m.Leanwork) return "" } return li.MD5Key @@ -126,6 +129,7 @@ func (m *LeanworkOut) getLeanworkMD5Key() string { func (m *LeanworkOut) add2db() (ret LeanworkOut, err error) { if err = db.conn(Config); err != nil { + log.Println("ERROR cannot addd LeanwokOut, db conn error " + err.Error()) return } defer db.close() @@ -145,12 +149,12 @@ func (m *LeanworkOut) add2db() (ret LeanworkOut, err error) { m.TransactionId, m.Status, m.Sign, m.LeanworkResp) if err != nil { - log.Printf("Error inserting leanworkOut with orderNo =%s, %s \n", m.OrderNo, err.Error()) + log.Printf("Error inserting leanworkOut with orderNo =%s, %s %s %s \n", m.OrderNo, m.OrderCurrency, m.OrderAmount, err.Error()) return } id, err := res.LastInsertId() if err != nil { - log.Printf("Cannot retrieve lastInsertId for orderID %s", m.OrderNo) + log.Printf("Cannot retrieve lastInsertId for orderID %s, %s %s", m.OrderNo, m.OrderCurrency, m.OrderAmount) return } diff --git a/main.go b/main.go index 23606f9..1cd0a47 100644 --- a/main.go +++ b/main.go @@ -32,8 +32,9 @@ func main() { http.HandleFunc("/", fs) //start listening - log.Println("Server started on: http://localhost:8080") - http.ListenAndServe(Config.Server.Host+":"+Config.Server.Port, nil) + svr := Config.Server.Host + ":" + Config.Server.Port + log.Println("Server started on: " + svr) + http.ListenAndServe(svr, nil) //program never reach here. } diff --git a/purchase.go b/purchase.go index 3e31551..71bdd13 100644 --- a/purchase.go +++ b/purchase.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "net/http" + "net/http/httputil" "text/template" ) @@ -52,6 +53,8 @@ func choosePayment(w http.ResponseWriter, r *http.Request) { //leanwork in for alipay func leanworkInFAT(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { + log.Println("Invalid Request expect POST for leanworkInFAT") + logRequestDebug(httputil.DumpRequest(r, true)) errPage(w, http.StatusMethodNotAllowed, "invalid method") return } @@ -59,6 +62,8 @@ func leanworkInFAT(w http.ResponseWriter, r *http.Request) { row, err := db.addRequest(r, Config.LeanWork.MD5FAT) if err != nil { + log.Printf("ERROR failed to add leanworkIn %+v \n", r.Form) + logRequestDebug(httputil.DumpRequest(r, true)) errPage(w, http.StatusInternalServerError, "Cannot initiate database transaction for incoming request") return } @@ -67,6 +72,8 @@ func leanworkInFAT(w http.ResponseWriter, r *http.Request) { // w.WriteHeader(http.StatusMethodNotAllowed) // fmt.Fprintf(w, "invalid request") errPage(w, http.StatusBadRequest, "validation of FAT input parameters failed") + log.Printf("Invalid Request received, Signature is not correct") + logRequestDebug(httputil.DumpRequest(r, true)) return } @@ -78,6 +85,8 @@ func leanworkInFAT(w http.ResponseWriter, r *http.Request) { func leanworkInP2P(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { + log.Println("Invalid P2P Request expect POST for leanworkInP2P") + logRequestDebug(httputil.DumpRequest(r, true)) errPage(w, http.StatusMethodNotAllowed, "invalid method") return } @@ -94,6 +103,8 @@ func leanworkInP2P(w http.ResponseWriter, r *http.Request) { // w.WriteHeader(http.StatusMethodNotAllowed) // fmt.Fprintf(w, "invalid request") errPage(w, http.StatusBadRequest, "validation of P2P input parameters failed") + log.Printf("Invalid Request received, Signature is not correct") + logRequestDebug(httputil.DumpRequest(r, true)) return } diff --git a/purchase_debug.go b/purchase_debug.go index 8a107d4..c050ddc 100644 --- a/purchase_debug.go +++ b/purchase_debug.go @@ -17,6 +17,7 @@ func buildLeanworkOutByIn(in LeanworkIn) (ret LeanworkOut) { return } +//directly send leanwork success without contacting RPN func debugStartLeanworkCallBack(li LeanworkIn) { lo := buildLeanworkOutByIn(li) diff --git a/rpn.go b/rpn.go index 8e3542f..f9a570c 100644 --- a/rpn.go +++ b/rpn.go @@ -7,16 +7,20 @@ import ( "net/http/httputil" ) +//RPN callback us about payment result func rpnNotify(w http.ResponseWriter, r *http.Request) { - logRequestDebug(httputil.DumpRequest(r, true)) if r.Method != "POST" { errPage(w, http.StatusMethodNotAllowed, "invalid request") + log.Println("ERROR RPN request,not HTTP POST") + logRequestDebug(httputil.DumpRequest(r, true)) return } ri, err := GetRpnInFromHTTPRequest(r) //ParseForm called if err != nil { errPage(w, http.StatusBadRequest, "invalid parameters "+err.Error()) + log.Println("ERROR bad request, err=" + err.Error()) + logRequestDebug(httputil.DumpRequest(r, true)) return } @@ -25,6 +29,7 @@ func rpnNotify(w http.ResponseWriter, r *http.Request) { _, err = ri.add2db() //TODO:check error add if err != nil { log.Printf("failed to add rpnIn %+v , error is %s", ri, err.Error()) + logRequestDebug(httputil.DumpRequest(r, true)) } fmt.Fprintf(w, "[SUCCESS]") @@ -36,6 +41,8 @@ func rpnNotify(w http.ResponseWriter, r *http.Request) { //receive RPN user name and card number func rpnNameAndCard(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { + log.Println("ERROR collecting Name and Card Number,not HTTP POST") + logRequestDebug(httputil.DumpRequest(r, true)) errPage(w, http.StatusMethodNotAllowed, "invalid request") return } @@ -48,13 +55,14 @@ func rpnNameAndCard(w http.ResponseWriter, r *http.Request) { if !(id != "" && sign != "" && user_name != "" && user_card != "") { errPage(w, http.StatusBadRequest, "missing parameters") + log.Printf("WARNING collecting Name and Card Number, require non-empty value, id=%s, sign=%s, user_name=%s, user_card=%s\n", id, sign, user_name, user_card) return } row, err := getRequestRowByIdAndSign(id, sign) if err != nil { - w.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(w, "bad parameters") + errPage(w, http.StatusBadRequest, "bad parameters") + log.Printf("WARNING: collecting Name and Card Number, signature not correct %+f\n", r.Form) return } diff --git a/rpnIn.go b/rpnIn.go index 07e5286..97649a0 100644 --- a/rpnIn.go +++ b/rpnIn.go @@ -5,6 +5,7 @@ import ( "errors" "log" "net/http" + "net/http/httputil" "strconv" "time" ) @@ -124,6 +125,7 @@ func (m *RpnIn) signature() (sig string) { func (m *RpnIn) md5key() string { if m.Order_id == "" { + log.Println("WARN: rpnIn:md5key() trying to get MD5Key with empty orderID") return "" } @@ -156,12 +158,14 @@ func GetRpnInFromHTTPRequest(r *http.Request) (ret RpnIn, err error) { ro, err := getRpnOutByOrderId(ret.Order_id) if err != nil || ro.Order_id != ret.Order_id { log.Println("Cannot get RpnOut by order_id=" + ret.Order_id) + logRequestDebug(httputil.DumpRequest(r, true)) return } if ret.Signature != ret.signature() { log.Println("Invalid RpnIn Signature") err = errors.New("Invalid signauture for RpnIn") + logRequestDebug(httputil.DumpRequest(r, true)) return } return diff --git a/rpnOut.go b/rpnOut.go index 1335fb2..099a1c1 100644 --- a/rpnOut.go +++ b/rpnOut.go @@ -110,6 +110,7 @@ func (m *RpnOut) getMD5Key() string { } else if m.Mid == Config.Rpn.MIDFAT { return Config.Rpn.MD5FAT } else { + log.Println("WARNING: rpnOut::getMD5Key() has bad Mid = " + m.Mid + " cannot determin P2P or FAT, MID not match config") return "" } }