payment gateway for rpn cn
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

169 lines
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. }