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.

144 lignes
3.3KB

  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() 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. return md5str(s)
  89. }
  90. func (m *RpnIn) md5key() string {
  91. if m.Order_id == "" {
  92. return ""
  93. }
  94. ro, err := getRpnOutByOrderId(m.Order_id)
  95. if err != nil {
  96. log.Println("Cannot get RpnOut by order_id=" + m.Order_id)
  97. return ""
  98. }
  99. return ro.getMD5Key()
  100. }
  101. func GetRpnInFromHTTPRequest(r *http.Request) (ret RpnIn, err error) {
  102. r.ParseForm()
  103. ret.Order_id = r.FormValue("order_id")
  104. ret.Order_time = r.FormValue("order_time")
  105. ret.Order_amount = r.FormValue("order_amount")
  106. ret.Deal_id = r.FormValue("deal_id")
  107. ret.Deal_time = r.FormValue("deal_time")
  108. ret.Pay_amount = r.FormValue("pay_amount")
  109. ret.Pay_result = r.FormValue("pay_result")
  110. ret.Signature = r.FormValue("signature")
  111. ret.Ip4 = getClientIPLong(r)
  112. ret.Ts = time.Now()
  113. if ret.Order_id == "" {
  114. err = errors.New("Invalid OrderId for RpnIn")
  115. return
  116. }
  117. ro, err := getRpnOutByOrderId(ret.Order_id)
  118. if err != nil || ro.Order_id != ret.Order_id {
  119. log.Println("Cannot get RpnOut by order_id=" + ret.Order_id)
  120. return
  121. }
  122. if ret.Signature != ret.signature() {
  123. log.Println("Invalid RpnIn Signature")
  124. err = errors.New("Invalid signauture for RpnIn")
  125. return
  126. }
  127. return
  128. }