Metadata-Version: 2.4
Name: wz-opensdk
Version: 0.1.1
Summary: 万桩开放平台 Python OpenSDK
License: MIT
Project-URL: Homepage, https://gitee.com/wz-open-platform/wz-opensdk-python
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: httpx>=0.27
Provides-Extra: dev
Requires-Dist: pytest>=8.0; extra == "dev"

# wz-opensdk

万桩开放平台 Python SDK。覆盖 Apifox 项目 `wz-open` 中文目录下的公开 API（设备、充电、续费、开票、回调日志）。`inner/*` 内部接口不在本 SDK 中。SDK 只做 client，不解析平台推送到合作方的入站回调。

发行名：`wz-opensdk`。导入名：`wzopensdk`。Python **3.9+**。

## 安装

```bash
pip install wz-opensdk
# 请装 0.1.1+。PyPI 上的 0.1.0 无法覆盖，不要指定 ==0.1.0
```

PyPI：https://pypi.org/project/wz-opensdk/

本地开发：

```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
```

## 快速开始

```python
import os
from wzopensdk import WzOpenClient
from wzopensdk.device import DeviceNumRequest

client = WzOpenClient(
    endpoint=os.environ["WZ_OPEN_ENDPOINT"],
    app_id=os.environ["WZ_OPEN_APP_ID"],
    app_secret=os.environ["WZ_OPEN_APP_SECRET"],
)

device = client.device.find_one(DeviceNumRequest("18000001"))
```

也可 `WzOpenClient.from_env()`（读 `WZ_OPEN_ENDPOINT` / `WZ_OPEN_APP_ID` / `WZ_OPEN_APP_SECRET`）。

按域调用，方法不堆在 `WzOpenClient` 上：

- `client.device` 设备绑定、计费模式、状态、在线日志
- `client.charge.start` / `stop`
- `client.renew`
- `client.invoice`
- `client.callback.log` / `retry_finish_order`

默认请求超时 10s。

## 签名

SDK 按接入指引自动加 `app_id`、`timestamp`、`sign`（HMAC-SHA256 大写 hex）。调用方不要自己拼签，也不要传 `company_id`。金额单位为分。

契约快照：[../api/openapi.json](../api/openapi.json)（汽车桩 `saveMode`/`getMode` 在 SDK 中拆成独立方法；`/open/device/setting/sync` 属于 inner，本 SDK 不实现）。公开能力合计 40 条出站 API。

## 日志

使用标准库 `logging`，logger 名 `wzopensdk`。可传入自定义 logger。

成功请求的 info 日志会带 `method`、`path`；响应头有 `X-B3-TraceId` 时再带 `traceId`。失败时同一字段出现在 error 日志里，并可从 `WzOpenAPIError.trace_id` 读取。

## HTTP

可配 timeout（默认 10s）、retry_count（失败重试且每次重签）、retry_wait、user_agent、proxy_url，或直接传入 `httpx.Client`。

## 开发

```bash
pip install -e ".[dev]"
python3 -m pytest -q
# 或 make test
```

现网验证（需要凭证）：

```bash
export WZ_OPEN_ENDPOINT=...
export WZ_OPEN_APP_ID=...
export WZ_OPEN_APP_SECRET=...
make verify
```

## 发布到 PyPI

已发布版本不可覆盖。发新版时先改 `pyproject.toml` 里的 `version`（例如 `0.1.0` → `0.1.1`），再在本目录执行：

```bash
make publish
```

会跑测试、构建 wheel / sdist，再用仓库根目录 `publish/credentials.env` 中的 `PYPI_API_TOKEN` 上传到 PyPI。该文件已 gitignore，只保存在本机，不要提交。

从 `publish/credentials.env.example` 复制出 `credentials.env` 后填写 token。token 在 [PyPI API tokens](https://pypi.org/manage/account/token/) 创建；上传时用户名为 `__token__`。

