{"record":{"id":"6f2c6d8e56feb2a4","repo":"sipeed/picoclaw","slug":"failed-to-get-wecom-qr-code-w","errorCode":null,"errorMessage":"failed to get WeCom QR code: %w","messagePattern":"failed to get WeCom QR code: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/picoclaw/internal/auth/wecom.go","lineNumber":259,"sourceCode":"\tif opts.PollTimeout <= 0 {\n\t\topts.PollTimeout = wecomQRPollTimeout\n\t}\n\tif opts.Writer == nil {\n\t\topts.Writer = os.Stdout\n\t}\n\n\treturn opts\n}\n\nfunc fetchWeComQRCode(ctx context.Context, opts wecomQRFlowOptions) (wecomQRSession, error) {\n\tgenerateURL, err := buildWeComQRGenerateURL(opts.GenerateURL, opts.SourceID, wecomPlatformCode())\n\tif err != nil {\n\t\treturn wecomQRSession{}, err\n\t}\n\n\tvar resp wecomQRGenerateResponse\n\tif err := doWeComJSONGet(ctx, opts.HTTPClient, generateURL, &resp); err != nil {\n\t\treturn wecomQRSession{}, fmt.Errorf(\"failed to get WeCom QR code: %w\", err)\n\t}\n\tif resp.ErrCode != 0 {\n\t\treturn wecomQRSession{}, fmt.Errorf(\n\t\t\t\"failed to get WeCom QR code: errcode=%d errmsg=%s\",\n\t\t\tresp.ErrCode,\n\t\t\tresp.ErrMsg,\n\t\t)\n\t}\n\tif resp.Data.SCode == \"\" || resp.Data.AuthURL == \"\" {\n\t\treturn wecomQRSession{}, fmt.Errorf(\"failed to get WeCom QR code: response missing scode or auth_url\")\n\t}\n\n\treturn wecomQRSession{\n\t\tSCode:   resp.Data.SCode,\n\t\tAuthURL: resp.Data.AuthURL,\n\t}, nil\n}\n","sourceCodeStart":241,"sourceCodeEnd":277,"githubUrl":"https://github.com/sipeed/picoclaw/blob/49183d7e8daed0dba89ddbb6fcb60089401d9680/cmd/picoclaw/internal/auth/wecom.go#L241-L277","documentation":"The initial HTTP GET to the WeCom QR generate endpoint failed at the transport layer inside doWeComJSONGet (client.Do returned an error). This is pure connectivity — DNS resolution, TCP connect, TLS handshake, or the per-request HTTP timeout (wecomQRHTTPTimeout on the client built in defaultWeComQRFlowOptions) — before any status code was received.","triggerScenarios":"No internet or DNS failure when starting picoclaw's WeCom login; the QR relay service host unreachable; a proxy or firewall blocking the generate URL; TLS interception by a corporate proxy whose CA is not trusted; HTTP client timeout exceeded before the server responded.","commonSituations":"Running login inside a container without network; corporate egress proxy blocking the endpoint; the QR relay endpoint is temporarily down; system clock skew breaking TLS.","solutions":["Check basic connectivity: curl -v the generate endpoint URL and look for DNS/TLS/connect errors","Fix or disable HTTP(S)_PROXY env vars if a corporate proxy interferes","Retry after a moment — transient relay outages are common","Update picoclaw in case the relay endpoint URL changed between versions","Verify system clock is correct (TLS cert validation depends on it)"],"exampleFix":"// before\nif err := doWeComJSONGet(ctx, opts.HTTPClient, generateURL, &resp); err != nil {\n\treturn wecomQRSession{}, fmt.Errorf(\"failed to get WeCom QR code: %w\", err)\n}\n\n// after: retry once on transport errors, since QR relay blips are transient\nvar resp wecomQRGenerateResponse\nerr := doWeComJSONGet(ctx, opts.HTTPClient, generateURL, &resp)\nif err != nil {\n\ttime.Sleep(2 * time.Second)\n\terr = doWeComJSONGet(ctx, opts.HTTPClient, generateURL, &resp)\n}\nif err != nil {\n\treturn wecomQRSession{}, fmt.Errorf(\"failed to get WeCom QR code: %w\", err)\n}","handlingStrategy":"retry","validationCode":"// Cheap connectivity pre-flight before an interactive flow\nif _, err := net.DialTimeout(\"tcp\", relayHostPort, 3*time.Second); err != nil {\n\treturn fmt.Errorf(\"cannot reach WeCom QR relay: %w\", err)\n}","typeGuard":"func isTransportErr(err error) bool {\n\tvar netErr net.Error\n\treturn errors.As(err, &netErr) || errors.Is(err, io.EOF)\n}","tryCatchPattern":"var resp wecomQRGenerateResponse\nerr := doWeComJSONGet(ctx, opts.HTTPClient, generateURL, &resp)\nif err != nil && isTransportErr(err) {\n\ttime.Sleep(2 * time.Second)\n\terr = doWeComJSONGet(ctx, opts.HTTPClient, generateURL, &resp)\n}\nif err != nil {\n\treturn wecomQRSession{}, fmt.Errorf(\"failed to get WeCom QR code: %w\", err)\n}","preventionTips":["Verify internet/DNS before starting interactive logins","Set sane HTTP(S)_PROXY values or unset them when not needed","Retry the generate call once — relay blips are common"],"tags":["go","wecom","network","http"],"backgroundTag":null,"analyzedSha":"49183d7e8daed0dba89ddbb6fcb60089401d9680","analyzedAt":"2026-08-15T21:55:41.315Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}