Переглянути джерело

proper log message for payment gateway

master
patrick 5 роки тому
джерело
коміт
0f17fc74ff
11 змінених файлів з 63 додано та 22 видалено
  1. +2
    -2
      checksum.go
  2. +9
    -3
      db.go
  3. +1
    -2
      debug.go
  4. +6
    -0
      leanworkIn.go
  5. +14
    -10
      leanworkOut.go
  6. +3
    -2
      main.go
  7. +11
    -0
      purchase.go
  8. +1
    -0
      purchase_debug.go
  9. +11
    -3
      rpn.go
  10. +4
    -0
      rpnIn.go
  11. +1
    -0
      rpnOut.go

+ 2
- 2
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)
}

+ 9
- 3
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

+ 1
- 2
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)
}

+ 6
- 0
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++
}


+ 14
- 10
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
}


+ 3
- 2
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.
}

+ 11
- 0
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
}


+ 1
- 0
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)


+ 11
- 3
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
}


+ 4
- 0
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

+ 1
- 0
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 ""
}
}

Завантаження…
Відмінити
Зберегти