pay.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package dingpei
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "net/url"
  8. "strconv"
  9. "strings"
  10. "bet24.com/servers/payment/shop"
  11. "bet24.com/log"
  12. "bet24.com/public"
  13. coreClient "bet24.com/servers/coreservice/client"
  14. "bet24.com/servers/payment/config"
  15. "bet24.com/servers/payment/db"
  16. "github.com/gin-gonic/gin"
  17. )
  18. // 下单
  19. func PayOrder(c *gin.Context) {
  20. obj := db.NewOrder(db.SP_Dingpei_ORDER)
  21. if err := c.ShouldBind(&obj.In); err != nil {
  22. log.Debug("%s query params err %v", "Dingpei.PayOrder", err)
  23. c.String(http.StatusOK, "")
  24. return
  25. }
  26. obj.In.IpAddress = strings.Split(c.Request.RemoteAddr, ":")[0]
  27. //// 币种为空,根据ip获取
  28. //if obj.In.Currency == "" {
  29. // currency := shop.GetCurrencyRateByIp(obj.In.UserID, obj.In.IpAddress)
  30. // obj.In.Currency = currency
  31. //}
  32. // 获取产品信息
  33. item := shop.GetProduct(obj.In.ProductID)
  34. if item == nil {
  35. log.Error("%s query GetProduct productId=%s currency=%s is nil", "dingpei.PayOrder", obj.In.ProductID, obj.In.Currency)
  36. c.String(http.StatusOK, "")
  37. return
  38. }
  39. //// 获取当前汇率信息
  40. //info := shop.GetExchangeRate(obj.In.Currency)
  41. //if info == nil {
  42. // log.Error("%s query GetExchangeRate obj.In.Currency=%s is nil", "dingpei.PayOrder", obj.In.Currency)
  43. // c.String(http.StatusOK, "")
  44. // return
  45. //}
  46. //
  47. //// 计算价格
  48. //calPrice := info.Rate * item.Price
  49. //
  50. //// 检查价格是否篡改
  51. //if calPrice != obj.In.Price {
  52. // log.Error("%s obj.In.Price=%v info.Rate=%v calPrice=%v is invalid", "dingpei.PayOrder", obj.In.Price, info.Rate, calPrice)
  53. // c.String(http.StatusOK, "")
  54. // return
  55. //}
  56. // 检查价格是否篡改
  57. if item.Price != obj.In.Price {
  58. log.Error("%s obj.In.Price=%v calPrice=%v is invalid", "dingpei.PayOrder", obj.In.Price, item.Price)
  59. c.String(http.StatusOK, "")
  60. return
  61. }
  62. obj.DoAction(nil)
  63. if obj.Out.OrderID == "" {
  64. log.Debug("%s GenOrder fail obj.In=%+v", "Dingpei.PayOrder", obj.In)
  65. c.String(http.StatusOK, "")
  66. return
  67. }
  68. // 请求payOrder的代码
  69. req := pay_req{
  70. MerchantNo: config.Server.DingpeiPay.MerchantNo,
  71. Type: config.Server.DingpeiPay.Type,
  72. Amount: fmt.Sprintf("%f.00", obj.In.Price),
  73. MerchantOrderNo: obj.Out.OrderID,
  74. ClientIp: obj.In.IpAddress,
  75. ReturnUrl: config.Server.DingpeiPay.Url_pay_page,
  76. NotifyUrl: config.Server.DingpeiPay.Url_pay_notify,
  77. PayUserName: "",
  78. Lang: "",
  79. Sign: "",
  80. }
  81. params := url.Values{}
  82. params.Set("merchantNo", req.MerchantNo)
  83. params.Set("type", req.Type)
  84. params.Set("amount", req.Amount)
  85. params.Set("merchantOrderNo", req.MerchantOrderNo)
  86. params.Set("clientIp", req.ClientIp)
  87. params.Set("returnUrl", req.ReturnUrl)
  88. params.Set("notifyUrl", req.NotifyUrl)
  89. // 生成签名
  90. checkContent := createEncryptStr(params) + "&key=" + config.Server.DingpeiPay.MD5Key
  91. // log.Debug("DingpeiPay.payOrder checkContent ==> %s", checkContent)
  92. signature := strings.ToUpper(public.GetMd5String(checkContent))
  93. req.Sign = signature
  94. params.Set("sign", req.Sign)
  95. // POST请求
  96. respBody := public.HttpPostForm(config.Server.DingpeiPay.Url_pay_order, params)
  97. log.Debug("DingpeiPay.payOrder req ==> %+v resp ==> %+v", params, respBody)
  98. var resp pay_resp
  99. if err := json.Unmarshal([]byte(respBody), &resp); err != nil {
  100. log.Error("DingpeiPay.payOrder json unmarshal req ==> %+v resp ==> %+v fail %v", params, respBody, err)
  101. return
  102. }
  103. log.Debug("DingpeiPay.payOrder resp ==> %+v", resp)
  104. // 请求响应码 0:成功,1:失败
  105. if resp.Code != 0 {
  106. log.Error("DingpeiPay.payOrder post return resp fail ==> %+v", resp)
  107. return
  108. }
  109. // 跳转到支付页面,以便持卡人完成支付过程
  110. c.Redirect(http.StatusMovedPermanently, resp.Data.PayUrl)
  111. return
  112. }
  113. // 回调通知
  114. func PayNotify(c *gin.Context) {
  115. bodyData, _ := io.ReadAll(c.Request.Body)
  116. log.Debug("DingpeiPay.PayNotify ==> ctx.Request.body: %v", string(bodyData))
  117. var resp payNotify
  118. if err := json.Unmarshal(bodyData, &resp); err != nil {
  119. log.Debug("%s query params err %v", "DingpeiPay.PayNotify", err)
  120. c.String(http.StatusOK, "")
  121. return
  122. }
  123. log.Debug("DingpeiPay.PayNotify resp ==> %+v", resp)
  124. // 状态,0:失败;1:成功
  125. if resp.Status != 1 {
  126. log.Error("DingpeiPay.PayNotify resp ==> %+v 失败", resp)
  127. return
  128. }
  129. params := url.Values{}
  130. params.Set("systemOrderNo", resp.SystemOrderNo)
  131. params.Set("merchantOrderNo", resp.MerchantOrderNo)
  132. params.Set("amount", resp.Amount)
  133. params.Set("realAmount", resp.RealAmount)
  134. params.Set("status", strconv.Itoa(resp.Status))
  135. // 生成签名
  136. checkContent := createEncryptStr(params) + "&key=" + config.Server.DingpeiPay.MD5Key
  137. // log.Debug("DingpeiPay.PayNotify checkContent ==> %s", checkContent)
  138. signature := strings.ToUpper(public.GetMd5String(checkContent))
  139. // 校验签名
  140. if resp.Sign != signature {
  141. log.Error("DingpeiPay.PayNotify 签名失败 ==> %+v", resp)
  142. return
  143. }
  144. log.Debug("DingpeiPay.PayNotify 签名成功")
  145. //price, err := strconv.Atoi(strings.ReplaceAll(resp.Amount, ".00", ""))
  146. //if err != nil {
  147. // log.Error("DingpeiPay.PayNotify price err %v", err)
  148. // return
  149. //}
  150. // 数据库操作
  151. obj := db.NewNotify(db.SP_Dingpei_NOTIFY)
  152. obj.In.OrderID = resp.MerchantOrderNo
  153. obj.In.TradeID = resp.SystemOrderNo
  154. // obj.In.Price = price
  155. obj.DoAction(nil)
  156. // 操作成功,给道具
  157. if obj.Out.RetCode == 1 {
  158. // 充值
  159. resp := coreClient.Recharge(obj.Out.UserID, obj.Out.ProductID)
  160. log.Debug("%s 充值成功 %+v", "liu.PayNotify", resp)
  161. }
  162. c.String(http.StatusOK, "success")
  163. return
  164. }
  165. // 支付完成跳转处理
  166. func PayCallback(c *gin.Context) {
  167. c.String(http.StatusOK, "success")
  168. log.Debug("Dingpei.payCallback")
  169. // c.Redirect(http.StatusMovedPermanently, config.Server.DingpeiPay.Url_resultPay)
  170. }