观华智域

观华智域 · 开发文档

微信 Rust SDK

小程序服务端 + 推送 / 物流 / 配送 / OCR / 数据 / 运维 + 微信支付 API v3

按业务拆分的 Cargo Workspace。聚合包 crates.io 名为 wechat-miniprogram(wechat-mp 已被占用)。覆盖登录到 OCR、数据分析、openApi 运维与支付账单/分账/转账。MIT,源码在 GitHub / Gitee。

介绍

面向 Rust 后端对接微信:小程序服务端接口、消息推送、物流/即时配送、图像 OCR、数据分析、openApi 运维,以及微信支付 API v3(直连商户)。

  • Workspace 拆分:按业务选 crate;也可一次引入 wechat-miniprogram。
  • MpClient 统一 access_token(稳定版 / 经典版)与 HTTP;内存缓存并提前刷新。
  • 消息推送与支付回调是两套 NotifyHandler,勿混用。
  • 支付侧 WechatPayClient:APIv3 签名、回调解密,以及账单 / 分账 / 商家转账。

包一览

全部已发布到 crates.io(Edition 2021)。wechat-mp-core 为 0.1.1(含 post_query / post_multipart / post_query_no_token),其余多为 0.1.0。聚合包发布名 wechat-miniprogram(目录 wechat-mp/)。支付请单独依赖 wechat-pay。

Crate版本说明
wechat-mp-core0.1.1公共核心:Config、access_token、HTTP、错误类型
wechat-mp-auth0.1.0登录、会话、手机号、用户相关接口
wechat-mp-qrcode0.1.0小程序码、Scheme / URL Link / ShortLink
wechat-mp-message0.1.0订阅消息、模板管理、客服消息
wechat-mp-security0.1.0内容安全、异步媒体检测、用户风险等级
wechat-mp-trade0.1.0发货信息管理 / 交易管理
wechat-mp-notify0.1.0消息推送验签加解密、事件解析
wechat-mp-logistics0.1.0物流助手(账号/下单/轨迹/面单)
wechat-mp-delivery0.1.0即时配送(预下单/下单/取消/小费/沙盒)
wechat-mp-ocr0.1.0图像处理与 OCR(证照/印刷体/二维码/裁剪)
wechat-mp-analytics0.1.0数据分析(留存/趋势/画像/页面/性能)
wechat-mp-ops0.1.0openApi 管理(额度/IP/网络检测/rid)
wechat-miniprogram0.1.0小程序聚合包(re-export 上述子 crate)
wechat-pay0.1.0支付 API v3:下单/退款/账单/分账/转账/回调

安装

全部 crate 已上架 crates.io,推荐直接依赖;本地联调可用 path;也可 git 依赖 GitHub / Gitee。需要 Rust 2021 与 tokio。

方式一:crates.io(推荐)

[dependencies]
wechat-mp-core = "0.1.1"
wechat-mp-auth = "0.1"
# 或聚合包(注意包名)
wechat-miniprogram = "0.1"
wechat-pay = "0.1"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

方式二:Git 依赖

[dependencies]
wechat-miniprogram = { git = "https://github.com/EhuaDB/wechat-sdk-rust.git" }
wechat-pay = { git = "https://github.com/EhuaDB/wechat-sdk-rust.git" }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

方式三:Path 依赖(本地联调)

[dependencies]
wechat-miniprogram = { path = "../wechat-sdk-rust/wechat-mp" }
wechat-pay = { path = "../wechat-sdk-rust/wechat-pay" }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

按需引用子 crate

[dependencies]
wechat-mp-core = "0.1.1"
wechat-mp-auth = "0.1"
# 需要时再加:
# wechat-mp-ocr = "0.1"
# wechat-mp-ops = "0.1"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

运行时说明

业务工程需自行引入 tokio;HTTP 已在 SDK 内使用 reqwest + rustls。注意:依赖键名是 wechat-miniprogram,不是 wechat-mp。

配置

小程序、消息推送、支付是三套配置。可用环境变量或代码构建。

小程序环境变量

Env说明
WECHAT_MP_APP_ID必填小程序 AppID
WECHAT_MP_APP_SECRET必填小程序 AppSecret
WECHAT_MP_BASE_URL可选默认 https://api.weixin.qq.com
WECHAT_MP_TOKEN_MODE可选stable(默认)或 classic
WECHAT_MP_APP_ID=wx................
WECHAT_MP_APP_SECRET=................
# 可选
# WECHAT_MP_TOKEN_MODE=stable
# WECHAT_MP_BASE_URL=https://api.weixin.qq.com

TokenMode::Stable 走 POST /cgi-bin/stable_token;Classic 走 GET /cgi-bin/token。MpClient 内存缓存 token,并提前约 5 分钟刷新。

消息推送环境变量

Env说明
WECHAT_MP_APP_ID必填与小程序共用,解密后校验 AppID
WECHAT_MP_PUSH_TOKEN必填消息推送 Token
WECHAT_MP_PUSH_AES_KEY必填EncodingAESKey(43 字符)
WECHAT_MP_PUSH_FORMAT可选json(默认)或 xml
WECHAT_MP_APP_ID=wx................
WECHAT_MP_PUSH_TOKEN=................
WECHAT_MP_PUSH_AES_KEY=...........................................
# WECHAT_MP_PUSH_FORMAT=json

微信支付环境变量

Env说明
WECHAT_PAY_APP_ID必填应用 AppID(小程序 / 公众号 / APP)
WECHAT_PAY_MCH_ID必填商户号
WECHAT_PAY_API_V3_KEY必填APIv3 密钥(32 字节)
WECHAT_PAY_SERIAL_NO可选商户 API 证书序列号(无证书路径时必填)
WECHAT_PAY_PRIVATE_KEY_PATH可选商户私钥 PEM 路径(或 PRIVATE_KEY 内联)
WECHAT_PAY_PRIVATE_KEY可选商户私钥 PEM 内容
WECHAT_PAY_CERT_PATH可选apiclient_cert.pem,可自动解析序列号与同目录 key
WECHAT_PAY_PLATFORM_SERIAL_NO可选平台证书序列号(验签 / 回调 / 敏感字段加密)
WECHAT_PAY_PLATFORM_PUBLIC_KEY可选平台公钥 PEM(encrypt_sensitive 需要)
WECHAT_PAY_BASE_URL可选默认 https://api.mch.weixin.qq.com
WECHAT_PAY_APP_ID=wx................
WECHAT_PAY_MCH_ID=1........
WECHAT_PAY_API_V3_KEY=................................
WECHAT_PAY_CERT_PATH=/path/to/apiclient_cert.pem
# 敏感字段加密 / 验签建议配置平台证书
# WECHAT_PAY_PLATFORM_SERIAL_NO=........
# WECHAT_PAY_PLATFORM_PUBLIC_KEY=-----BEGIN PUBLIC KEY-----...

快速开始

登录换 openid → 可选消息推送 / 物流 / 支付。

1. 配置环境变量

WECHAT_MP_APP_ID=wx................
WECHAT_MP_APP_SECRET=................
# 可选
# WECHAT_MP_TOKEN_MODE=stable
# WECHAT_MP_BASE_URL=https://api.weixin.qq.com

2. 添加依赖

[dependencies]
wechat-mp-core = "0.1.1"
wechat-mp-auth = "0.1"
# 或聚合包(注意包名)
wechat-miniprogram = "0.1"
wechat-pay = "0.1"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

3. 调用登录接口

use wechat_mp_auth::AuthApi;
use wechat_mp_core::{Config, MpClient};

#[tokio::main]
async fn main() -> wechat_mp_core::Result<()> {
    let client = MpClient::new(Config::from_env()?)?;
    let auth = AuthApi::new(client);
    let session = auth.code2session("wx.login 返回的 code").await?;
    println!("openid={}", session.openid);
    Ok(())
}

更多示例:聚合包、推送、物流、配送、OCR、数据分析、运维、发货、支付

use wechat_miniprogram::{
    AnalyticsApi, AuthApi, Config, DeliveryApi, LogisticsApi, MpClient,
    NotifyConfig, NotifyHandler, OcrApi, OpsApi,
};

#[tokio::main]
async fn main() -> wechat_miniprogram::Result<()> {
    let client = MpClient::new(Config::from_env()?)?;
    let auth = AuthApi::new(client.clone());
    let session = auth.code2session("js_code").await?;

    let _ocr = OcrApi::new(client.clone());
    let _analytics = AnalyticsApi::new(client.clone());
    let _ops = OpsApi::new(client.clone());
    let _logistics = LogisticsApi::new(client.clone());
    let _delivery = DeliveryApi::new(client);
    let _push = NotifyHandler::new(NotifyConfig::from_env()?);
    let _ = session.openid;
    Ok(())
}
use wechat_mp_notify::{IncomingMessage, NotifyConfig, NotifyHandler, NotifyQuery};

fn handle_push(body: &str) -> wechat_mp_notify::Result<()> {
    let handler = NotifyHandler::new(NotifyConfig::from_env()?);
    // GET 验证:handler.verify_url(&query)?
    let query = NotifyQuery {
        timestamp: Some("1714112445".into()),
        nonce: Some("415670741".into()),
        msg_signature: Some("046e02f8...".into()),
        encrypt_type: Some("aes".into()),
        ..Default::default()
    };
    let msg = handler.parse_incoming(&query, body)?;
    if let IncomingMessage::Event(ev) = msg {
        if ev.is_trade_manage() {
            println!("发货管理事件: {} {:?}", ev.event, ev.transaction_id);
        }
    }
    Ok(())
}
use wechat_mp_core::{Config, MpClient};
use wechat_mp_logistics::LogisticsApi;

#[tokio::main]
async fn main() -> wechat_mp_core::Result<()> {
    let api = LogisticsApi::new(MpClient::new(Config::from_env()?)?);
    let deliveries = api.get_all_delivery().await?;
    println!("{} 家快递公司", deliveries.count);
    Ok(())
}
use wechat_mp_core::{Config, MpClient};
use wechat_mp_delivery::{DeliveryApi, GetLocalOrderRequest};

#[tokio::main]
async fn main() -> wechat_mp_core::Result<()> {
    let api = DeliveryApi::new(MpClient::new(Config::from_env()?)?);
    let list = api.get_all_delivery().await?;
    let req = GetLocalOrderRequest::new("shopid", "order_001", "app_secret");
    let order = api.get_order(&req).await?;
    let _ = (list, order);
    Ok(())
}
use wechat_mp_core::{Config, MpClient};
use wechat_mp_ocr::{ImageSource, OcrApi};

#[tokio::main]
async fn main() -> wechat_mp_core::Result<()> {
    let api = OcrApi::new(MpClient::new(Config::from_env()?)?);
    let r = api
        .printed_text(ImageSource::url("https://example.com/a.jpg"))
        .await?;
    println!("{r:?}");
    Ok(())
}
use wechat_mp_analytics::{AnalyticsApi, DateRange};
use wechat_mp_core::{Config, MpClient};

#[tokio::main]
async fn main() -> wechat_mp_core::Result<()> {
    let api = AnalyticsApi::new(MpClient::new(Config::from_env()?)?);
    let day = DateRange::day("20260803");
    let trend = api.daily_visit_trend(&day).await?;
    let pages = api.visit_page(&day).await?;
    let _ = (trend, pages);
    Ok(())
}
use wechat_mp_core::{Config, MpClient};
use wechat_mp_ops::{CallbackCheckRequest, OpsApi};

#[tokio::main]
async fn main() -> wechat_mp_core::Result<()> {
    let api = OpsApi::new(MpClient::new(Config::from_env()?)?);
    let ips = api.get_api_domain_ip().await?;
    let quota = api.get_api_quota("/cgi-bin/message/custom/send").await?;
    let check = api.callback_check(&CallbackCheckRequest::all_default()).await?;
    let _ = (ips, quota, check);
    Ok(())
}
use wechat_mp_core::{Config, MpClient};
use wechat_mp_trade::{
    now_upload_time, OrderKey, ShippingItem, TradeApi, UploadShippingInfoRequest,
};

#[tokio::main]
async fn main() -> wechat_mp_core::Result<()> {
    let trade = TradeApi::new(MpClient::new(Config::from_env()?)?);
    let req = UploadShippingInfoRequest::unified_express(
        OrderKey::by_transaction_id("微信支付单号"),
        ShippingItem::express("运单号", "SF", "商品*1"),
        "用户 openid",
        now_upload_time(),
    );
    trade.upload_shipping_info(&req).await?;
    Ok(())
}
use wechat_pay::{Config, WechatPayClient};

#[tokio::main]
async fn main() -> wechat_pay::Result<()> {
    let _ = dotenvy::dotenv();
    let client = WechatPayClient::new(Config::from_env()?)?;
    let out_trade_no = format!("T{}", chrono::Utc::now().timestamp_millis());
    let params = client
        .jsapi_pay("商品描述", &out_trade_no, 1, "用户 openid", "https://your.domain/wechatpay/notify")
        .await?;
    println!("{params:#?}");
    Ok(())
}
use wechat_pay::{Config, TradeBillType, WechatPayClient};

#[tokio::main]
async fn main() -> wechat_pay::Result<()> {
    let client = WechatPayClient::new(Config::from_env()?)?;
    let bytes = client
        .download_trade_bill("2026-08-01", Some(TradeBillType::All), None)
        .await?;
    std::fs::write("tradebill.csv", bytes).ok();
    Ok(())
}
use wechat_pay::{Config, ProfitSharingOrderRequest, ProfitSharingReceiver, WechatPayClient};

#[tokio::main]
async fn main() -> wechat_pay::Result<()> {
    let client = WechatPayClient::new(Config::from_env()?)?;
    let receiver = ProfitSharingReceiver::merchant("190000xxxx", 1, "分账");
    let req = ProfitSharingOrderRequest {
        appid: Some(client.config().app_id.clone()),
        transaction_id: "4200...".into(),
        out_order_no: "PS001".into(),
        receivers: vec![receiver],
        unfreeze_unsplit: true,
    };
    client.create_profitsharing_order(&req).await?;
    Ok(())
}
use wechat_pay::{NotifyAck, NotifyHandler, NotifyHeaders};

// 支付结果回调(与消息推送 NotifyHandler 不同)
let handler = NotifyHandler::new(client.config());
let headers = NotifyHeaders::new(timestamp, nonce, signature, serial);
let tx = handler.parse_transaction(&headers, body_str)?;
// 退款通知:handler.parse_refund(&headers, body_str)?
// 响应 NotifyAck::success()

架构说明

AuthApi / OcrApi / AnalyticsApi / OpsApi / LogisticsApi / DeliveryApi 等共享 MpClient;消息推送用 NotifyConfig + NotifyHandler;支付用独立 WechatPayClient。

  • MpClient:get_json / post_json / post_bytes、post_query / post_multipart、以及无 token 的 get_json_no_token / post_query_no_token(如 jscode2session、部分清额度)。
  • 两套 Notify:wechat_mp_notify(消息推送)与 wechat_pay(支付结果通知)。
  • 物流助手 ≠ 即时配送:前者快递面单/轨迹,后者同城运力。

小程序 API 说明

按 crate / Facade 列出常用方法与微信路径。

核心 MpClient

wechat-mp-core · 配置与 HTTP 客户端。

方法微信路径说明
Config::new / from_env / with_token_mode构建配置
MpClient::new创建客户端(token 缓存)
access_token / refresh_access_tokenstable_token 或 token获取 / 强制刷新
get_json / post_json / post_bytes带 token 的 JSON GET/POST / 二进制响应
post_query / post_multipart带 query 的 POST / multipart(OCR 文件)
get_json_no_token / post_query_no_token无 token 请求(登录、部分清额度)

登录与用户

wechat-mp-auth · AuthApi · 登录凭证、会话、手机号等。

方法微信路径说明
code2sessionGET /sns/jscode2sessioncode 换 openid / session_key
check_sessionGET /wxa/checksession校验 session_key
reset_sessionGET /wxa/resetusersessionkey重置 session_key
get_phone_numberPOST /wxa/business/getuserphonenumber获取手机号
get_plugin_openpidPOST /wxa/getpluginopenpid插件用户标识
check_encrypted_msgPOST /wxa/business/checkencryptedmsg检查加密信息
get_paid_unionidGET /wxa/getpaidunionid支付后 unionid
get_user_encrypt_keyGET /wxa/business/getuserencryptkey用户加密 key

小程序码与链接

wechat-mp-qrcode · QrcodeApi · 小程序码图片与跳转链接。

方法微信路径说明
get_qrcodePOST /wxa/getwxacode有限小程序码
get_unlimited_qrcodePOST /wxa/getwxacodeunlimit无限小程序码
create_qrcodePOST /cgi-bin/wxaapp/createwxaqrcode旧版二维码
generate_schemePOST /wxa/generateschemeURL Scheme
generate_url_linkPOST /wxa/generate_urllinkURL Link
generate_short_linkPOST /wxa/genwxashortlinkShort Link

消息

wechat-mp-message · MessageApi · 订阅消息与客服消息。

方法微信路径说明
send_subscribePOST /cgi-bin/message/subscribe/send发送订阅消息
get_template_listGET /wxaapi/newtmpl/gettemplate模板列表
add_template / delete_templatenewtmpl/add|del添加 / 删除模板
send_customer_messagePOST /cgi-bin/message/custom/send客服消息

内容安全

wechat-mp-security · SecurityApi · 文本 / 媒体安全与风险等级。

方法微信路径说明
msg_sec_checkPOST /wxa/msg_sec_check文本安全(v2)
media_check_asyncPOST /wxa/media_check_async媒体异步检测
get_user_risk_rankPOST /wxa/getuserriskrank用户风险等级

发货与交易管理

wechat-mp-trade · TradeApi · 发货信息录入与交易管理。

方法微信路径说明
upload_shipping_info…/upload_shipping_info录入发货信息
upload_combined_shipping_info…/upload_combined_shipping_info合单发货
get_order / get_order_list…/get_order(_list)查询订单
notify_confirm_receive…/notify_confirm_receive确认收货提醒
set_msg_jump_path…/set_msg_jump_path消息跳转路径
is_trade_managed…/is_trade_managed是否已开通交易管理
is_trade_management_confirmation_completed…/is_trade_management_confirmation_completed开通确认是否完成
op_special_order…/opspecialorder特殊发货报备

消息推送

wechat-mp-notify · NotifyHandler · URL 验证、签名、AES、事件解析(含发货管理事件)。

方法微信路径说明
verify_urlGET 接入返回 echostr
parse_incomingPOST 推送明文/安全模式解析
decrypt_body / encrypt_replyAES加解密
IncomingMessage / EventMessage::is_trade_manage文本/图片/发货管理事件

物流助手

wechat-mp-logistics · LogisticsApi · 商家侧快递账号、下单、轨迹、面单。

方法微信路径说明
bind_account / get_all_accountaccount/bind|getall绑定 / 账号列表
get_all_deliverydelivery/getall快递公司列表
add_order / cancel_order / get_order / batch_get_orderorder/*下单 / 取消 / 查单
get_pathpath/get物流轨迹
get_quotaquota/get面单余额
update_printer / get_all_printerprinter/*打印员
test_update_ordertest_update_order测试更新状态

即时配送

wechat-mp-delivery · DeliveryApi · 同城运力预下单、下单、取消、小费、沙盒。

方法微信路径说明
delivery_signSHA1(shopid+order+secret)
get_all_delivery / get_shop / add_shop / open_delivery运力与门店运力与门店
pre_add_order / add_order / readd_order / get_order下单链路预下单 / 下单 / 查单
precancel_order / cancel_order / add_tips / confirm_return履约取消 / 小费 / 退回
test_update_order / realmock_update_order沙盒沙盒模拟状态

图像处理与 OCR

wechat-mp-ocr · OcrApi · 印刷体/证照识别、智能裁剪、二维码。图片可用 URL 或本地文件(multipart,小于 2MB)。

方法微信路径说明
printed_textPOST /cv/ocr/comm通用印刷体
id_card / bank_cardPOST /cv/ocr/idcard|bankcard身份证 / 银行卡
driving / driving_license / biz_licensePOST /cv/ocr/driving*行驶证 / 驾驶证 / 营业执照
ai_crop(img, ratios?)POST /cv/img/aicrop智能裁剪
scan_qrcodePOST /cv/img/qrcode二维码 / 条码识别
ImageSource::url | ::file图片输入方式

数据分析

wechat-mp-analytics · AnalyticsApi · 留存、访问趋势、概况、页面、画像、分布、性能。日期用 DateRange(yyyymmdd)。

方法微信路径说明
daily_retain / weekly_retain / monthly_retain…/*retaininfo日 / 周 / 月留存
daily_visit_trend / weekly_visit_trend / monthly_visit_trend…/*visittrend访问趋势
daily_summary…/dailysummarytrend数据概况
visit_page…/visitpage访问页面 top
user_portrait…/userportrait用户画像
visit_distribution…/visitdistribution访问分布
performance_bootPOST /wxa/business/performance/boot启动/运行性能

openApi 运维

wechat-mp-ops · OpsApi · API/推送 IP、网络检测、额度查询与重置、rid 详情。

方法微信路径说明
get_api_domain_ip / get_callback_ipGET …/get_api_domain_ip|getcallbackipAPI / 推送服务器 IP
callback_checkPOST /cgi-bin/callback/check网络通信检测
get_api_quotaPOST /cgi-bin/openapi/quota/get查询接口额度
clear_quota / clear_quota_self / clear_api_quotaclear_quota*重置额度
clear_quota_by_secret(_self)POST /cgi-bin/clear_quota/v2AppSecret 兜底清额度
get_rid_infoPOST /cgi-bin/openapi/rid/get查询报错 rid(近 7 天)

微信支付 API v3

直连商户。自动 WECHATPAY2-SHA256-RSA2048 签名。支持 JSAPI / Native / APP / H5、退款、账单、分账、商家转账到零钱与支付结果通知。

方法说明
jsapi_pay / jsapi_prepayJSAPI / 小程序下单并生成调起参数
native_pay / native_prepayNative 扫码支付
app_prepay / h5_prepayAPP / H5 预下单
query_by_transaction_id / out_trade_no / close_order查单 / 关单
refund / query_refund退款与查退款
download_trade_bill / download_fundflow_bill / profitsharing_bill交易 / 资金 / 分账账单
create_profitsharing_order / query_* / unfreeze_* / create_profitsharing_return分账请求 / 查询 / 解冻 / 回退
add_profitsharing_receiver / delete_* / query_profitsharing_amounts分账接收方与待分金额
create_transfer_batch / query_transfer_batch_by_* / transfer_to_balance商家转账到零钱
encrypt_sensitive敏感字段 RSA-OAEP 加密
download_certificates / latest_platform_public_key下载平台证书 / 取最新平台公钥
NotifyHandler::parse_transaction / parse_refund支付 / 退款回调解密验签
use wechat_pay::{Config, WechatPayClient};

#[tokio::main]
async fn main() -> wechat_pay::Result<()> {
    let _ = dotenvy::dotenv();
    let client = WechatPayClient::new(Config::from_env()?)?;
    let out_trade_no = format!("T{}", chrono::Utc::now().timestamp_millis());
    let params = client
        .jsapi_pay("商品描述", &out_trade_no, 1, "用户 openid", "https://your.domain/wechatpay/notify")
        .await?;
    println!("{params:#?}");
    Ok(())
}
use wechat_pay::{Config, TradeBillType, WechatPayClient};

#[tokio::main]
async fn main() -> wechat_pay::Result<()> {
    let client = WechatPayClient::new(Config::from_env()?)?;
    let bytes = client
        .download_trade_bill("2026-08-01", Some(TradeBillType::All), None)
        .await?;
    std::fs::write("tradebill.csv", bytes).ok();
    Ok(())
}
use wechat_pay::{Config, ProfitSharingOrderRequest, ProfitSharingReceiver, WechatPayClient};

#[tokio::main]
async fn main() -> wechat_pay::Result<()> {
    let client = WechatPayClient::new(Config::from_env()?)?;
    let receiver = ProfitSharingReceiver::merchant("190000xxxx", 1, "分账");
    let req = ProfitSharingOrderRequest {
        appid: Some(client.config().app_id.clone()),
        transaction_id: "4200...".into(),
        out_order_no: "PS001".into(),
        receivers: vec![receiver],
        unfreeze_unsplit: true,
    };
    client.create_profitsharing_order(&req).await?;
    Ok(())
}
// client.transfer_to_balance("BATCH001", "DETAIL001", "openid", 100, "佣金", None).await?;
use wechat_pay::{NotifyAck, NotifyHandler, NotifyHeaders};

// 支付结果回调(与消息推送 NotifyHandler 不同)
let handler = NotifyHandler::new(client.config());
let headers = NotifyHeaders::new(timestamp, nonce, signature, serial);
let tx = handler.parse_transaction(&headers, body_str)?;
// 退款通知:handler.parse_refund(&headers, body_str)?
// 响应 NotifyAck::success()

运行仓库示例

克隆仓库后配置 .env,再执行仓库内 example(推送 / 物流 / 配送 / OCR / 数据 / 运维也可参考下方代码片段):

# 小程序登录
cargo run -p wechat-mp-auth --example code2session

# 发货信息上传
cargo run -p wechat-mp-trade --example upload_shipping

# JSAPI 下单
cargo run -p wechat-pay --example jsapi_pay

更新日志

对照 GitHub 仓库与 crates.io 发布记录(节选)。

2026-08-04

  • crates.io:wechat-mp-core 升至 0.1.1;补发 notify / logistics / delivery / ocr / analytics / ops、聚合包 wechat-miniprogram、wechat-pay。
  • 新增 wechat-mp-ops(openApi 运维)、analytics(数据分析)、ocr(图像识别)、delivery(即时配送)、logistics(物流助手)、notify(消息推送)。
  • wechat-pay 增强:账单下载、分账、商家转账到零钱、敏感字段加密。
  • 聚合包因名称冲突以 wechat-miniprogram 发布;repository 指向 github.com/EhuaDB/wechat-sdk-rust。

范围与限制

  • 聚焦小程序服务端 + 支付直连商户;不含公众号 OAuth/完整客服体系、企业微信、服务商模式。
  • 消息推送覆盖小程序服务器推送验签/解密,不是公众号自定义菜单全套。
  • 物流助手与即时配送是两套业务,勿混用接口。
  • 聚合包依赖键名必须是 wechat-miniprogram。
  • 未声明 MSRV;建议较新的稳定版 Rust。字段以微信官方文档为准。