payment gateway for rpn cn
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

163 lignes
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. }