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.

169 lignes
4.1KB

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