payment gateway for rpn cn
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 line
4.3KB

  1. package main
  2. import (
  3. "database/sql"
  4. "log"
  5. "net/http"
  6. "strconv"
  7. )
  8. type TransactionDB struct {
  9. h *sql.DB
  10. }
  11. var db TransactionDB
  12. func (m *TransactionDB) conn(c AppConfig) error {
  13. if m.h != nil {
  14. return nil //already connected, prevent multiple connection
  15. }
  16. dbDriver := c.DB.Driver
  17. dbUser := c.DB.User
  18. dbPass := c.DB.Pass
  19. dbName := c.DB.Schema
  20. dbURL := dbUser + ":" + dbPass + "@/" + dbName + "?parseTime=true"
  21. h, err := sql.Open(dbDriver, dbURL)
  22. if err != nil {
  23. m.h = nil
  24. log.Println("ERROR: open database " + dbDriver + " " + dbURL + " " + err.Error())
  25. panic(err.Error())
  26. }
  27. m.h = h
  28. return err
  29. }
  30. func (m *TransactionDB) close() {
  31. if m.h != nil {
  32. m.h.Close()
  33. }
  34. m.h = nil //clear it, very important to prevent multiple opening
  35. }
  36. func (m *TransactionDB) addRequest(r *http.Request, md5key string) (row LeanworkIn, err error) {
  37. if err = m.conn(Config); err != nil {
  38. return row, err
  39. }
  40. defer m.close()
  41. r.ParseForm()
  42. //assuming form has been parsed
  43. row = LeanworkIn{}
  44. pickupUrl := r.FormValue("pickupUrl")
  45. receiveUrl := r.FormValue("receiveUrl")
  46. signType := r.FormValue("signType")
  47. orderNo := r.FormValue("orderNo")
  48. orderAmount := r.FormValue("orderAmount")
  49. orderCurrency := r.FormValue("orderCurrency")
  50. customerId := r.FormValue("customerId")
  51. sign := r.FormValue("sign")
  52. valid := isLeanworkFormValid(r.Form, md5key)
  53. ip4 := getClientIPLong(r)
  54. insForm, err := m.h.Prepare("INSERT INTO leanworkIn (pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4, md5key) VALUES(?,?,?,?,?,?,?,?,?,?,?)")
  55. if err != nil {
  56. log.Printf("Failed to prepare SQL statment for insert LeanworkIn")
  57. return
  58. }
  59. res, err := insForm.Exec(pickupUrl, receiveUrl, signType, orderNo, orderAmount, orderCurrency, customerId, sign, valid, ip4, md5key)
  60. if err != nil {
  61. log.Printf("Error inserting leanworkIn with orderNo =%s \n%+v\n%s", orderNo, r.Form, err.Error())
  62. return
  63. }
  64. id, err := res.LastInsertId()
  65. if err != nil {
  66. log.Printf("Cannot Get lastinsert ID for %+v, error= %s\n", r.Form, err.Error())
  67. return
  68. }
  69. row.Id = id
  70. row.PickupUrl = pickupUrl
  71. row.ReceiveUrl = receiveUrl
  72. row.SignType = signType
  73. row.OrderNo = orderNo
  74. row.OrderAmount = orderAmount
  75. row.OrderCurrency = orderCurrency
  76. row.CustomerId = customerId
  77. row.Sign = sign
  78. row.Valid = valid
  79. row.Ip4 = ip4
  80. row.MD5Key = md5key
  81. m.logNewLeanworkIn(row)
  82. return row, err
  83. }
  84. func (m *TransactionDB) logNewLeanworkIn(row LeanworkIn) {
  85. var insert_type string
  86. if row.MD5Key == Config.LeanWork.MD5P2P {
  87. insert_type = "P2P"
  88. } else {
  89. insert_type = "FAT"
  90. }
  91. log.Println(insert_type + " INSERT[" + strconv.FormatInt(row.Id, 10) + "]: customerId: " + row.CustomerId + " | orderAmount: " + row.OrderCurrency + " " + row.OrderAmount)
  92. }
  93. func (m *TransactionDB) addRpnOut(r RpnOut) (row RpnOut, err error) {
  94. if err = m.conn(Config); err != nil {
  95. log.Printf("ERROR adding RpnOut Failed, DB error, RPNOut %+v, Error: %s\n", r, err.Error())
  96. return row, err
  97. }
  98. defer m.close()
  99. sql := `INSERT INTO rpnOut
  100. (order_id, version, sign_type, mid, notify_url, order_amount, order_time,
  101. user_id, user_name, user_cardno, signature, leanwork, ip4 )
  102. VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)`
  103. insForm, err := m.h.Prepare(sql)
  104. if err != nil {
  105. log.Println("cannot insert RpnOut record, sql prepare failed " + err.Error())
  106. return
  107. }
  108. order_id := r.Order_id
  109. version := r.Version
  110. sign_type := r.Sign_type
  111. mid := r.Mid
  112. notify_url := r.Notify_url
  113. order_amount := r.Order_amount
  114. order_time := r.Order_time
  115. user_id := r.User_id
  116. user_name := r.User_name
  117. user_cardno := r.User_cardno
  118. signature := r.Signature
  119. leanwork := r.Leanwork
  120. ip4 := r.Ip4
  121. res, err := insForm.Exec(order_id, version, sign_type, mid, notify_url, order_amount, order_time,
  122. user_id, user_name, user_cardno, signature, leanwork, ip4)
  123. if err != nil {
  124. log.Println("Failed to execute sql statment for insert RpnOut order_id=" + r.Order_id + " " + err.Error())
  125. log.Printf("%+v", r)
  126. return
  127. }
  128. id, err := res.LastInsertId()
  129. if err != nil {
  130. log.Println("Cannot get last insert ID with new RpnOut record")
  131. log.Printf("%+v\n", r)
  132. return
  133. }
  134. row = r
  135. row.Id = id
  136. return row, err
  137. }
  138. func (m *TransactionDB) updateRpnOutNameAndCard(orderid string, signature string, name string, card string) (row RpnOut, err error) {
  139. err = nil
  140. row = RpnOut{}
  141. return
  142. }