request.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package platformPay
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "net/http"
  8. "os"
  9. "strconv"
  10. "time"
  11. "github.com/nahid/gohttp"
  12. )
  13. type ResponseAccessToken struct {
  14. Data struct {
  15. AccessToken string `json:"access_token"`
  16. ExpiresIn int64 `json:"expired_at"`
  17. } `json:"data"`
  18. ErrCode int `json:"code"`
  19. ErrMsg string `json:"msg"`
  20. }
  21. const WxPlat int = 1
  22. const DyPlat int = 2
  23. func GetAdminPlatform() int {
  24. adminPlatform := os.Getenv("ADMIN_PLATFORM")
  25. switch adminPlatform {
  26. case "wechat":
  27. return WxPlat
  28. case "dy":
  29. return DyPlat
  30. default:
  31. return WxPlat
  32. }
  33. }
  34. func NewHttpRequest() *gohttp.Request {
  35. tr := &http.Transport{
  36. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  37. DisableKeepAlives: true,
  38. Dial: func(netw, addr string) (net.Conn, error) {
  39. deadline := time.Now().Add(10 * time.Second)
  40. c, err := net.DialTimeout(netw, addr, time.Second*1)
  41. if err != nil {
  42. return nil, err
  43. }
  44. c.SetDeadline(deadline)
  45. return c, nil
  46. },
  47. }
  48. a1 := gohttp.SetTransport(tr)
  49. req := gohttp.NewRequest(a1)
  50. return req
  51. }
  52. func QueryBalanceAndCheck(plat int, openid string) (*ResponseGetBalance, error) {
  53. if plat == int(WxPlat) {
  54. return WxQueryBalanceAndCheck(openid)
  55. } else if plat == int(DyPlat) {
  56. return DyQueryBalanceAndCheck(openid)
  57. }
  58. return nil, fmt.Errorf("not plat %v", plat)
  59. }
  60. func PayAndCheck(platform int, openid string, billNo string, amt int) (*ResponsePay, error) {
  61. if platform == int(WxPlat) {
  62. return WxPayAndCheck(openid, billNo, amt)
  63. } else if platform == DyPlat {
  64. return DyPayAndCheck(openid, billNo, amt)
  65. }
  66. return nil, errors.New("未知平台")
  67. }
  68. func QueryAccessToken(plat int, oldExpired int64) (token string, expired int64, err error) {
  69. req := NewHttpRequest()
  70. requestData := make(map[string]string)
  71. requestData["epr"] = strconv.FormatInt(oldExpired, 10)
  72. var url string
  73. if plat == int(WxPlat) {
  74. url = "https://gravepay.mg.xhgame.com/wx/queryAccessToken/"
  75. } else if plat == int(DyPlat) {
  76. url = "https://gravedypay.mg.xhgame.com/dy/queryAccessToken/"
  77. } else {
  78. //err = fmt.Errorf("not plat %v", plat)
  79. return "", 0, fmt.Errorf("not plat %v", plat)
  80. }
  81. resp, err := req.Query(requestData).Get(url)
  82. if err != nil {
  83. return "", 0, err
  84. }
  85. defer func() {
  86. if resp.GetBody() != nil {
  87. resp.GetBody().Close()
  88. }
  89. }()
  90. rt := new(ResponseAccessToken)
  91. err = resp.UnmarshalBody(rt)
  92. if err != nil {
  93. return "", 0, err
  94. }
  95. if len(rt.Data.AccessToken) == 0 || rt.Data.ExpiresIn == 0 {
  96. return "", 0, errors.New("no found AccessToken")
  97. }
  98. token = rt.Data.AccessToken
  99. expired = rt.Data.ExpiresIn
  100. return
  101. }