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

146 lines
3.4KB

  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. //add to database
  46. func (m *RpnIn) add2db() (ret RpnIn, err error) {
  47. if err = db.conn(Config); err != nil {
  48. return
  49. }
  50. defer db.close()
  51. q := `INSERT INTO rpnIn(
  52. leanwork, order_id, order_time, order_amount, deal_id,
  53. deal_time, pay_amount, pay_result, signature)
  54. VALUES(?,?,?,?,?,?,?,?,?)
  55. `
  56. insForm, err := db.h.Prepare(q)
  57. if err != nil {
  58. log.Printf("Failed to prepare SQL statment for insert " + err.Error())
  59. return
  60. }
  61. res, err := insForm.Exec(
  62. m.Leanwork, m.Order_id, m.Order_time, m.Order_amount, m.Deal_id,
  63. m.Deal_time, m.Pay_amount, m.Pay_result, m.Signature)
  64. if err != nil {
  65. log.Printf("Error inserting rpnIn with orderNo =%s, %s \n", m.Order_id, err.Error())
  66. return
  67. }
  68. id, err := res.LastInsertId()
  69. if err != nil {
  70. log.Printf("Cannot retrieve lastInsertId for orderID %s", m.Order_id)
  71. return
  72. }
  73. ret, err = getRpnInById(id)
  74. if err == nil {
  75. *m = ret
  76. }
  77. return
  78. }
  79. func (m *RpnIn) signature() (sig string) {
  80. s := "order_id=" + m.Order_id
  81. s += "|order_time=" + m.Order_time
  82. s += "|order_amount=" + m.Order_amount
  83. s += "|deal_id=" + m.Deal_id
  84. s += "|deal_time=" + m.Deal_time
  85. s += "|pay_amount=" + m.Pay_amount
  86. s += "|pay_result=" + m.Pay_result
  87. s += "|key=" + m.md5key()
  88. sig = md5str(s)
  89. //log.Println("signature of rpnIn = " + sig + " using key " + m.md5key())
  90. return
  91. }
  92. func (m *RpnIn) md5key() string {
  93. if m.Order_id == "" {
  94. return ""
  95. }
  96. ro, err := getRpnOutByOrderId(m.Order_id)
  97. if err != nil {
  98. log.Println("Cannot get RpnOut by order_id=" + m.Order_id)
  99. return ""
  100. }
  101. return ro.getMD5Key()
  102. }
  103. func GetRpnInFromHTTPRequest(r *http.Request) (ret RpnIn, err error) {
  104. r.ParseForm()
  105. ret.Order_id = r.FormValue("order_id")
  106. ret.Order_time = r.FormValue("order_time")
  107. ret.Order_amount = r.FormValue("order_amount")
  108. ret.Deal_id = r.FormValue("deal_id")
  109. ret.Deal_time = r.FormValue("deal_time")
  110. ret.Pay_amount = r.FormValue("pay_amount")
  111. ret.Pay_result = r.FormValue("pay_result")
  112. ret.Signature = r.FormValue("signature")
  113. ret.Ip4 = getClientIPLong(r)
  114. ret.Ts = time.Now()
  115. if ret.Order_id == "" {
  116. err = errors.New("Invalid OrderId for RpnIn")
  117. return
  118. }
  119. ro, err := getRpnOutByOrderId(ret.Order_id)
  120. if err != nil || ro.Order_id != ret.Order_id {
  121. log.Println("Cannot get RpnOut by order_id=" + ret.Order_id)
  122. return
  123. }
  124. if ret.Signature != ret.signature() {
  125. log.Println("Invalid RpnIn Signature")
  126. err = errors.New("Invalid signauture for RpnIn")
  127. return
  128. }
  129. return
  130. }