程序员茄子
全部
编程
代码
资讯
案例
综合
联系我们
软件定制开发/软件按需定制 技术文章
php
mysql
shell
go
vue
css
api接口对接
支付接口对接
iOS 订阅掉单:App Store 服务器通知 V2 的验签、两套环境和 EXPIRED 误判
代码
iOS 订阅掉单:App Store 服务器通知 V2 的验签、两套环境和 EXPIRED 误判
2026-10-30 09:01:32
iOS 内购订阅老掉单,多半不是 Apple 的锅:Production 与 Sandbox 两套通知 URL 各填各的、App Store Connect 里没有测试按钮、没有投递日志;JWS 的 x5c 三张证书必须锚定 Apple Root CA - G3,ES256 签名是 64 字节 raw R||S 而非 DER;EXPIRED 与 DID_CHANGE_RENEWAL_STATUS 被当成「立刻停权益」是最贵的一类误判。文内给了 openssl 手动验签步骤、status 1–5 的含义和每天扫 expiresDate 的兜底对账。
iOS内购
App
Store
Server
Notifications
JWS验签
订阅掉单
支付回调
SSR 串号不一定是缓存:模块顶层 ref 加 app.provide,会让 Nuxt 的每个请求共用同一份状态
编程
SSR 串号不一定是缓存:模块顶层 ref 加 app.provide,会让 Nuxt 的每个请求共用同一份状态
2026-10-30 00:06:00
SSR 里出现「A 用户看到 B 的数据」、刷新后状态残留、RSS 随请求上涨,常见成因是把 ref/reactive 写在模块顶层再 app.provide 出去:Node 是常驻进程,模块只求值一次,provide 的却是同一个引用。给出症状分型、grep 排查命令、useState 带 key 的正确写法、await 后 Nuxt instance is unavailable 的边界,以及跨请求缓存该用 Nitro storage / cachedFunction 而不是共享 ref。
inject
provide
Nuxt
SSR
useState
Vue3
状态管理
provide 了还报 injection "x" not found:inject 的六个失效点按概率排
编程
provide 了还报 injection "x" not found:inject 的六个失效点按概率排
2026-10-30 00:04:55
inject 拿不到值、拿到不更新、类型是 unknown,多数不是响应式坏了,而是提供方式或调用位置不对。按概率排一遍排查顺序:无祖先 provider 与默认值写法、reactive(ref) 与 .value 断链、inject 从 @vue/runtime-core 导入、setup 外异步调用、Symbol key 与 InjectionKey、测试里 global.provide,并给出 provide/inject 与 Pinia 的取舍标准。
inject
provide
Vue3
依赖注入
InjectionKey
hasInjectionContext
前端
HKDF 的 salt 不是上下文:Borg 把 sessionid 塞错参数,长度也隔不开两把钥匙
编程
HKDF 的 salt 不是上下文:Borg 把 sessionid 塞错参数,长度也隔不开两把钥匙
2026-10-30 00:04:16
从 RFC 5869 里 salt 与 info 的角色分工讲起:borg #7953 把 sessionid 放进 salt 而不在证明范围内,HMAC 零填充让 salt "abc" 与 "abc\x00" 等价,长度不构成隔离(16 字节是 32 字节的前缀),以及 Go 1.24 crypto/hkdf 迁移时 info 变 string、x/crypto 的 io.Reader 换 Key 的具体差异,附 RFC 测试向量与 PHP / openssl kdf 的参数顺序坑。
HKDF
密钥派生
RFC5869
Gohkdf
加密
Idempotency-Key 的值不是存储主键:把键做成元组,三类跨租户事故就消失了
编程
Idempotency-Key 的值不是存储主键:把键做成元组,三类跨租户事故就消失了
2026-10-30 00:03:55
Idempotency-Key 落库时不能直接当主键:跨租户回放、支付与退款互撞、服务端自铸键被伪造值污染,三类事故都出在作用域。按 IETF draft-08 的边界,把存储键做成 (tenant, principal, route, namespace, key) 元组,讲清分隔符注入、fail-closed、分片路由与 v1 版本前缀的处理方式。
Idempotency-Key
幂等键
接口幂等
多租户
HTTP
API
Go
MF2 各实现版本不一致:ICU4J 升到 draft、ICU4C 停在 CLDR 47、JS 包 4.1 已到 48.2
案例
MF2 各实现版本不一致:ICU4J 升到 draft、ICU4C 停在 CLDR 47、JS 包 4.1 已到 48.2
2026-10-30 00:03:47
MF2 规范 Stable 不等于四个实现一致:ICU4J 在 ICU 78 升到 draft 且对齐 CLDR 48,ICU4C 仍停在 CLDR 47,ICU4X 才刚落地初始实现,JS 包 messageformat 4.1 对齐 LDML 48.2/49。给出实现版本矩阵、可跑的 JS 接入代码、语法/数据模型/运行期三层错误分型与接入检查清单。
MF2
MessageFormat
ICU
ICU4J
ICU4C
ICU4X
i18n
国际化
CLDR
JavaScript
本地化
稳定性
CLOSED ≠ MERGED:GitHub 关闭语义里两处会静默失效的地方
编程
CLOSED ≠ MERGED:GitHub 关闭语义里两处会静默失效的地方
2026-10-30 00:03:34
GitHub 把 PR 的 CLOSED 和 MERGED 分成两个互斥终态,但 REST 的 state=closed 会把已合并的 PR 一并返回;PR 描述里的 closing keywords 又只在目标分支是默认分支时才解析。本文给出两处的判断字段、统计口径偏差,以及直接可跑的 curl / GraphQL 查询。
CLOSED
GitHub
API
PullRequestState
state_reason
Issues
Element-Plus-X:给 Vue 3 + Element Plus 补一套 AI 聊天组件,以及 useXStream 的 SSE 解析细节
代码
Element-Plus-X:给 Vue 3 + Element Plus 补一套 AI 聊天组件,以及 useXStream 的 SSE 解析细节
2026-10-29 21:31:45
Element-Plus-X 是基于 Vue 3 + Element Plus 的 AI 组件库,提供 BubbleList、XSender、ThoughtChain 等对话组件,以及 useXStream 流式请求 hook。本文按组件清单、安装方式、useXStream 的 startStream/cancel/data 签名与 SSE 默认解析规则(\n\n 分条、data: 前缀、[DONE] 兜底)梳理接入要点,并记录协议支持与 CDN 引入两条已知边界。
Vue
3
Element
Plus
AI
组件
SSE
流式请求
Vue 3 纯前端 PDF 工具站上线:8 个坑,从 80MB 白屏到只收录首页
案例
Vue 3 纯前端 PDF 工具站上线:8 个坑,从 80MB 白屏到只收录首页
2026-10-29 21:31:13
一个纯浏览器端 Vue 3 PDF 工具站的上线复盘:pdf-lib 处理 80MB 文件白屏、Web Worker 结构化克隆比主线程还慢、批量进度条在 ZIP 阶段撒谎,以及 Playwright 预渲染后 canonical 仍指向首页、Cloudflare Pages 308 导致 Googlebot 报错的排查过程,附可直接复用的代码。
Vue
3
pdf-lib
Web
Worker
预渲染
SEO
Go 1.28 提案:freegc、M-local storage、SIMD 与 Wasm 栈切换的进度
编程
Go 1.28 提案:freegc、M-local storage、SIMD 与 Wasm 栈切换的进度
2026-10-29 21:10:19
Go 1.28 的提案清单里,影响运行时的是编译器插入 runtime.free 的 freegc 实验(默认 16 字节阈值)和 sync 的 M-local 分片计数;另有 SIMD 的 archsimd 与可移植 simd 包进度、Wasm 栈切换只有约 20% 原生性能的现状。全部仍是提案。
Go
运行时
性能
Kubernetes 1.35 升级前要处理的四件事:cgroup v1 会让 kubelet 直接起不来
综合
Kubernetes 1.35 升级前要处理的四件事:cgroup v1 会让 kubelet 直接起不来
2026-10-29 21:09:16
Kubernetes 1.35 把 cgroup v1 支持删了,老发行版节点上 kubelet 直接起不来;ipvs 模式弃用改打警告,1.35 也是最后一个支持 containerd v1.x 的版本。附节点侧检查命令与 containerd 2.0 迁移路径。
Kubernetes
运维
升级
Redis 8.4.6 安全修复:ACL 键校验绕过与恶意 RDB 的 RCE 路径
综合
Redis 8.4.6 安全修复:ACL 键校验绕过与恶意 RDB 的 RCE 路径
2026-10-29 21:08:15
Redis 8.4.6 是安全更新:ACL 对 SORT/GEORADIUS/XREAD 的键校验可能与实际访问的键不一致(#15478),EVAL 参数个数错误时 argv 越界(#14847),恶意 RDB 里的 SLOT_INFO 可致内存破坏直至 RCE。附多租户加固清单与升级检查顺序。
Redis
安全
运维
PostgreSQL 18.6 的 output_plugin_libraries 白名单:第三方逻辑解码插件被挡掉,pg_upgrade --check 会先失败
综合
PostgreSQL 18.6 的 output_plugin_libraries 白名单:第三方逻辑解码插件被挡掉,pg_upgrade --check 会先失败
2026-10-29 21:05:49
18.6 引入 output_plugin_libraries 白名单(CVE-2026-6471),默认只放行 pgoutput 与 test_decoding,wal2json、postgres-decoderbufs 等要显式加;pg_upgrade --check 在 17+ 迁移前会先失败。附查 slot 插件、ALTER SYSTEM 与 reload 的顺序。
PostgreSQL
数据库
运维
Laravel 12 → 13 升级:几处不报错却会出事的改动
编程
Laravel 12 → 13 升级:几处不报错却会出事的改动
2026-10-29 21:03:38
Laravel 13 官方说破坏性变更很少,但 CSRF 中间件改名后测试里的 withoutMiddleware 会静默失效,cache 的 serializable_classes 默认 false 让存对象的缓存读不出,session serialization 改 json 会让所有在线会话失效。逐条给取舍和升级检查顺序。
PHP
Laravel
升级
PHP 8.6 批量弃用:31 项通过、4 项被否,先 grep 那几个保留标识符
编程
PHP 8.6 批量弃用:31 项通过、4 项被否,先 grep 那几个保留标识符
2026-10-29 21:02:35
PHP 8.6 的 35 张弃用选票投完:31 项通过、4 项被否。is/let/readonly/namespace 成为新保留标识符(Hamcrest 的 is() 也在其中),finally 里 return、SplFileObject CSV 方法、mysqli_get_charset 等在列;文末给出按类别拆开的 grep 排查命令。
PHP
升级
兼容性
Go 1.28 HTTP/2 parking 实测:5000 个空闲连接少 5000 个 goroutine,RSS 降 85–93 MiB
编程
Go 1.28 HTTP/2 parking 实测:5000 个空闲连接少 5000 个 goroutine,RSS 降 85–93 MiB
2026-10-29 21:01:45
Go 1.28 给 HTTP/2 server 加了 serveLoop parking:没活干的连接不再独占 goroutine。用同一份 1.28 二进制开关 parking 对照,5000 个空闲连接下少 5000 个 goroutine、少约 78 MiB 栈、RSS 降 85–93 MiB;文中给出完整 benchmark 参数与作者自己标明的局限。
Go
HTTP
2
性能优化
内存
Vite 8 升级核对清单:CJS default 导入和 browser/module 嗅探会先坏
编程
Vite 8 升级核对清单:CJS default 导入和 browser/module 嗅探会先坏
2026-10-29 20:04:53
Vite 8 用 Rolldown + Oxc 取代 esbuild + Rollup,升级真正花时间的是语义变化:CJS 的 default 导入统一成一套规则(以前 dev 和 build 判断条件不同)、browser/module 字段的内容嗅探被移除、manualChunks 对象形式与 watch.chokidar 失效。按「哪类项目会先坏」列出核对项,含配置改名映射、没有等价物的 esbuild 选项、build() 抛 BundleError 等,以及先用 rolldown-vite 隔离问题的迁移路径。
Vite
Rolldown
前端构建
升级迁移
Vue
PHP 8.6 改了 session 三个默认值:跨站 POST 的登录和支付回跳会先挂
编程
PHP 8.6 改了 session 三个默认值:跨站 POST 的登录和支付回跳会先挂
2026-10-29 20:01:15
PHP 8.6 把 session.use_strict_mode、cookie_httponly、cookie_samesite 三个默认值一次全改,调用点没有任何提示:自定义 save handler 丢 id、前端 JS 读不到 session cookie、跨站 POST(支付回跳、OAuth 回调)收不到 cookie。附 8.5/8.6 ini 对照、显式写回 SameSite=None + cookie_secure 的迁移写法,以及 DOM 属性反射、array_intersect 转换顺序、SplFileObject CSV escape 三处静默变化。实测基线 8.6.0RC3,GA 计划 2026-11-19。
PHP
session
安全默认值
升级迁移
支付接口
抖音支付回调验签一直 false:Byte-* 头和 Douyinpay-* 头是两套体系
代码
抖音支付回调验签一直 false:Byte-* 头和 Douyinpay-* 头是两套体系
2026-10-29 09:03:14
抖音的回调有两套验签体系:小程序开放平台交易系统用 Byte-Timestamp/Byte-Nonce-Str/Byte-Signature,抖音支付用 Douyinpay-* 且要按证书序列号匹配。本文给出两套对照表、三行待验签串与 openssl 手工验证、官方 Java 示例里 replaceAll 吃掉空格的坑、msg 二次 JSON.parse、应答与重试语义、回调地址配置规则,以及代理吃掉扩展头的排查。
抖音支付
回调验签
接口对接
排障
支付渠道
微信虚拟支付报 -15005/-15006:先分清 signature 和 paySig,再查 signData 序列化
代码
微信虚拟支付报 -15005/-15006:先分清 signature 和 paySig,再查 signData 序列化
2026-10-29 09:01:23
小程序调 wx.requestVirtualPayment 返回 -15005 SIGNATURE_INVALID 或 -15006 PAY_SIG_INVALID 时,很多人对着同一份签名反复改算法。本文拆开两份签名的密钥与待签字符串,给出 session_key 刷新、AppKey 与 env 配对、json_encode 转义与前端二次 stringify 导致字符串不一致的排查路径,附 Node/PHP 实现与参数层错误码速查。
微信支付
小程序
虚拟支付
签名排障
接口对接
Pelican 4.12 升级前要核对的事:Python 3.11 成硬门槛,Pygments 上界放到 2.20
编程
Pelican 4.12 升级前要核对的事:Python 3.11 成硬门槛,Pygments 上界放到 2.20
2026-10-29 00:04:41
Pelican 4.12.0 升级核对清单:requires-python 提到 3.11、Docutils 0.22+、Pygments 上界从 2.19 放宽到 2.20;FEED_DOMAIN 回退 SITEURL、category/tag feed 标题改用 slug、摘要不再带 TOC、IGNORE_FILES 默认递归忽略隐藏文件、SOURCE_DATE_EPOCH 决定年份等会在 CI diff 里冒出来的行为变更。
Pelican
静态站点生成器
Python
Markdown
依赖管理
加密字段要支持子串搜索:trigram 盲索引能救 LIKE,但两个汉字搜不到
编程
加密字段要支持子串搜索:trigram 盲索引能救 LIKE,但两个汉字搜不到
2026-10-29 00:04:28
加密字段上 LIKE '%kw%' 查不了,整值 HMAC 盲索引只解决等值。这篇把子串检索这一层拆开:trigram 写窗口 + HMAC-SHA256 截断 128 位存 token 表、域分离前缀、Exact/Prefix(n)/Ngram(n) 三种形态的取舍、"'abcd' 与 'cdef' 共享 'bcd'" 这类假阳性为什么在密文侧消不掉、短于 3 字符直接跳过索引、异步重建带来的几分钟滞后、多 key 轮换时的双算,以及中文场景 n=3 失效要换 bigram 的代价。
盲索引
加密字段
可搜索加密
HMAC
trigram
MySQL
PHP
Go
advisory lock 的两套键空间和 40P01:bigint 与 (int4,int4) 不互通,死锁要从 pg_locks 反查
编程
advisory lock 的两套键空间和 40P01:bigint 与 (int4,int4) 不互通,死锁要从 pg_locks 反查
2026-10-29 00:03:51
PostgreSQL 咨询锁的 bigint 与 (int4,int4) 两套键空间并不互通,混用等于两把锁;给出 pg_locks 里 classid/objid 按无符号反解 key 的写法、40P01 死锁的复现与定位查询,并对照 MySQL GET_LOCK 只有会话级、死锁错误不回滚事务的差异。
advisorylock
advisory-lock
PostgreSQL
MySQL
咨询锁
pg_locks
PDO 连 MySQL 默认是模拟预处理:prepare 不报 1146,LIMIT '10' 却报 1064
编程
PDO 连 MySQL 默认是模拟预处理:prepare 不报 1146,LIMIT '10' 却报 1064
2026-10-29 00:03:49
PDO_MYSQL 默认用模拟预处理:prepare() 不与服务器通信,所以表不存在要到 execute 才报 1146;execute([10]) 拼成 LIMIT '10' 直接 1064。整理四个可复现差异(校验时点、LIMIT 绑定、同名命名参数 HY093、N 前缀失效)、用 Com_stmt_* 计数器确认是否真的走了原生预处理,以及 PHP 8.4 占位符解析器与 8.5 常量迁移。
PHP
PDO
MySQL
prepared-statement
预处理语句
大家都在搜索什么?
devops
易支付
一个官网+多少钱
统一接受回调
统一回调
python
sub
node
宝塔日志
mysql
shell
ElasticSearch
css
vue
api接口对接
2025
支付接口对接
go
php
php回调
上一页
1
2
3
4
5
6
7
…
341
下一页
共 341 页
到第
页
确定