package saobei import ( "context" "crypto/md5" "fmt" "hash" "sync" "github.com/go-pay/gopay" "github.com/go-pay/gopay/pkg/xhttp" "github.com/go-pay/xlog" ) type Client struct { instNo string //商户系统机构号inst_no key string // 商户系统令牌 merchantNo string // 支付系统:商户号 terminalId string // 支付系统:商户号终端号 accessToken string // 支付系统: 令牌 isProd bool // 是否正式环境 payVer string //版本号 当前201 serviceId string //接口类型,当前类型015 hc *xhttp.Client mu sync.Mutex md5Hash hash.Hash } // NewClient 初始化扫呗客户端 // instNo string //商户系统机构号inst_no // key string // 商户系统令牌 // merchantNo string // 支付系统:商户号 // terminalId string // 支付系统:商户号终端号 // accessToken string // 支付系统: 令牌 // isProd:是否是正式环境 func NewClient(instNo, key, merchantNo, terminalId, accessToken string, isProd bool) (*Client, error) { return &Client{ instNo: instNo, key: key, merchantNo: merchantNo, terminalId: terminalId, accessToken: accessToken, isProd: isProd, hc: xhttp.NewClient(), md5Hash: md5.New(), payVer: "201", serviceId: "015", }, nil } // pubParamsHandle 公共参数处理 func (c *Client) pubParamsHandle(bm gopay.BodyMap) gopay.BodyMap { if ver := bm.GetString("pay_ver"); ver == gopay.NULL { bm.Set("pay_ver", c.payVer) } if v := bm.GetString("service_id"); v == gopay.NULL { bm.Set("service_id", c.serviceId) } if v := bm.GetString("merchant_no"); v == gopay.NULL { bm.Set("merchant_no", c.merchantNo) } if v := bm.GetString("terminal_id"); v == gopay.NULL { bm.Set("terminal_id", c.terminalId) } sign := c.getRsaSign(bm) bm.Set("key_sign", sign) return bm } // doPost 发起请求 func (c *Client) doPost(ctx context.Context, path string, bm gopay.BodyMap) (bs []byte, err error) { param := c.pubParamsHandle(bm) xlog.Debugf("saobeiParam:%+v", param.JsonBody()) url := baseUrl if !c.isProd { url = sandboxBaseUrl } res, bs, err := c.hc.Req(xhttp.TypeJSON).Post(url + path).SendBodyMap(param).EndBytes(ctx) if err != nil { return nil, err } if res.StatusCode != 200 { return nil, fmt.Errorf("HTTP Request Error, StatusCode = %d", res.StatusCode) } return bs, nil }