Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,28 @@ on:
pull_request:
branches: [ "main" ]

# Cancel in-progress runs for the same workflow and branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:

lint:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.21'
go-version: '1.24'
cache: true

- name: Setup golangci-lint
uses: golangci/golangci-lint-action@v6
Expand All @@ -31,10 +41,12 @@ jobs:
test:
needs: lint
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, macos-latest ]
go: [ '1.20', '1.21' ]
os: [ ubuntu-latest ]
go: [ '1.24', '1.25', '1.26' ]
runs-on: ${{ matrix.os }}
timeout-minutes: 15
steps:
- name: Checkout Code
uses: actions/checkout@v4
Expand All @@ -43,6 +55,13 @@ jobs:
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go }}
cache: true

- name: Download dependencies
run: go mod download

- name: Build
run: go build -v ./...

- name: Test
run: go test -v
run: go test -v ./...
104 changes: 104 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## 项目概述

这是一个微信 Golang SDK,提供微信小程序、公众号、开放平台三个模块的服务端 API 封装。

## 常用命令

### 测试
```bash
# 运行所有测试
go test -v ./...

# 测试特定模块
go test -v ./mini
go test -v ./public
go test -v ./open

# 运行单个测试文件
go test -v ./mini/mini_test.go
```

### 构建
```bash
# 安装依赖
go mod tidy

# 验证模块
go mod verify
```

## 代码架构

### 三大模块结构

项目按微信平台类型划分为三个独立模块,每个模块都遵循相同的设计模式:

- **mini/** - 微信小程序 SDK
- **public/** - 微信公众号 SDK
- **open/** - 微信开放平台 SDK

每个模块的核心结构:
- `SDK` 结构体:包含 Appid、Secret、accessToken、自动刷新机制
- 自动管理 AccessToken:通过 `autoManageToken` 参数控制,使用稳定版接口
- Debug 开关:通过 `DebugSwitch` 控制日志输出
- HTTP 客户端:基于 `xhttp.Client`,所有请求带 `Request-ID` header

### 公共配置

- `common.go` - 定义全局常量、版本号、Host 映射
- 支持多个 API Host:默认、上海、深圳、香港
- 统一错误处理:errcode != 0 时返回 error

### 依赖库

核心依赖来自 `go-pay` 生态:
- `go-pay/xhttp` - HTTP 客户端
- `go-pay/xlog` - 日志库
- `go-pay/bm` - BodyMap 请求体构建
- `go-pay/util` - 工具函数(加密、随机字符串等)
- `go-pay/smap` - 线程安全 Map(开放平台用于管理多用户 token)

## 开发规范

### 新增接口实现

1. **接口定义**:在对应模块的 `model.go` 中定义请求和响应结构体
2. **常量定义**:如需要,在模块内定义 API 路径常量
3. **方法实现**:
- 方法接收器为 `(s *SDK)`
- 第一个参数为 `ctx context.Context`
- 使用 `doRequestGet` 或 `doRequestPost` 发起请求
- 检查响应的 `errcode`,非 0 时返回 error
4. **测试文件**:在 `*_test.go` 中添加测试用例
5. **文档更新**:在 `doc/` 目录对应的 `.md` 文件中更新 API 列表

### AccessToken 管理

- 小程序和公众号:使用稳定版接口 `getStableAccessToken()`,自动刷新
- 开放平台:支持多用户 token 管理,使用 `openidAccessTokenMap` 存储
- 回调机制:通过 `SetMiniAccessTokenCallback` 等方法设置 token 刷新回调

### 请求规范

所有 HTTP 请求必须:
- 添加 `Request-ID` header(格式:`{21位随机字符串}-{时间戳}`)
- 使用 `js.UnmarshalBytes` 解析响应
- Debug 模式下记录请求 URI 和响应内容

### 版本发布

更新版本时需要同步修改:
1. `common.go` 中的 `Version` 常量
2. `release_note.md` 添加版本记录
3. Git tag 格式:`v1.1.x`

## 参考文档

- 微信小程序服务端:https://developers.weixin.qq.com/miniprogram/dev/api-backend/
- 微信公众号开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
- 微信开放平台文档:https://developers.weixin.qq.com/doc/oplatform/
- 项目文档:`doc/mini.md`、`doc/public.md`、`doc/open.md`
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
[![Github](https://img.shields.io/github/followers/iGoogle-ink?label=Follow&style=social)](https://github.com/iGoogle-ink)
[![Github](https://img.shields.io/github/forks/go-pay/wechat-sdk?label=Fork&style=social)](https://github.com/go-pay/wechat-sdk/fork)

[![Golang](https://img.shields.io/badge/golang-1.21-brightgreen.svg)](https://golang.google.cn)
[![Golang](https://img.shields.io/badge/golang-1.24.0-brightgreen.svg)](https://golang.google.cn)
[![GoDoc](https://img.shields.io/badge/doc-pkg.go.dev-informational.svg)](https://pkg.go.dev/github.com/go-pay/wechat-sdk)
[![Go](https://github.com/go-pay/wechat-sdk/actions/workflows/go.yml/badge.svg)](https://github.com/go-pay/wechat-sdk/actions/workflows/go.yml)
[![GitHub Release](https://img.shields.io/github/v/release/go-pay/wechat-sdk)](https://github.com/go-pay/wechat-sdk/releases)
Expand Down
2 changes: 1 addition & 1 deletion common.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const (

HeaderRequestID = "Request-ID"

Version = "v1.1.7"
Version = "v1.1.8"
)

const (
Expand Down
80 changes: 80 additions & 0 deletions doc/mini.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,86 @@ if err != nil {
* 获取媒资详细信息:`sdk.MediaAssetGetMedia()`
* 获取媒资播放链接:`sdk.MediaAssetGetMediaLink()`
* 删除媒资:`sdk.MediaAssetDeleteMedia()`
* <font color='#07C160' size='4'>订阅消息</font>
* 发送订阅消息:`sdk.SubscribeMessageSend()`
* 获取模板列表:`sdk.GetTemplateList()`
* 获取模板标题列表:`sdk.GetPubTemplateTitleList()`
* 添加模板:`sdk.AddTemplate()`
* 删除模板:`sdk.DeleteTemplate()`
* 获取类目:`sdk.GetCategory()`
* <font color='#07C160' size='4'>小程序码</font>
* 获取小程序码(数量较少):`sdk.GetWxaCode()`
* 获取小程序码(数量极多):`sdk.GetWxaCodeUnlimit()`
* 获取小程序二维码:`sdk.CreateWxaQRCode()`
* <font color='#07C160' size='4'>URL 跳转</font>
* 生成 URL Scheme:`sdk.GenerateScheme()`
* 查询 URL Scheme:`sdk.QueryScheme()`
* 生成 URL Link:`sdk.GenerateUrlLink()`
* 查询 URL Link:`sdk.QueryUrlLink()`
* 生成 Short Link:`sdk.GenerateShortLink()`
* <font color='#07C160' size='4'>内容安全</font>
* 文本内容安全检测:`sdk.MsgSecCheck()`
* 图片内容安全检测:`sdk.ImgSecCheck()`
* 音视频异步检测:`sdk.MediaCheckAsync()`
* <font color='#07C160' size='4'>数据分析</font>
* 获取用户访问数据概况:`sdk.GetDailySummary()`
* 获取访问数据日趋势:`sdk.GetDailyVisitTrend()`
* 获取访问数据周趋势:`sdk.GetWeeklyVisitTrend()`
* 获取访问数据月趋势:`sdk.GetMonthlyVisitTrend()`
* 获取用户日留存:`sdk.GetDailyRetain()`
* 获取用户周留存:`sdk.GetWeeklyRetain()`
* 获取用户月留存:`sdk.GetMonthlyRetain()`
* 获取访问页面数据:`sdk.GetVisitPage()`
* 获取用户画像分布:`sdk.GetUserPortrait()`
* 获取性能数据:`sdk.GetPerformanceData()`
* 获取访问分布数据:`sdk.GetVisitDistribution()`
* <font color='#07C160' size='4'>图像处理</font>
* 图片智能裁剪:`sdk.AiCrop()`
* 条码/二维码识别:`sdk.ScanQRCode()`
* 图片高清化:`sdk.SuperResolution()`
* 身份证OCR识别:`sdk.OcrIdCard()`
* 银行卡OCR识别:`sdk.OcrBankCard()`
* 驾驶证OCR识别:`sdk.OcrDriving()`
* 行驶证OCR识别:`sdk.OcrVehicleLicense()`
* 营业执照OCR识别:`sdk.OcrBusinessLicense()`
* 通用印刷体OCR识别:`sdk.OcrCommon()`
* 车牌OCR识别:`sdk.OcrPlateNumber()`
* <font color='#07C160' size='4'>即时配送</font>
* 拉取已绑定账号:`sdk.DeliveryGetAllAccount()`
* 配送单预下单:`sdk.DeliveryPreAddOrder()`
* 配送单下单:`sdk.DeliveryAddOrder()`
* 配送单增加小费:`sdk.DeliveryAddTips()`
* 配送单取消:`sdk.DeliveryCancelOrder()`
* 配送单查询:`sdk.DeliveryGetOrder()`
* 模拟配送公司更新配送单状态:`sdk.DeliveryMockUpdateOrder()`
* 异常件退回商家商圈:`sdk.DeliveryAbnormalConfirm()`
* <font color='#07C160' size='4'>物流助手</font>
* 生成运单:`sdk.ExpressAddOrder()`
* 取消运单:`sdk.ExpressCancelOrder()`
* 获取所有绑定的物流账号:`sdk.ExpressGetAllAccount()`
* 获取电子面单余额:`sdk.ExpressGetQuota()`
* 查询运单轨迹:`sdk.ExpressGetPath()`
* 获取支持的快递公司列表:`sdk.ExpressGetAllDelivery()`
* 获取打印员:`sdk.ExpressGetPrinter()`
* 配置面单打印员:`sdk.ExpressUpdatePrinter()`
* 获取面单联系人信息:`sdk.ExpressGetContact()`
* <font color='#07C160' size='4'>搜索</font>
* 提交小程序页面:`sdk.SearchSubmitPages()`
* 删除已提交的小程序页面:`sdk.SearchDeletePage()`
* <font color='#07C160' size='4'>运维中心</font>
* 获取域名配置:`sdk.GetDomainInfo()`
* 修改服务器域名:`sdk.ModifyDomain()`
* 设置业务域名:`sdk.SetWebviewDomain()`
* 获取小程序码扫码打开的页面:`sdk.GetQrcodeJumppublish()`
* 设置小程序码扫码打开的页面:`sdk.SetQrcodeJump()`
* <font color='#07C160' size='4'>小程序管理</font>
* 获取小程序基本信息:`sdk.GetAccountBasicInfo()`
* 获取已上传的代码的页面列表:`sdk.GetPage()`
* 获取授权小程序帐号的可选类目:`sdk.GetMiniCategory()`
* 获取小程序的第三方提交代码的页面配置:`sdk.GetExtConfig()`
* 设置小程序的第三方提交代码的页面配置:`sdk.SetExtConfig()`
* <font color='#07C160' size='4'>服务市场</font>
* 调用服务平台提供的服务:`sdk.InvokeService()`

### 微信小程序 公共API

Expand Down
Loading
Loading