ZhileTime.Yop
2.2.6
dotnet add package ZhileTime.Yop --version 2.2.6
NuGet\Install-Package ZhileTime.Yop -Version 2.2.6
<PackageReference Include="ZhileTime.Yop" Version="2.2.6" />
<PackageVersion Include="ZhileTime.Yop" Version="2.2.6" />
<PackageReference Include="ZhileTime.Yop" />
paket add ZhileTime.Yop --version 2.2.6
#r "nuget: ZhileTime.Yop, 2.2.6"
#:package ZhileTime.Yop@2.2.6
#addin nuget:?package=ZhileTime.Yop&version=2.2.6
#tool nuget:?package=ZhileTime.Yop&version=2.2.6
ZhileTime.Yop
面向易宝开放平台 YOP 的现代 .NET SDK。当前 2.2 版本按官方 yop-auth-v3、.NET SDK v4.0.1、Java SDK v4.4.15 和 PKCS8 密钥规范实现,并进一步收敛密钥资源生命周期与路径安全边界。
NuGet · 原件报告 · 发布计划 · 云原生构建 · 变更记录
核心能力
- 支持
GET、POST Form、POST JSON和 YOS 流式上传/下载。 - 提供 7 个领域 API 门面和 52 条当前官方路由,全部使用强类型请求与响应。
- 不保留已退出当前官方目录的历史领域方法;官方新增或自定义端点统一通过
IYopClient扩展。 - 支持
AppKey与CustomerNo两种 RSA2048 身份、请求级凭证和超时。 - 默认验证成功响应签名,并将非 2xx 响应映射为结构化异常。
- 提供 Webhook 表单解析、RSA/AES 数字信封解密和易宝平台验签。
- 集成
HttpClientFactory、连接池、有界响应读取、CRC64-ECMA 下载校验和ActivitySource诊断。
支持 net8.0 和 net10.0,两个目标框架均执行完整自动化测试。
安装
当前源码版本:2.2.6。公开可用状态以 NuGet 和发布报告为准。
dotnet add package ZhileTime.Yop --version 2.2.6
| NuGet 包 | 目标框架 |
|---|---|
| ZhileTime.Yop | net8.0 / net10.0 |
配置与注册
{
"Yop": {
"ServerRoot": "https://openapi.yeepay.com/yop-center",
"YosServerRoot": "https://yos.yeepay.com/yop-center",
"AppKey": "app_xxx",
"PrivateKey": "-----BEGIN PRIVATE KEY-----...",
"YopPublicKey": "-----BEGIN PUBLIC KEY-----...",
"ConnectTimeoutMilliseconds": 10000,
"RequestTimeoutMilliseconds": 30000,
"MaxConnectionsPerServer": 100,
"PooledConnectionLifetimeSeconds": 300,
"MaxResponseBodyBytes": 4194304,
"RequireResponseSignature": true
}
}
全局默认凭证使用 AppKey 或 CustomerNo,两者必须且只能配置一个。PrivateKey 必须是 RSA2048 PKCS8 私钥,YopPublicKey 是易宝 RSA2048 公钥。多租户系统如果每次调用都通过 YopRequestOptions 或 YopRequest 提供请求级凭证,可以不配置这四个默认凭证字段。生产密钥应由密钥管理服务或部署平台 Secret 注入,不得写入代码、日志或前端配置。
using Microsoft.Extensions.DependencyInjection;
services.AddYop(configuration);
AddYop 返回 IHttpClientBuilder,便于接入方添加日志、遥测或自定义消息处理器。SDK 不默认重试支付写请求;只有业务确认幂等契约后才能增加有界策略。
发起强类型调用
using ZhileTime.Yop.Apis;
using ZhileTime.Yop.Models;
using ZhileTime.Yop.Models.Trade;
public sealed class OrderQueryService(IYopTradeApi tradeApi)
{
public async Task<YopTradeQueryOrderResponse> QueryAsync(
string merchantNo,
string orderId,
CancellationToken cancellationToken)
{
var request = new YopTradeQueryOrderRequest(merchantNo, orderId)
{
ParentMerchantNo = merchantNo,
};
YopApiResult<YopTradeQueryOrderResponse> result =
await tradeApi.QueryOrderAsync(request, cancellationToken: cancellationToken);
if (!result.IsBusinessSuccess)
{
throw new InvalidOperationException(
$"查询失败:{result.Code} {result.Message}; RequestId={result.RequestId}");
}
return result.Data;
}
}
HTTP 成功不等于业务成功。YopApiResult<T> 同时保留强类型数据、业务码、Request ID、HTTP 状态和响应验签状态。
官方新增端点和自定义端点通过 IYopClient 原始入口调用:
var request = yopClient.CreateRequest(builder =>
{
builder.AddParameter("merchantNo", merchantNo);
builder.AddParameter("orderId", orderId);
});
YopResponse response = await yopClient.GetAsync(
"/rest/v1.0/custom/query",
request,
cancellationToken);
当前 52 条现行接口不提供重复的原始重载,业务代码应优先使用领域门面。
文件流
using ZhileTime.Yop.Models;
using ZhileTime.Yop.Models.Merchant;
var uploadRequest = new YopMerchantUploadQualificationRequest
{
MerQual = new YopUploadFile(filePath, "qualification.jpg", "image/jpeg"),
};
YopApiResult<YopMerchantUploadQualificationResponse> uploadResult =
await merchantApi.UploadQualificationAsync(
uploadRequest,
cancellationToken: cancellationToken);
下载响应持有底层 HTTP 连接,必须释放。CopyToAndVerifyAsync 会在单次流式复制中校验 CRC64-ECMA:
using ZhileTime.Yop.Models.Billing;
var billRequest = new YopBillingDownloadTradeDayBillRequest(
merchantNo,
new DateOnly(2026, 8, 20));
await using var download = await billingApi.DownloadTradeDayBillAsync(
billRequest,
cancellationToken: cancellationToken);
await using var target = File.Create(temporaryPath);
await download.CopyToAndVerifyAsync(target, cancellationToken);
服务端文件名属于不可信输入。业务系统应写入临时文件,完成校验后再在受控目录内原子替换。
Webhook
using ZhileTime.Yop.Client;
using ZhileTime.Yop.Webhooks;
public sealed class WebhookService(IYopWebhookDecoder decoder)
{
public string DecodeAndVerify(string rawFormBody, YopCredentials credentials)
{
YopWebhookEnvelope envelope = decoder.ParseEnvelope(rawFormBody);
// 未验真标识只能用于选择候选凭证,不能据此更新业务状态。
YopVerifiedWebhook webhook = decoder.DecodeAndVerify(envelope, credentials);
return webhook.Payload;
}
}
Payload 仅表示已完成数字信封解密和易宝平台验签。业务系统仍需校验商户、订单、金额和幂等性,并在事务落库后才能返回成功确认。
文档
构建状态与报告
上方徽标动态显示最近一次原件报告状态,可能来自主干或 MR;请进入云原生构建页按分支和源码提交核对。构建通过不代表包已发布;正式发布以整批包内容核验通过及对应 Release 为准。
| 内容 | 查看入口 | 自动化行为 |
|---|---|---|
| 构建与测试 | 原件报告 → 选择构建 → 测试报告 | 每次执行生成 JUnit,展示通过、失败和跳过项 |
| 通用报告 | 原件报告 → 选择构建 → 通用报告 | 汇总版本、源码提交、测试、步骤耗时、工具链和缓存信息 |
| 原始证据 | 同一构建的构建产物 | 保存 TRX、日志、JSON/Markdown 报告及带 SHA256 的包原件 |
| 正式发布 | 发布计划 · Releases | 核验 NuGet 公开内容后创建版本页及说明,并回读确认 |
| 版本变更 | CHANGELOG | 候选流程从提交历史生成当前版本草稿,经 MR 评审后复用于 NuGet 和 Release 说明 |
详细报告需要 CODING 项目访问权限。CI 同时采集行与分支覆盖率,按模块和运行时生成独立 HTML 明细、JSON 和 SVG 徽标。进入同一构建的“通用报告 → 代码覆盖率”查看;徽标绑定该次构建,不把历史值冒充当前主干状态。详见覆盖率说明。云原生执行 MR、主干和定时构建,既有 CI 接收同一原件并展示报告;独立 CD 提升已验证包。详见云原生交付与恢复。
构建、验证与发布
使用 global.json 指定的 SDK、.NET 8 运行时、PowerShell 7、Python 3 和固定版本 Gitleaks;CODING 镜像统一提供运行环境。
python build/ci_report.py docs-update
pwsh -NoProfile -File build/ci.ps1
统一入口执行脚本回归、文档/API 门禁、密钥与依赖审计、双框架测试、打包及内容核验。Windows 与 Hope 共用开发机时,通过 Hope 构建协调入口调用并声明实际产物根。
CI 发布分框架的 JUnit、HTML 通用报告、JSON/Markdown 摘要和原始制品归档。候选流程按提交历史计算语义版本,更新 common.props、CHANGELOG 和 README 包表,并自动创建 MR,由维护者评审合并。普通 CI 检查文档漂移,从已评审的 CHANGELOG 生成 NuGet Release Notes;CD 在公开内容核验后生成 CODING Release 及说明。
独立 CD 只发布主干上的稳定标签,默认只校验,正式推送需审批。包可下载且与原件逐文件一致后才记为 Available;部分发布必须恢复原构建归档,不能重新打包同版本。MR 合并后由 CODING 原生设置删除源分支。
- CODING 构建与 NuGet 发布:报告、审批、恢复与平台配置。
- CI/CD 对照审查:对照 Hope 的能力与证据边界。
- 测试与发布:协议测试、性能基准、官方目录漂移与接入方验收。
许可证与问题反馈
本项目采用 MIT。请通过 CODING 仓库 提交问题;报告中只提供脱敏 Request ID、版本和复现步骤,勿包含私钥、签名原文或商户业务数据。
发布维护
发布采用候选 MR、主干 CI 原件、注解标签、人工推包审批和公开内容核验;版本页在整批包可用后自动创建并回读。CD 不重新打包,恢复使用同一原件。新流程的平台启用和验收状态见发布手册。
自动版本按 fix/perf、feat、破坏性变更分别提升 patch、minor、major;纯文档或测试变更不触发发版。无法分类的产品变更进入 NeedsReview,需要维护者明确版本与理由。已发布的标签、包和 Release 说明出现冲突时停止,不静默覆盖。
维护者可参考自动版本与发布维护,了解版本规划、API 兼容性基线、延迟收尾及定期复验。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Http (>= 10.0.11)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.11)
-
net8.0
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Http (>= 10.0.11)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.11)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on ZhileTime.Yop:
| Package | Downloads |
|---|---|
|
ZhileTime.Hope.PaymentManagement.Application
HOPE modular application framework package: ZhileTime.Hope.PaymentManagement.Application. |
GitHub repositories
This package is not used by any popular GitHub repositories.
### 版本与迁移评审
经用户批准发布工程维护版本:完善云原生构建、平台配置对账、覆盖率基线、原件恢复与诊断归档,产品 API 无破坏性变更。