蛋蛋星球-制度模式
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

87 righe
2.4 KiB

  1. package saobei
  2. import (
  3. "context"
  4. "crypto/md5"
  5. "fmt"
  6. "hash"
  7. "sync"
  8. "github.com/go-pay/gopay"
  9. "github.com/go-pay/gopay/pkg/xhttp"
  10. "github.com/go-pay/xlog"
  11. )
  12. type Client struct {
  13. instNo string //商户系统机构号inst_no
  14. key string // 商户系统令牌
  15. merchantNo string // 支付系统:商户号
  16. terminalId string // 支付系统:商户号终端号
  17. accessToken string // 支付系统: 令牌
  18. isProd bool // 是否正式环境
  19. payVer string //版本号 当前201
  20. serviceId string //接口类型,当前类型015
  21. hc *xhttp.Client
  22. mu sync.Mutex
  23. md5Hash hash.Hash
  24. }
  25. // NewClient 初始化扫呗客户端
  26. // instNo string //商户系统机构号inst_no
  27. // key string // 商户系统令牌
  28. // merchantNo string // 支付系统:商户号
  29. // terminalId string // 支付系统:商户号终端号
  30. // accessToken string // 支付系统: 令牌
  31. // isProd:是否是正式环境
  32. func NewClient(instNo, key, merchantNo, terminalId, accessToken string, isProd bool) (*Client, error) {
  33. return &Client{
  34. instNo: instNo,
  35. key: key,
  36. merchantNo: merchantNo,
  37. terminalId: terminalId,
  38. accessToken: accessToken,
  39. isProd: isProd,
  40. hc: xhttp.NewClient(),
  41. md5Hash: md5.New(),
  42. payVer: "201",
  43. serviceId: "015",
  44. }, nil
  45. }
  46. // pubParamsHandle 公共参数处理
  47. func (c *Client) pubParamsHandle(bm gopay.BodyMap) gopay.BodyMap {
  48. if ver := bm.GetString("pay_ver"); ver == gopay.NULL {
  49. bm.Set("pay_ver", c.payVer)
  50. }
  51. if v := bm.GetString("service_id"); v == gopay.NULL {
  52. bm.Set("service_id", c.serviceId)
  53. }
  54. if v := bm.GetString("merchant_no"); v == gopay.NULL {
  55. bm.Set("merchant_no", c.merchantNo)
  56. }
  57. if v := bm.GetString("terminal_id"); v == gopay.NULL {
  58. bm.Set("terminal_id", c.terminalId)
  59. }
  60. sign := c.getRsaSign(bm)
  61. bm.Set("key_sign", sign)
  62. return bm
  63. }
  64. // doPost 发起请求
  65. func (c *Client) doPost(ctx context.Context, path string, bm gopay.BodyMap) (bs []byte, err error) {
  66. param := c.pubParamsHandle(bm)
  67. xlog.Debugf("saobeiParam:%+v", param.JsonBody())
  68. url := baseUrl
  69. if !c.isProd {
  70. url = sandboxBaseUrl
  71. }
  72. res, bs, err := c.hc.Req(xhttp.TypeJSON).Post(url + path).SendBodyMap(param).EndBytes(ctx)
  73. if err != nil {
  74. return nil, err
  75. }
  76. if res.StatusCode != 200 {
  77. return nil, fmt.Errorf("HTTP Request Error, StatusCode = %d", res.StatusCode)
  78. }
  79. return bs, nil
  80. }