个人收款不卡壳:用Go接入PayJS,从零到出二维码只花十分钟
个人收款不卡壳用Go接入PayJS从零到出二维码只花十分钟【免费下载链接】payjs个人支付收款解决方案PayJS的Golang版本SDK项目地址: https://gitcode.com/gh_mirrors/pa/payjs副标题Golang版PayJS SDK速通指南环境、下单、回调一次讲清一、先讲一个想收款却收不了款的故事上周有个做独立工具的朋友跟我吐槽他的命令行小工具上线当天就有十几个网友问怎么给你打钱。他兴冲冲去研究微信支付翻到资质要求那一页就愣住了——企业营业执照、对公账户、签协议、审核……哪一样个人开发者都凑不齐。后来他找到了PayJS一个面向个人的支付收款解决方案配合本文要介绍的Golang 版本 SDKpayjs当晚就把收款二维码挂到了工具首页。以前是营业执照 一周排期现在是一个密钥 十分钟跑通。这篇就把这条路完整走给你看。二、先跑起来再说最小可用路径别急着啃协议先把二维码变出来。我们按四步走每一步你都知道自己完成了什么。第一步环境准备完成 20%go mod init pay-demo go get gitcode.com/gh_mirrors/pa/payjs说明第一行初始化一个 Go 模块第二行拉取这个 SDK 依赖。仓库地址来自 GitCode 镜像国内访问更顺畅。第二步初始化配置完成 40%config : payjs.Config{ Key: 你的通信密钥, // ← 在 PayJS 控制台复制相当于你家门锁的钥匙 MchID: 你的商户号, // ← 注册后系统分配相当于平台上的身份证号 NotifyUrl: https://你的域名/pay/notify, // ← 支付成功后平台回调你的地址必须公网可访问 } pay : payjs.New(config)预期效果pay这个对象从此就是你的支付遥控器后面所有操作都从它出发。第三步创建一笔订单完成 80%native : pay.GetNative() // 扫码支付用户扫你的码付钱 resp, err : native.Create( 9900, // 金额单位是【分】9900 99元千万别按元传 个人工具使用授权, // 商品名称会显示在用户付款页面 order_20230510_001, // 你的订单号全局唯一重复会被拒单 user_123456, // 附加数据通知你时会原样带回常用来记用户ID ) if err ! nil { fmt.Printf(下单失败%v, err) return }第四步看到结果完成 100%fmt.Println(扫码链接, resp.CodeUrl) // ← 把这条链接生成二维码图片用户扫它就能付预期效果手机扫码 → 完成付款 → 资金进入你的账户。全程没有任何人工介入。到这里你已经完成了其他开发者需要一周才能打通的事情。剩下的就是把它做得可靠一点。三、剥开外壳看内核签名与通知这两个暗号扫码支付能跑通但你不能只当调包侠。最值得理解的两个机制是签名校验和异步通知——理解了它们能帮你避开 80% 的坑。签名 你和平台之间的暗号。你和 PayJS 共享一个只有彼此知道的密钥Key。每次请求把所有参数按字母序排好、拼成keyvaluekeyvalue的字符串末尾接上key你的密钥整体算一个 MD5 转大写作为sign字段带上。平台收到后用同样的方法算一遍对得上才认这笔请求。下面是它最核心的逻辑SDK 里的util.Signature帮你封装好了func Sign(params map[string]string, key string) string { keys : []string{} for k, v : range params { if k ! sign v ! { keys append(keys, k) } // 排除 sign 和空值 } sort.Strings(keys) // 1. 参数名按 ASCII 升序 parts : []string{} for _, k : range keys { parts append(parts, kparams[k]) // 2. 拼成 keyvalue 串 } src : strings.Join(parts, ) key key // 3. 末尾追加密钥 return strings.ToUpper(md5hex(src)) // 4. MD5 后转大写 }异步通知 平台送货上门。用户付完钱平台不会等你来问而是主动 POST 一笔数据到你配置的NotifyUrl。你只需解析参数、把本地订单标记为已支付、回一句success。SDK 里pay.GetNotify(req, w)连解析和回复都帮你做好了你只需要写业务逻辑。四、真实项目中的避坑手册跑通只是开始下面三个坑几乎人人都会踩。坑 1订单生成了却永远收不到支付结果现象用户扫码付了钱你数据库里的订单还挂在待支付。原因NotifyUrl填的是localhost或者回调路由带了 session / csrf 校验平台的服务器根本 POST 不进来。方案① 用公网域名或内网穿透保证可访问② 回调单独开一条不带任何鉴权的路由③ 回调里只更新状态不执行敏感操作。判断口诀通知地址要裸奔鉴权一律放外面。坑 2金额差了整整 100 倍现象用户明明付了 99 元你记录成了 99或反过来。原因PayJS 所有金额单位是分而你习惯用元思考。方案在入口统一做一次元转分转换函数业务层一律传分禁止裸写数字。判断口诀一切金额走分转换只在一处。坑 3同一订单号重复下单被拒现象用户连续点两次下单第二次直接报错。原因out_trade_no用了秒级时间戳同一秒内两笔就撞车了。方案订单号 时间戳 随机后缀或干脆用数据库自增 ID。判断口诀订单号是唯一钥匙重复就会撞锁。五、从能用走向好用生产环境加固清单如果你想把它放到真实业务里下面四条够用即可的加固建议值得记下通知处理必须幂等。平台可能对同一笔订单重复推送。收益不重复发货、不重复入账。做法处理前先查本地订单状态已支付直接回success。加一个定时对账任务。异步通知万一丢了靠它兜底。收益账永远对得上。做法每 5 分钟把超时未支付的订单用order.Check()轮询一遍。提醒间隔别设太短别把平台当轮询玩具。密钥绝不写进代码。用环境变量注入Key。收益代码仓库泄露也不至于丢钱。提醒MchID和Key要分开放、分开管。回调里只做快事。收到通知后立即回success耗时的发货逻辑丢进队列或 goroutine。收益平台不会再重推你也少收一堆重复请求。六、写在最后回到开头那个朋友。他的小工具现在每天稳定收到几十笔打赏从想收款到收到款隔着的从来不是资质和文档而是一个对的入口——现在这个入口你已经握在手里了。接下来建议你按这份清单行动今天就用go get拉下 SDK 跑通 Demo明天把NotifyUrl换成你的公网地址做一次真实的一分钱测试本周给订单补上唯一订单号和统一的金额换算。收款不应该成为产品上线的拦路虎它只是你通向用户的一道小门。这道门现在为你敞开了。【免费下载链接】payjs个人支付收款解决方案PayJS的Golang版本SDK项目地址: https://gitcode.com/gh_mirrors/pa/payjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考