payment gateway for rpn cn
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

173 líneas
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. }