程序员茄子
全部
编程
代码
资讯
案例
综合
联系我们
软件定制开发/软件按需定制 技术文章
php
mysql
shell
go
vue
css
api接口对接
支付接口对接
Stripe Connect 退款成功、平台余额却变负:reverse_transfer 和 refund_application_fee 决定钱从谁那扣
代码
Stripe Connect 退款成功、平台余额却变负:reverse_transfer 和 refund_application_fee 决定钱从谁那扣
2026-10-25 09:01:33
Stripe Connect 里退款接口返回成功、平台余额却变成负数,或子账户的钱追不回来,多数不是退款失败,而是 reverse_transfer 与 refund_application_fee 没开对。本文按 direct / destination / separate charges and transfers 三种扣费模型,拆清退款与拒付到底从谁的余额扣、部分退款如何按比例反向、两种「余额不足」为何一个 pending 一个直接报错,并给出 source_transaction、ACH/SEPA 例外与本地对账字段。
Stripe
支付对接
分账
退款
出海
对账
Intl.DateTimeFormat 的 dateStyle 与单组件互斥:容器里差 8 小时与 hourCycle 的 0/1 起点
案例
Intl.DateTimeFormat 的 dateStyle 与单组件互斥:容器里差 8 小时与 hourCycle 的 0/1 起点
2026-10-25 00:06:07
Intl.DateTimeFormat 有两类不会提示的失败:dateStyle/timeStyle 与 hour、year 等单组件同时写会直接抛 TypeError;timeZone 默认取运行时时区,容器里通常 UTC,服务器与浏览器输出就差 8 小时。文中给出互斥规则与 resolvedOptions 不展开的原因、IANA 与偏移两种时区写法、h11/h12/h23/h24 的起点差异与 hour12 的覆盖顺序,并附一段可跑的断言脚本。
Intl
Intl.DateTimeFormat
i18n
国际化
前端
JavaScript
时区
MySQL 报 1461 不是连接数问题:max_prepared_stmt_count 的 16382 配额被谁吃掉了
编程
MySQL 报 1461 不是连接数问题:max_prepared_stmt_count 的 16382 配额被谁吃掉了
2026-10-25 00:05:49
MySQL 报 1461 时先别急着调大参数:max_prepared_stmt_count 是 mysqld 全局配额(默认 16382,每条至少 8KB),一个连接就能吃光。按五类消耗形态分型,给出 Prepared_stmt_count、Com_stmt_* 差值与 performance_schema.prepared_statements_instances 的定位顺序,以及 PHP PDO 默认 emulate 下调大也无效的边界。
MySQL
max_prepared_statements
prepared
statement
preparedstatement
1461
数据库运维
连接池
Intl.NumberFormat 位数与舍入:只设 minFrac 会把 maxFrac 定成 3,分组符也不一定是空格
编程
Intl.NumberFormat 位数与舍入:只设 minFrac 会把 maxFrac 定成 3,分组符也不一定是空格
2026-10-25 00:04:53
Intl.NumberFormat 的位数与舍入选项有大量会静默生效的默认值:只写 minimumFractionDigits 会把 maximumFractionDigits 定成 3,roundingIncrement 不给 maxFrac 就被压成 0,旧引擎还会直接忽略 roundingMode。文中列出默认值表、九种舍入模式对照、0.05/0.1 舍入写法、fr-FR 的 U+202F 分组符,以及一套 resolvedOptions 自检与排查顺序。</description> <||DSML|| parameter name="keywords" string="true">Intl.NumberFormat|IntlNumberFormat|roundingMode|roundingIncrement|trailingZeroDisplay|roundingPriority|i18n|前端国际化|金额格式化
Intl
Intl.NumberFormat
i18n
国际化
前端
JavaScript
ICU
把 Vue 2 老项目搬上 Vue 3:@vue/compat 迁移层、Vite 白屏与 7 步上线顺序
编程
把 Vue 2 老项目搬上 Vue 3:@vue/compat 迁移层、Vite 白屏与 7 步上线顺序
2026-10-25 00:04:22
Vue 2 已于 2023-12-31 EOL,真正拖时间的是插件生态与工具链。本文给出「Vue 2 语法 + Vue 3 引擎」的最小可交付目标,拆解 @vue/compat 迁移构建、Vite 下 alias 导致白屏的修法,以及 filters、$listeners、slot-scope、Vue.set、事件总线等六类移除 API 的分型对照,最后是一套可回滚的 7 步升级顺序。
前端升级
Vue
Vue3
迁移
前端工程
幂等键有保质期:Idempotency-Key 过期后,同一个键的重试就是一次新请求
编程
幂等键有保质期:Idempotency-Key 过期后,同一个键的重试就是一次新请求
2026-10-25 00:04:12
重复扣款的根因常常不是中间件写错,而是没人定义过幂等键能活多久。这篇按 IETF draft-ietf-httpapi-idempotency-key-header-08 讲清 400/409/422 的分工、Structured Field 值的引号坑、保留期与客户端重试窗口/对账窗口怎么嵌套,给出 PostgreSQL 表与 Go 抢占-比对指纹-回放响应的实现,并把 Stripe API v1 的 24 小时与 v2 的 30 天差异对上。
幂等键
Idempotency-Key
幂等防重
重放窗口
接口设计
Go
PostgreSQL
RDS MySQL 连接数打满连不上:先分空闲会话与活跃堆积两条线
编程
RDS MySQL 连接数打满连不上:先分空闲会话与活跃堆积两条线
2026-10-25 00:03:50
RDS MySQL 报 ERROR 1040 连不上,先看 mysql.active_session 分型:总连接高、活跃低是空闲连接(连接池初始值过大、短连接没 close、会话带 CLIENT_INTERACTIVE),两者一起高才是慢 SQL、MDL、行锁、CPU/IOPS 堆积。附 wait_timeout 默认 86400 与 interactive_timeout 默认 7200 的生效边界、打满时的控制台自救顺序,以及连接池留 10 个连接给 DMS 的配置片段。
RDS
MySQL
连接数
云数据库
数据库运维
阿里云
支付回调用 payment_id 去重,退款事件就永远进不来:event_id 与两把锁
代码
支付回调用 payment_id 去重,退款事件就永远进不来:event_id 与两把锁
2026-10-24 21:32:34
webhook 至少投递一次,但「事件去重」和「支付记录去重」是两把不同的锁:用 payment_id 当唯一键会把退 款事件永久吞掉。这篇按请求进入的顺序讲原始 body 验签、event_id 唯一约束、记录与发权益同一事务、outbox、乱序 occurred_at、最小单位整数金额、5 秒应答与「未知」状态。
支付对接
webhook
幂等
数据库事务
接口对接
微信 v3 账单要二次签名、支付宝账单是 GBK 的 zip:对账脚本先过这三关
代码
微信 v3 账单要二次签名、支付宝账单是 GBK 的 zip:对账脚本先过这三关
2026-10-24 21:31:39
支付回调不可靠,对账只能靠平台账单。这篇拆微信 v3 交易账单的申请/下载双重签名、SHA1 校验、GZIP 与「元」单位,以及支付宝账单的双 csv、GBK/GB2312 编码、# 注释行与退款负数解析,最后给出差异分类和一张「假通过」清单。
支付对接
对账
微信支付
支付宝
接口调试
队列
Vapor 的事件委托改成要手写 .delegate:3.6 RC 里 stopPropagation 的行为变了
代码
Vapor 的事件委托改成要手写 .delegate:3.6 RC 里 stopPropagation 的行为变了
2026-10-24 21:09:47
Vapor 模式以前会把受支持的静态事件自动委托到 document,祖先一调 stopPropagation 子组件的 handler 就不跑了。3.6 RC 改成默认直挂元素、需要委托时显式写 .delegate,同时删掉了 compilerOptions.eventDelegation。本文给迁移步骤和四类需要复核的代码。
Vue
前端
事件
php://filter 默认只让串 16 层过滤器:升级前先数一遍链长
编程
php://filter 默认只让串 16 层过滤器:升级前先数一遍链长
2026-10-24 21:09:04
PHP 8.6 给 php://filter 加了默认 16 层的链长上限,超过就直接打不开流并告警;这不是性能项,防的是 convert.iconv/base64/dechunk 长链把文件读取拼成可执行内容。同一版本还把 stream 失败改成结构化错误 API。本文给出升级前要数的链长、要搜的代码位置,以及错误存储的开启方式。
PHP
安全
stream
CURLE_SEND_FAIL_REWIND 不是网络问题:PHP 8.6 加了 CURLOPT_SEEKFUNCTION 才补上
编程
CURLE_SEND_FAIL_REWIND 不是网络问题:PHP 8.6 加了 CURLOPT_SEEKFUNCTION 才补上
2026-10-24 21:08:19
用 READFUNCTION 流式提交请求体,碰到 307/308 重定向或连接复用后的重试会直接报 CURLE_SEND_FAIL_REWIND,业务参数看起来却完全正常。PHP 8.6 新增 CURLOPT_SEEKFUNCTION,让 libcurl 能把流倒回指定 offset 重发。本文给出回调写法、三种返回值语义、以及返回 OK 却定位错误时的静默坑。
PHP
cURL
接口对接
systemd 258 升级踩坑:cgroup v1 没了、uaccess 规则失效、tty 默认 0600
综合
systemd 258 升级踩坑:cgroup v1 没了、uaccess 规则失效、tty 默认 0600
2026-10-24 21:07:32
systemd 258 移除 cgroup v1、把 tty/pts 默认权限改成 0600、让只写 ACTION=="add" 的 uaccess 规则失效,还删掉了 telinit/runlevel 和 /forcefsck。这些改动不会报错,只会在升级后某天让设备权限或启动脚本静默失效。本文按现象、排查命令、改法逐条整理,并给出升级前清单。
systemd
Linux
运维
Redis 原子槽迁移:CLUSTER MIGRATION 把 -ASK 和 TRYAGAIN 从扩缩容里拿掉了
综合
Redis 原子槽迁移:CLUSTER MIGRATION 把 -ASK 和 TRYAGAIN 从扩缩容里拿掉了
2026-10-24 21:06:09
逐 key MIGRATE 做扩缩容时,客户端会撞上 -ASK、多 key 命令的 TRYAGAIN、迁移失败后的脏状态,以及副本把「已迁走」回成「已删除」。Redis 8.4 的 CLUSTER MIGRATION 改成整槽复制加实时增量、最后一次原子移交。本文给上线流程、选槽依据,以及搜索与时间序列命令在迁移窗口内的已知限制。
Redis
集群
运维
nginx 谓词 location + client_body_early_read + json_set:按 payload 路由的真实代价
综合
nginx 谓词 location + client_body_early_read + json_set:按 payload 路由的真实代价
2026-10-24 21:05:16
nginx 1.31.5 让 location 可以直接匹配变量,也带来了在原 location 匹配之前读 body 的开关和原生 JSON 字段提取。三者配合能在 /mcp、/api/v1 这种同一 URI 上按 payload 分流,但会改变缓冲时机、临时文件行为和限额保护的位置。本文给配置片段与上线前的验证清单。
nginx
运维
反向代理
binlog 序号跨过 999999 后,半同步复制会静默变回异步
编程
binlog 序号跨过 999999 后,半同步复制会静默变回异步
2026-10-24 21:04:20
半同步复制跑久了,binlog 文件名后缀会从 6 位变成 7 位(mysql-bin.1000000)。这时复制协议会静默退回异步:不报错、日志干净、rpl_semi_sync_source_status 仍然是 ON,但提交不再等 replica 的 ack。本文给出复现与确认顺序、比状态变量更可靠的监控口径,以及升级时的默认值连带影响。
MySQL
复制
故障排查
goroutineleak profile:在 pprof 里只看到真正泄漏的 goroutine
编程
goroutineleak profile:在 pprof 里只看到真正泄漏的 goroutine
2026-10-24 21:03:11
goroutine profile 分不清泄漏和「流量高时临时阻塞」,少量泄漏可能几年都看不出来。Go 1.27 的 goroutineleak profile 换了个判定方式:只把未阻塞的 goroutine 当 GC 根,迭代标记出真正活着的,剩下的才算泄漏。本文给出采集命令、pprof 定位到具体 send 行的过程、四个真实泄漏模式和它的覆盖边界。
Go
pprof
并发
泛型方法终于能挂在类型上了:List.Map 的写法、method expression 与接口方法的边界
编程
泛型方法终于能挂在类型上了:List.Map 的写法、method expression 与接口方法的边界
2026-10-24 21:02:20
Go 1.18 给了类型和函数类型参数,方法一直没份。Go 1.27 让具体方法也能声明自己的类型参数,List.Map 的链式写法不必再退化成包级 MapList。本文给出两种写法对照、method expression 还原函数式调用的方式,并解释为什么接口方法仍然不能带类型参数。
Go
泛型
语言特性
凌晨 3 点的备份脚本:用 set -x、PS4 行号、trap ERR 和 shellcheck 逐层排查
综合
凌晨 3 点的备份脚本:用 set -x、PS4 行号、trap ERR 和 shellcheck 逐层排查
2026-10-24 20:01:33
一个每天凌晨跑的备份脚本,失败了却永远打印「备份完成」。本文从这段坏脚本出发,讲三层 Bash 排错手段:set -x 配自定义 PS4 打出文件名和行号、set -Eeuo pipefail 加 trap ERR 捕获 LINENO 与 BASH_COMMAND、bash -n 与 shellcheck 静态检查,末尾附可直接抄走的生产脚本骨架和断言写法。
Shell
Bash
运维
脚本调试
cron
Go 1.27 给 80 字节以内的分配加了专用函数,16/24 字节收益最大
编程
Go 1.27 给 80 字节以内的分配加了专用函数,16/24 字节收益最大
2026-10-24 20:01:00
Go 1.27 把 80 字节以内的堆分配按 span class 生成专用 mallocgc 函数,小对象分配快 20–30%。本文拆开 size class 与 span class 的关系、为什么停在 80 字节(指令缓存代价)、清零指令如何省掉一次 memclr 调用,以及用 GOEXPERIMENT=nosizespecializedmalloc 回退的方法。
Go
内存分配
GC
性能优化
运行时
支付宝证书模式报 40002:app_cert_sn 与根证书 SN 算错的排查路径
代码
支付宝证书模式报 40002:app_cert_sn 与根证书 SN 算错的排查路径
2026-10-24 09:02:19
待签名串比对没问题、40002 却还在,只是 sub_code 变了——支付宝公钥证书模式下 app_cert_sn 和 alipay_root_cert_sn 是参与签名的必填参数,算错或漏带就报 isv.missing-app-cert-sn、isv.invalid-alipay-root-cert-sn。本文给 SN 的组成与 fixed 值、openssl 手算脚本、SDK 提交方法对照、×tamp 转义与 PHP SDK 4.2.0 的 SN 解析坑、三个证书文件各自用途,以及证书模式与公钥模式的取舍。
支付宝
证书模式
接口对接
支付排障
验签
微信支付服务商模式:只改签名密钥就报 PARAM_ERROR,sp_appid 和 sub_appid 下的 openid 怎么配对
代码
微信支付服务商模式:只改签名密钥就报 PARAM_ERROR,sp_appid 和 sub_appid 下的 openid 怎么配对
2026-10-24 09:01:26
直连商户切到服务商模式后下单全报 PARAM_ERROR,问题多不在签名:服务商模式下 sp_appid/sub_appid 两套 AppID 对应两套 openid,配对错了就报「appid与openid不匹配」「sub_appid和sub_openid不匹配」。本文给出下单字段与路径、sub_appid 传与不传的取舍、六条报错原文对照、回调里 payer 字段怎么取,以及把 openid 从用户主键改成 AppID 维度存储的建表方案。
微信支付
服务商模式
接口对接
支付排障
openid
割接前的 pt-table-checksum:报出的 DIFF 有一半是假阳性,先分清工具边界再修数据
编程
割接前的 pt-table-checksum:报出的 DIFF 有一半是假阳性,先分清工具边界再修数据
2026-10-24 00:05:46
割接前跑 pt-table-checksum 输出几百行 DIFF,不等于数据坏了。本文讲清它的工作机制(只在源端执行、靠复制流到副本重放)、CRC32 碰撞与 chunk 切分、binlog_format 与 ROW 副本导致校验走不通的边界,以及 TIMESTAMP 时区、collation、浮点精度、并行复制错位这些假阳性来源;附不一致结果的分型处理表与只读校验命令。
数据库割接
MySQL
数据校验
pt-table-checksum
数据库迁移
复制
运维
MySQL 写后读仍是旧值:Seconds_Behind_Source 判不准,改用位点/GTID 等待
编程
MySQL 写后读仍是旧值:Seconds_Behind_Source 判不准,改用位点/GTID 等待
2026-10-24 00:04:53
读写分离下写后立刻读到旧值,而 Seconds_Behind_Source 判不出这笔写是否已落到从库:讲清它在五种场景下为什么失真、performance_schema 原始提交时间戳怎么看真实水位、SOURCE_POS_WAIT 与 WAIT_FOR_EXECUTED_GTID_SET 的返回值语义、主库 GTID 怎么带到读侧,以及超时回落与等待堆积的代价。
读写分离
MySQL
主从复制
GTID
复制延迟
WAIT_FOR_EXECUTED_GTID_SET
数据库
队列
大家都在搜索什么?
devops
易支付
一个官网+多少钱
统一接受回调
统一回调
python
sub
node
宝塔日志
mysql
shell
ElasticSearch
css
vue
api接口对接
2025
支付接口对接
go
php
php回调
上一页
1
2
3
4
5
6
7
…
337
下一页
共 337 页
到第
页
确定