api_refunds.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // Copyright 2021 Tencent Inc. All rights reserved.
  2. //
  3. // 境内普通商户退款API
  4. //
  5. // 境内普通商户退款功能涉及的API文档
  6. //
  7. // API version: 1.1.1
  8. // Code generated by WechatPay APIv3 Generator based on [OpenAPI Generator](https://openapi-generator.tech); DO NOT EDIT.
  9. package refunddomestic
  10. import (
  11. "context"
  12. "fmt"
  13. nethttp "net/http"
  14. neturl "net/url"
  15. "strings"
  16. "git.nanodreamtech.com/sg/wechatpay-go/core"
  17. "git.nanodreamtech.com/sg/wechatpay-go/core/consts"
  18. "git.nanodreamtech.com/sg/wechatpay-go/services"
  19. )
  20. type RefundsApiService services.Service
  21. // Create 退款申请
  22. //
  23. // # 应用场景
  24. // 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。
  25. //
  26. // 注意:
  27. // 1、交易时间超过一年的订单无法提交退款
  28. // 2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号
  29. // 3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次
  30. //
  31. // 错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次
  32. //
  33. // 4、每个支付订单的部分退款次数不能超过50次
  34. // 5、如果同一个用户有多笔退款,建议分不同批次进行退款,避免并发退款导致退款失败
  35. // 6、申请退款接口的返回仅代表业务的受理情况,具体退款是否成功,需要通过退款查询接口获取结果
  36. //
  37. // # 错误码
  38. // |名称|描述|原因|解决方案|
  39. // |-|-|-|-|
  40. // |SYSTEM_ERROR|接口返回错误|系统超时等|请不要更换商户退款单号,请使用相同参数再次调用API。|
  41. // |USER_ACCOUNT_ABNORMAL|退款请求失败|用户帐号注销|此状态代表退款申请失败,商户可自行处理退款。|
  42. // |NOT_ENOUGH|余额不足|商户可用退款余额不足|此状态代表退款申请失败,商户可根据具体的错误提示做相应的处理。|
  43. // |PARAM_ERROR|参数错误|请求参数未按指引进行填写|请求参数错误,请重新检查再调用退款申请|
  44. // |MCH_NOT_EXISTS|MCHID不存在|参数中缺少MCHID|请检查MCHID是否正确|
  45. // |RESOURCE_NOT_EXISTS|订单号不存在|缺少有效的订单号|请检查你的订单号是否正确且是否已支付,未支付的订单不能发起退款|
  46. // |SIGN_ERROR|签名错误|参数签名结果不正确|请检查签名参数和方法是否都符合签名算法要求|
  47. // |FREQUENCY_LIMITED|频率限制|2个月之前的订单申请退款有频率限制|该笔退款未受理,请降低频率后重试|
  48. // |INVALID_REQUEST|请求参数符合参数格式,但不符合业务规则|不符合业务规则|此状态代表退款申请失败,商户可根据具体的错误提示做相应的处理。|
  49. // |NO_AUTH|没有退款权限|没有此单的退款权限|此状态代表退款申请失败,请检查是否有退这笔订单的权限|
  50. func (a *RefundsApiService) Create(ctx context.Context, req CreateRequest) (resp *Refund, result *core.APIResult, err error) {
  51. var (
  52. localVarHTTPMethod = nethttp.MethodPost
  53. localVarPostBody interface{}
  54. localVarQueryParams neturl.Values
  55. localVarHeaderParams = nethttp.Header{}
  56. )
  57. localVarPath := consts.WechatPayAPIServer + "/v3/refund/domestic/refunds"
  58. // Make sure All Required Params are properly set
  59. // Setup Body Params
  60. localVarPostBody = req
  61. // Determine the Content-Type Header
  62. localVarHTTPContentTypes := []string{"application/json"}
  63. // Setup Content-Type
  64. localVarHTTPContentType := core.SelectHeaderContentType(localVarHTTPContentTypes)
  65. // Perform Http Request
  66. result, err = a.Client.Request(ctx, localVarHTTPMethod, localVarPath, localVarHeaderParams, localVarQueryParams, localVarPostBody, localVarHTTPContentType)
  67. if err != nil {
  68. return nil, result, err
  69. }
  70. // Extract Refund from Http Response
  71. resp = new(Refund)
  72. err = core.UnMarshalResponse(result.Response, resp)
  73. if err != nil {
  74. return nil, result, err
  75. }
  76. return resp, result, nil
  77. }
  78. // QueryByOutRefundNo 查询单笔退款(通过商户退款单号)
  79. //
  80. // # 应用场景
  81. // 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,建议查询退款状态在提交退款申请后1分钟发起,一般来说零钱支付的退款5分钟内到账,银行卡支付的退款1-3个工作日到账。
  82. // # 错误码
  83. // |名称|描述|原因|解决方案|
  84. // |-|-|-|-|
  85. // |SYSTEM_ERROR|接口返回错误|系统超时|请尝试再次调用API。|
  86. // |RESOURCE_NOT_EXISTS|退款单查询失败|退款单号错误或退款单状态不正确|请检查退款单号是否有误以及订单状态是否正确,如:未支付、已支付未退款|
  87. // |PARAM_ERROR|参数错误|请求参数未按指引进行填写|请求参数错误,请检查参数再调用退款查询|
  88. // |MCH_NOT_EXISTS|MCHID不存在|参数中缺少MCHID|请检查MCHID是否正确|
  89. // |SIGN_ERROR|签名错误|参数签名结果不正确|请检查签名参数和方法是否都符合签名算法要求|
  90. func (a *RefundsApiService) QueryByOutRefundNo(ctx context.Context, req QueryByOutRefundNoRequest) (resp *Refund, result *core.APIResult, err error) {
  91. var (
  92. localVarHTTPMethod = nethttp.MethodGet
  93. localVarPostBody interface{}
  94. localVarQueryParams neturl.Values
  95. localVarHeaderParams = nethttp.Header{}
  96. )
  97. // Make sure Path Params are properly set
  98. if req.OutRefundNo == nil {
  99. return nil, nil, fmt.Errorf("field `OutRefundNo` is required and must be specified in QueryByOutRefundNoRequest")
  100. }
  101. localVarPath := consts.WechatPayAPIServer + "/v3/refund/domestic/refunds/{out_refund_no}"
  102. // Build Path with Path Params
  103. localVarPath = strings.Replace(localVarPath, "{"+"out_refund_no"+"}", neturl.PathEscape(core.ParameterToString(*req.OutRefundNo, "")), -1)
  104. // Make sure All Required Params are properly set
  105. // Setup Query Params
  106. localVarQueryParams = neturl.Values{}
  107. if req.SubMchid != nil {
  108. localVarQueryParams.Add("sub_mchid", core.ParameterToString(*req.SubMchid, ""))
  109. }
  110. // Determine the Content-Type Header
  111. localVarHTTPContentTypes := []string{}
  112. // Setup Content-Type
  113. localVarHTTPContentType := core.SelectHeaderContentType(localVarHTTPContentTypes)
  114. // Perform Http Request
  115. result, err = a.Client.Request(ctx, localVarHTTPMethod, localVarPath, localVarHeaderParams, localVarQueryParams, localVarPostBody, localVarHTTPContentType)
  116. if err != nil {
  117. return nil, result, err
  118. }
  119. // Extract Refund from Http Response
  120. resp = new(Refund)
  121. err = core.UnMarshalResponse(result.Response, resp)
  122. if err != nil {
  123. return nil, result, err
  124. }
  125. return resp, result, nil
  126. }