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.

173 lignes
4.3KB

  1. package main
  2. import (
  3. "database/sql"
  4. "errors"
  5. "log"
  6. "net/http"
  7. "net/http/httputil"
  8. "strconv"
  9. "time"
  10. )
  11. type RpnIn struct {
  12. Id int64
  13. Leanwork int64
  14. Order_id string
  15. Order_time string
  16. Order_amount string
  17. Deal_id string
  18. Deal_time string
  19. Pay_amount string
  20. Pay_result string
  21. Signature string
  22. Ts time.Time
  23. Ip4 uint32
  24. }
  25. //get given RpnIn record based on ID
  26. func getRpnInById(id int64) (ret RpnIn, err error) {
  27. if err = db.conn(Config); err != nil {
  28. return
  29. }
  30. defer db.close()
  31. q := "SELECT * FROM rpnIn WHERE id = ? "
  32. err = db.h.QueryRow(q, id).Scan(
  33. &ret.Id, &ret.Leanwork, &ret.Order_id,
  34. &ret.Order_time, &ret.Order_amount, &ret.Deal_id,
  35. &ret.Deal_time, &ret.Pay_amount, &ret.Pay_result,
  36. &ret.Signature, &ret.Ts, &ret.Ip4)
  37. if err != nil {
  38. if err == sql.ErrNoRows {
  39. log.Println("trying to retrieve rpnIn(" + strconv.FormatInt(id, 10) + ") but not found")
  40. } else {
  41. log.Println("Error retrieving rpnIn(" + strconv.FormatInt(id, 10) + ") encountered : " + err.Error())
  42. }
  43. }
  44. return
  45. }
  46. //get given RpnIn record based on ID
  47. func getRpnInByLeanworkId(id int64) (ret RpnIn, err error) {
  48. if err = db.conn(Config); err != nil {
  49. return
  50. }
  51. defer db.close()
  52. q := "SELECT * FROM rpnIn WHERE leanwork = ? ORDER BY id DESC LIMIT 1"
  53. err = db.h.QueryRow(q, id).Scan(
  54. &ret.Id, &ret.Leanwork, &ret.Order_id,
  55. &ret.Order_time, &ret.Order_amount, &ret.Deal_id,
  56. &ret.Deal_time, &ret.Pay_amount, &ret.Pay_result,
  57. &ret.Signature, &ret.Ts, &ret.Ip4)
  58. if err != nil {
  59. if err == sql.ErrNoRows {
  60. log.Println("trying to retrieve rpnIn(" + strconv.FormatInt(id, 10) + ") but not found")
  61. } else {
  62. log.Println("Error retrieving rpnIn(" + strconv.FormatInt(id, 10) + ") encountered : " + err.Error())
  63. }
  64. }
  65. return
  66. }
  67. //add to database
  68. func (m *RpnIn) add2db() (ret RpnIn, err error) {
  69. if err = db.conn(Config); err != nil {
  70. return
  71. }
  72. defer db.close()
  73. q := `INSERT INTO rpnIn(
  74. leanwork, order_id, order_time, order_amount, deal_id,
  75. deal_time, pay_amount, pay_result, signature)
  76. VALUES(?,?,?,?,?,?,?,?,?)
  77. `
  78. insForm, err := db.h.Prepare(q)
  79. if err != nil {
  80. log.Printf("Failed to prepare SQL statment for insert " + err.Error())
  81. return
  82. }
  83. res, err := insForm.Exec(
  84. m.Leanwork, m.Order_id, m.Order_time, m.Order_amount, m.Deal_id,
  85. m.Deal_time, m.Pay_amount, m.Pay_result, m.Signature)
  86. if err != nil {
  87. log.Printf("Error inserting rpnIn with orderNo =%s, %s \n", m.Order_id, err.Error())
  88. return
  89. }
  90. id, err := res.LastInsertId()
  91. if err != nil {
  92. log.Printf("Cannot retrieve lastInsertId for orderID %s", m.Order_id)
  93. return
  94. }
  95. ret, err = getRpnInById(id)
  96. if err == nil {
  97. *m = ret
  98. }
  99. return
  100. }
  101. func (m *RpnIn) signature() (sig string) {
  102. s := "order_id=" + m.Order_id
  103. s += "|order_time=" + m.Order_time
  104. s += "|order_amount=" + m.Order_amount
  105. s += "|deal_id=" + m.Deal_id
  106. s += "|deal_time=" + m.Deal_time
  107. s += "|pay_amount=" + m.Pay_amount
  108. s += "|pay_result=" + m.Pay_result
  109. s += "|key=" + m.md5key()
  110. sig = md5str(s)
  111. //log.Println("signature of rpnIn = " + sig + " using key " + m.md5key())
  112. return
  113. }
  114. func (m *RpnIn) md5key() string {
  115. if m.Order_id == "" {
  116. log.Println("WARN: rpnIn:md5key() trying to get MD5Key with empty orderID")
  117. return ""
  118. }
  119. ro, err := getRpnOutByOrderId(m.Order_id)
  120. if err != nil {
  121. log.Println("Cannot get RpnOut by order_id=" + m.Order_id)
  122. return ""
  123. }
  124. return ro.getMD5Key()
  125. }
  126. func GetRpnInFromHTTPRequest(r *http.Request) (ret RpnIn, err error) {
  127. r.ParseForm()
  128. ret.Order_id = r.FormValue("order_id")
  129. ret.Order_time = r.FormValue("order_time")
  130. ret.Order_amount = r.FormValue("order_amount")
  131. ret.Deal_id = r.FormValue("deal_id")
  132. ret.Deal_time = r.FormValue("deal_time")
  133. ret.Pay_amount = r.FormValue("pay_amount")
  134. ret.Pay_result = r.FormValue("pay_result")
  135. ret.Signature = r.FormValue("signature")
  136. ret.Ip4 = getClientIPLong(r)
  137. ret.Ts = time.Now()
  138. if ret.Order_id == "" {
  139. err = errors.New("Invalid OrderId for RpnIn")
  140. return
  141. }
  142. ro, err := getRpnOutByOrderId(ret.Order_id)
  143. if err != nil || ro.Order_id != ret.Order_id {
  144. log.Println("Cannot get RpnOut by order_id=" + ret.Order_id)
  145. logRequestDebug(httputil.DumpRequest(r, true))
  146. return
  147. }
  148. if ret.Signature != ret.signature() {
  149. log.Println("Invalid RpnIn Signature")
  150. err = errors.New("Invalid signauture for RpnIn")
  151. logRequestDebug(httputil.DumpRequest(r, true))
  152. return
  153. }
  154. return
  155. }