:用Go版PayJS SDK從零接入微信支付寶)
個人支付收款實戰(zhàn)用Go版PayJS SDK從零接入微信支付寶【免費下載鏈接】payjs個人支付收款解決方案PayJS的Golang版本SDK項目地址: https://gitcode.com/gh_mirrors/pa/payjs凌晨兩點我盯著自己做了兩個月的個人工具站什么都完成了——除了收款。個人開發(fā)者接入微信、支付寶支付意味著營業(yè)執(zhí)照、接口文檔、簽名算法、異步通知每一項都像一堵墻。那晚我翻到了PayJS 的 Golang 版本 SDKGitHub 加速計劃 / pa / payjs一個把個人支付收款封裝成一行的 Go 庫。這篇文章就記錄我如何用它在第二天早上把第一筆打賞收進了自己的賬戶。一、引子那臺差一公里的支付車我的處境很典型個人開發(fā)者沒有公司沒有企業(yè)資質(zhì)但有一個真實想收費的小工具。傳統(tǒng)路徑是申請企業(yè)微信支付——需要營業(yè)執(zhí)照、對公賬戶、審核動輒兩周。而我想要的是今天上線明天有人掃碼付款錢直接進我自己的錢包。PayJS 解決的就是個人收款這最后一公里。它是支付寶與微信支付的個人接口解決方案而Go 版 PayJS SDK把這套接口的簽名、請求、通知解析全部封裝好了。我不需要理解 MD5 簽名的拼接規(guī)則不需要手寫 HTTP 調(diào)用甚至不需要知道異步通知的數(shù)據(jù)結(jié)構(gòu)長什么樣。對個人開發(fā)者來說支付不是技術(shù)問題是資質(zhì)時間問題。SDK 把后者解決剩下的才輪到代碼。二、初見從看不懂文檔到收到1塊錢說實話第一次go get之后我有點懷疑——整個 SDK 的核心入口文件payjs.go只有 100 行。打開一看結(jié)構(gòu)清晰得像一張地圖GetNative()掃碼、GetCashier()收銀臺、GetJs()JSAPI、GetMiniApp()小程序、GetOrder()訂單管理……一個支付網(wǎng)關(guān)該有的能力幾乎全都在。對比一下同一件事的兩種畫面環(huán)節(jié)自己對接微信支付用 Go 版 PayJS SDK資質(zhì)營業(yè)執(zhí)照審核個人身份注冊即可簽名手寫排序拼接MD5底層自動完成下單拼XML/JSON證書一行Create()通知手動解析驗簽回調(diào)函數(shù)直接收消息第一次成功運行時的體感就像擰開一個以為要開鎖的瓶子結(jié)果它是旋蓋的。配置文件只需要三個字段Key、MchID、NotifyUrl。當我看到終端里打出第一個二維碼鏈接、用手機掃完收到支付成功四個字時我知道這一晚值了。三、實戰(zhàn)從零搭一個打賞咖啡小站下面我們完整走一遍。主線項目叫打賞一杯咖啡一個首頁生成二維碼一個/notify接收支付結(jié)果。第一步準備環(huán)境# 拉取 SDK 源碼 git clone https://gitcode.com/gh_mirrors/pa/payjs payjs-sdk # 新建你的業(yè)務(wù)項目 mkdir my-pay cd my-pay go mod init my-pay # 讓項目引用本地 SDK go mod edit -replace payjs../payjs-sdk跑完后你會得到一個獨立的 Go 項目payjs可以直接 import不依賴任何網(wǎng)絡(luò)。第二步配置初始化config : payjs.Config{ Key: 你的通信密鑰, // PayJS 控制臺獲取 MchID: 你的商戶號, // 注冊后分配 NotifyUrl: https://你的域名/notify, // 支付結(jié)果通知地址 } pay : payjs.New(config)這段代碼做了所有初始化商戶號、密鑰、通知地址被打包進一個全局上下文后面所有支付方式都從它派生。運行后沒有任何輸出但它已經(jīng)待命了。第三步核心操作——下單 收通知// 首頁生成支付二維碼 http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) { native : pay.GetNative() // 參數(shù)金額(分)、標題、訂單號、附加數(shù)據(jù)、支付類型(留空微信) resp, err : native.Create(100, 打賞一杯咖啡, T001, from_blog, ) if err ! nil { fmt.Fprintf(w, 下單失敗%v, err) return } fmt.Fprintf(w, img src%s /, resp.Qrcode) // resp.Qrcode 就是二維碼圖片地址 }) // 通知PayJS 推送支付結(jié)果 http.HandleFunc(/notify, func(w http.ResponseWriter, r *http.Request) { notify : pay.GetNotify(r, w) notify.SetMessageHandler(func(msg notify.Message) { // 這里處理支付成功更新數(shù)據(jù)庫訂單狀態(tài) fmt.Printf(訂單 %s 支付成功金額 %d 分\n, msg.OutTradeNo, msg.TotalFee) }) notify.Serve() notify.SendResponseMsg() // 回復(fù) success防止重復(fù)推送 }) http.ListenAndServe(:8080, nil)運行后打開http://localhost:8080會看到二維碼手機掃碼支付完成終端會打印一行訂單 xxx 支付成功金額 100 分。整個過程從下單到通知回執(zhí)我們沒有手寫一行簽名邏輯。配圖建議本地跑通后截一張終端輸出支付成功的圖替換為PayJS掃碼支付運行效果。第四步收尾——訂單對賬支付成功 ≠ 萬事大吉還要有兜底。用pay.GetOrder()主動查詢orderAPI : pay.GetOrder() resp, err : orderAPI.Check(payjs訂單號) // payjs_order_id if err nil resp.Status 1 { fmt.Println(該訂單確實已支付金額, resp.TotalFee) }這一步用于異步通知丟失時的補償查詢是生產(chǎn)環(huán)境必備的第二只眼睛。四、進階我踩過的坑和讓 SDK 更好用的玩法坑一金額單位是分不是元。我第一次測試傳了100以為是 1 元結(jié)果那是 100 元。PayJS 全系列接口金額單位都是分100 1 元先在心里換算好再下單??佣灻炞C不是萬能的。SDK 內(nèi)部對掃碼支付、訂單查詢做了嚴格驗簽但 README 明確標注JSAPI 支付、用戶資料、異步通知 IP 列表三個接口存在多維結(jié)構(gòu)簽名驗證 BUG作者暫時注釋了驗簽。用這三個接口時要自己在業(yè)務(wù)側(cè)做金額和訂單號核對別把安全完全交給它??尤ㄖ獣貜?fù)推送必須冪等。支付平臺的通知機制是不確認成功就重發(fā)。處理函數(shù)里先查訂單狀態(tài)已處理就直接返回success否則用訂單號加鎖再更新??铀氖浙y臺的auto/hide參數(shù)是假 bool。官方文檔寫的是布爾值但源碼注釋里寫得很清楚傳true沒用必須傳1。SDK 作者特意把參數(shù)類型改成了int就是為了堵住這個坑。調(diào)用GetCashier().GetRequestUrl(...)時記得傳1。進階玩法定時對賬起一個 goroutine每 5 分鐘掃一遍本地待支付訂單用Check主動確認狀態(tài)彌補通知延遲。連接復(fù)用SDK 內(nèi)部PostJSON每次新建 HTTP 連接高并發(fā)時換成帶連接池的http.Client性能立刻上一個臺階。場景組合PC 端用GetNative()掃碼、微信內(nèi)用GetCashier()收銀臺、需要獲取用戶 openid 時用GetUser()一套 Config 全搞定。五、收尾把話說透回頭看支付接入從來不是技術(shù)深水區(qū)而是資質(zhì)門檻 信息差。Go 版 PayJS SDK 做的就是把這層門檻削平三個配置字段、一個New()、幾個GetXXX()個人開發(fā)者也能在 30 分鐘內(nèi)擁有一套完整的收款鏈路。它不完美——三個接口的驗簽 BUG 還在 TODO 里躺著但這份誠實反而讓用的人心里有底。下一步很具體把上面的代碼復(fù)制到你自己的項目里先跑通掃碼支付再補上通知冪等和訂單對賬。等第一筆真實的錢到賬你會想起這句話——最好的支付接入是讓你忘記自己在接支付?!久赓M下載鏈接】payjs個人支付收款解決方案PayJS的Golang版本SDK項目地址: https://gitcode.com/gh_mirrors/pa/payjs創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考