From 4cecb466c20bdebdeec33314f7464a21a0863386 Mon Sep 17 00:00:00 2001 From: patrick Date: Tue, 10 Mar 2020 22:58:39 +1100 Subject: [PATCH] get rpnOUt works --- rpn.go | 30 +++++++++++++++-- rpnIn.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ rpnOut_test.go | 13 ++++++++ 3 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 rpnIn.go create mode 100644 rpnOut_test.go diff --git a/rpn.go b/rpn.go index 92fde76..5c05ce0 100644 --- a/rpn.go +++ b/rpn.go @@ -1,8 +1,10 @@ package main import ( + "database/sql" "errors" "fmt" + "log" "math" "net/http" "net/url" @@ -13,13 +15,13 @@ import ( ) type RpnReq struct { - Order_id string Version string Sign_type string Mid string Notify_url string Order_amount string Order_time string //YYYYMMDDHHMMSS + Order_id string User_id string User_name string User_cardno string @@ -29,9 +31,8 @@ type RpnReq struct { //database specific Id int64 Leanwork int64 - Callback int64 Ip4 uint32 - Ip4location string + Ip4location sql.NullString Ts mysql.NullTime } @@ -210,3 +211,26 @@ func (m *RpnReq) sendRedirect(w http.ResponseWriter, row LeanworkRequest) { m.Url = Config.Rpn.Url tmpl.ExecuteTemplate(w, "rpnCallOutRedirect", *m) } + +func getRpnOutByOrderId(order_id string) (ret RpnReq, err error) { + if err = db.conn(Config); err != nil { + return + } + defer db.close() + + q := "SELECT * FROM rpnOut WHERE order_id = ? ORDER BY id DESC LIMIT 1" + err = db.h.QueryRow(q, order_id).Scan( + &ret.Id, &ret.Leanwork, &ret.Version, + &ret.Sign_type, &ret.Mid, &ret.Notify_url, + &ret.Order_amount, &ret.Order_time, &ret.Order_id, + &ret.User_id, &ret.User_name, &ret.User_cardno, &ret.Signature, + &ret.Ip4, &ret.Ip4location, &ret.Ts) + if err != nil { + if err == sql.ErrNoRows { + log.Println("trying to retrieve rpnOut(order_id=" + order_id + ") but not found") + } else { + log.Println("Error retrieving rpnOut(order_id=" + order_id + ") encountered : " + err.Error()) + } + } + return +} diff --git a/rpnIn.go b/rpnIn.go new file mode 100644 index 0000000..eb02e73 --- /dev/null +++ b/rpnIn.go @@ -0,0 +1,91 @@ +package main + +import ( + "database/sql" + "log" + "strconv" + + "github.com/go-sql-driver/mysql" +) + +type RpnIn struct { + Id int64 + Leanwork int64 + Order_id string + Order_time string + Order_amount string + Deal_id string + Deal_time string + Pay_amount string + Pay_result string + Signature string + Ts mysql.NullTime +} + +//get given RpnIn record based on ID +func getRpnInById(id int64) (ret RpnIn, err error) { + if err = db.conn(Config); err != nil { + return + } + defer db.close() + + q := "SELECT * FROM rpnIn WHERE id = ? " + err = db.h.QueryRow(q, id).Scan( + &ret.Id, &ret.Leanwork, &ret.Order_id, + &ret.Order_time, &ret.Order_amount, &ret.Deal_id, + &ret.Deal_time, &ret.Pay_amount, &ret.Pay_result, + &ret.Signature, &ret.Ts) + if err != nil { + if err == sql.ErrNoRows { + log.Println("trying to retrieve rpnIn(" + strconv.FormatInt(id, 10) + ") but not found") + } else { + log.Println("Error retrieving rpnIn(" + strconv.FormatInt(id, 10) + ") encountered : " + err.Error()) + } + } + return +} + +//add to database +func (m *RpnIn) add() (ret RpnIn, err error) { + if err = db.conn(Config); err != nil { + return + } + defer db.close() + + q := `"INSERT INTO rpnIn( + leanwork, order_id, order_time, order_amount, deal_id, + deal_time, pay_amount, pay_result, signature) + VALUES(?,?,?,?,?,?,?,?,?) + ` + insForm, err := db.h.Prepare(q) + if err != nil { + log.Printf("Failed to prepare SQL statment for insert") + return + } + res, err := insForm.Exec( + m.Leanwork, m.Order_id, m.Order_time, m.Order_amount, m.Deal_id, + m.Deal_time, m.Pay_amount, m.Pay_result, m.Signature) + if err != nil { + log.Printf("Error inserting rpnIn with orderNo =%s \n", m.Order_id) + return + } + id, err := res.LastInsertId() + if err != nil { + log.Printf("Cannot retrieve lastInsertId for orderID %s", m.Order_id) + return + } + + return getRpnInById(id) +} + +func (m *RpnIn) signature() string { + s := "order_id=" + m.Order_id + s += "|order_time=" + m.Order_time + s += "|order_amount=" + m.Order_amount + s += "|deal_id=" + m.Deal_id + s += "|deal_time=" + m.Deal_time + s += "|pay_amount=" + m.Pay_amount + s += "|pay_result=" + m.Pay_result + + return s +} diff --git a/rpnOut_test.go b/rpnOut_test.go new file mode 100644 index 0000000..0cc6e23 --- /dev/null +++ b/rpnOut_test.go @@ -0,0 +1,13 @@ +package main + +import ( + "testing" +) + +func TestGetRpnOutByOrderId(t *testing.T) { + order_id := "200310160057TW002184000000000001" + ret, _ := getRpnOutByOrderId(order_id) + if ret.Id != 3 { + t.Error("we expect id to be 3") + } +}