payment_api.go 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package api
  2. import (
  3. "encoding/json"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. "io"
  7. "sync"
  8. )
  9. const (
  10. queryPaymentUrl = "/paygateway/query.json"
  11. createPaymentUrl = "/paygateway/createpay.json"
  12. )
  13. var (
  14. paymentFacadeOnce sync.Once
  15. paymentFacade *HTPaymentApi
  16. )
  17. type HTPaymentApi struct {
  18. *HTApi
  19. }
  20. func GetPaymentInstance() *HTPaymentApi {
  21. paymentFacadeOnce.Do(func() {
  22. paymentFacade = &HTPaymentApi{
  23. GetInstance(),
  24. }
  25. })
  26. return paymentFacade
  27. }
  28. type PaymentOrderRequest struct {
  29. AppId string `json:"appId"` // 必须 业务系统编号
  30. Sign string `json:"sign"` // 必须 加密字符串
  31. ChannelTypeCode string `json:"channelTypeCode"` // 必须 支付渠道编码(6:华为支付,7:微信小程序)
  32. Subject string `json:"subject"` // 必须 商品标题
  33. Body string `json:"body"` // 必须 商品描述
  34. TotalFee string `json:"totalFee"` // 必须 订单价格
  35. BillNo string `json:"billNo"` // 必须 商户系统内部的订单号
  36. BillTypeCode string `json:"billTypeCode"` // 非必须 业务类型code
  37. BillType string `json:"billType"` // 非必须 业务类型
  38. TimeoutExpress string `json:"timeoutExpress"` // 必须 订单失效时间(秒)
  39. Optional string `json:"optional"` // 必须 扩展类参数
  40. Mobile string `json:"mobile"` // 非必须 手机号
  41. IapProductId string `json:"iapProductId"` // 非必须 苹果内购产品ID
  42. }
  43. type PaymentOrderResponse struct {
  44. Success bool `json:"success"` // 必须 接口调用结果
  45. ResultCode string `json:"resultCode"` // 必须 结果码
  46. ResultDesc string `json:"resultDesc"` // 必须 结果描述
  47. ResultView string `json:"resultView"` // 必须 错误结果显示
  48. PrePayStr string `json:"prePayStr"` // 必须 预支付订单信息
  49. }
  50. func (f *HTPaymentApi) CreatePaymentOrder(req PaymentOrderRequest) (tradeNo string, err error) {
  51. url := f.htConfig.GetPaymentApiUrl() + createPaymentUrl
  52. req.AppId = f.htConfig.GetPaymentAppId()
  53. req.Sign = f.htConfig.GetPaymentSign()
  54. resp, err := f.client.Post(url, req)
  55. if err != nil {
  56. logger.Error("调用支付创单接口失败:[%v]", err)
  57. return
  58. }
  59. defer func(Body io.ReadCloser) {
  60. closeErr := Body.Close()
  61. if closeErr != nil {
  62. logger.Error("关闭Response失败:%v", closeErr)
  63. }
  64. }(resp.Body)
  65. body, _ := io.ReadAll(resp.Body)
  66. var paymentOrderResponse PaymentOrderResponse
  67. err = json.Unmarshal(body, &paymentOrderResponse)
  68. if err != nil {
  69. logger.Warn("[支付接口调用]解析支付创建订单接口应答失败:%v", err)
  70. err = exception.New(exception.CreatePaymentOrderFailed)
  71. return
  72. }
  73. if !paymentOrderResponse.Success {
  74. logger.Warn("[支付接口调用] 创建订单失败:[code:%v, msg:%v]", paymentOrderResponse.ResultCode, paymentOrderResponse.ResultDesc)
  75. err = exception.NewWithException(exception.CreatePaymentOrderFailed, paymentOrderResponse.ResultView)
  76. return
  77. }
  78. logger.Info("[支付接口调用] 创建订单成功:[%v]", paymentOrderResponse.PrePayStr)
  79. tradeNo = paymentOrderResponse.PrePayStr
  80. return
  81. }