记录退款失败请求参数

This commit is contained in:
yml
2026-06-18 21:53:46 +08:00
parent 6d385478a6
commit fa14e0e36d
4 changed files with 140 additions and 8 deletions
@@ -146,6 +146,7 @@ type QueryRefundResponse struct {
RefundAmount string
RefundTime string
Raw map[string]string
RawRequest map[string]string
}
type VerifyNotifyResult struct {
@@ -275,7 +276,14 @@ func (c *Client) CreateRefund(ctx context.Context, req CreateRefundRequest) (*Cr
rawReq := stringifyMap(reqData)
raw, err := c.post(ctx, endpointRefund, reqData)
if err != nil {
return nil, err
return &CreateRefundResponse{
MerchantID: c.cfg.MerchantID,
ThirdOrderID: req.ThirdOrderID,
ProviderOrderID: req.ProviderOrderID,
MerchantRefundID: req.MerchantRefundID,
RefundAmount: strconv.FormatInt(req.RefundAmountCent, 10),
RawRequest: rawReq,
}, err
}
return &CreateRefundResponse{
OK: responseOK(raw),
@@ -312,9 +320,17 @@ func (c *Client) QueryRefund(ctx context.Context, req QueryRefundRequest) (*Quer
if c.cfg.TermNo == "" {
delete(reqData, "term_no")
}
rawReq := stringifyMap(reqData)
raw, err := c.post(ctx, endpointRefundQuery, reqData)
if err != nil {
return nil, err
return &QueryRefundResponse{
MerchantID: c.cfg.MerchantID,
ThirdOrderID: req.ThirdOrderID,
ProviderOrderID: req.ProviderOrderID,
MerchantRefundID: req.MerchantRefundID,
ProviderRefundID: req.ProviderRefundID,
RawRequest: rawReq,
}, err
}
return &QueryRefundResponse{
OK: responseOK(raw),
@@ -328,6 +344,7 @@ func (c *Client) QueryRefund(ctx context.Context, req QueryRefundRequest) (*Quer
RefundAmount: raw["refund_amount"],
RefundTime: firstNonEmpty(raw["refund_time"], raw["trade_time"], raw["finish_time"]),
Raw: raw,
RawRequest: rawReq,
}, nil
}
@@ -159,6 +159,53 @@ func TestCreatePaymentUsesShanghaiTimeWhenLocalIsUTC(t *testing.T) {
}
}
func TestCreateRefundReturnsRawRequestOnHTTPError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != endpointRefund {
t.Fatalf("path = %s, want %s", r.URL.Path, endpointRefund)
}
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(`{"code":"OP90001","msg":"请求服务失败"}`))
}))
defer server.Close()
key, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
t.Fatalf("generate key: %v", err)
}
privatePEM, certPEM := testKeyPairPEM(t, key)
client := NewClient(Config{
GatewayURL: server.URL,
AppID: "app-1",
SerialNo: "serial-1",
MerchantID: "merchant-1",
TermNo: "term-1",
PrivateKey: privatePEM,
NotifyCert: certPEM,
})
resp, err := client.CreateRefund(context.Background(), CreateRefundRequest{
ThirdOrderID: "PAY123",
ProviderOrderID: "TRADE123",
MerchantRefundID: "REF123",
RefundAmountCent: 99,
RefundReason: "结账退款",
})
if err == nil {
t.Fatal("CreateRefund error = nil, want HTTP error")
}
if resp == nil {
t.Fatal("CreateRefund response = nil, want raw request")
}
if resp.RawRequest["merchant_no"] != "merchant-1" ||
resp.RawRequest["term_no"] != "term-1" ||
resp.RawRequest["out_trade_no"] != "REF123" ||
resp.RawRequest["refund_amount"] != "99" ||
resp.RawRequest["origin_out_trade_no"] != "PAY123" ||
resp.RawRequest["origin_trade_no"] != "TRADE123" {
t.Fatalf("raw request = %#v", resp.RawRequest)
}
}
func parseLakalaTestTime(t *testing.T, value string) time.Time {
t.Helper()
parsed, err := time.ParseInLocation("20060102150405", value, timeutil.ShanghaiLocation())