网站备案电话号码,做蛋糕的英文网站,系统开发报价清单明细,网站推广计划方法下面给出一份「汇付 JSPay#xff08;公众号支付#xff09;」在 Go 语言里的最小可跑通流程#xff0c;全部字段与汇付 2025 版接口保持一致#xff0c;可直接拷贝到项目里改配置即用。步骤分 4 步#xff1a;
1. 初始化商户配置
2. 拼装统一下单参数并签名
3. 请求汇付网…下面给出一份「汇付 JSPay公众号支付」在 Go 语言里的最小可跑通流程全部字段与汇付 2025 版接口保持一致可直接拷贝到项目里改配置即用。步骤分 4 步1. 初始化商户配置2. 拼装统一下单参数并签名3. 请求汇付网关拿到 pay_info4. 把 pay_info 原样返给前端前端用 WeixinJSBridge 调起支付5. 监听异步通知并验签代码中只依赖官方库 github.com/huifubspay/bspay-sdk-go2025-05 发布的 v2 版不再自己算 RSA。package mainimport (encoding/jsonfmtlognet/httptimegithub.com/huifubspay/bspay-sdk-go/configgithub.com/huifubspay/bspay-sdk-go/requestgithub.com/huifubspay/bspay-sdk-go/utils)/* 步骤 0一次性配置 */var (hfCfg config.MerchantConfig{ProductID: 你的 product_id, // 汇付后台产品编号SysID: 你的 sys_id, // 系统编号HuifuID: 你的 huifu_id, // 商户号PrivateKey: -----BEGIN PRIVATE KEY-----... 你的私钥-----END PRIVATE KEY-----,HuifuPublicKey: -----BEGIN PUBLIC KEY-----... 汇付公钥-----END PUBLIC KEY-----,NotifyURL: https://你的域名/huifu/notify, // 支付结果通知地址})/* 步骤 1下单并获取 pay_info */type OrderReq struct {OrderID string json:order_id // 业务订单号OpenID string json:open_id // 用户在公众号下的 openidAmount string json:amount // 元保留 2 位小数Desc string json:desc // 商品描述ClientIP string json:client_ip // 用户 IP}func CreateJSPayOrder(req OrderReq) (payInfo string, err error) {body : make(map[string]interface{})body[req_date] time.Now().Format(20060102)body[req_seq_id] req.OrderIDbody[huifu_id] hfCfg.HuifuIDbody[trade_type] T_JSAPI // 公众号支付body[sub_appid] 你的公众号 appidbody[sub_openid] req.OpenIDbody[trans_amt] req.Amountbody[goods_desc] req.Descbody[notify_url] hfCfg.NotifyURLbody[client_ip] req.ClientIP// SDK 自动加签、发送、解包resp, err : request.DoRequest(body, /v2/aggregate/trans/jsapi, hfCfg)if err ! nil {return , err}// 取前端要的 pay_infopayInfo, _ resp[pay_info].(string)return payInfo, nil}/* 步骤 2前端调起支付 */// 下面是一个最简 handler把 pay_info 原样返给前端func orderHandler(w http.ResponseWriter, r *http.Request) {var req OrderReqif err : json.NewDecoder(r.Body).Decode(req); err ! nil {http.Error(w, err.Error(), http.StatusBadRequest)return}payInfo, err : CreateJSPayOrder(req)if err ! nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 前端拿到后直接 eval 即可调起支付json.NewEncoder(w).Encode(map[string]string{pay_info: payInfo})}/* 步骤 3异步通知 */func notifyHandler(w http.ResponseWriter, r *http.Request) {// 汇付通知是 JSON RSA 签名放在 header Huifu-Signsign : r.Header.Get(Huifu-Sign)bodyBytes, _ : io.ReadAll(r.Body)if !utils.VerifySign(string(bodyBytes), sign, hfCfg.HuifuPublicKey) {log.Println(验签失败)w.WriteHeader(http.StatusBadRequest)return}// 验签通过 - 解密 - 拿到交易状态var notice map[string]interface{}json.Unmarshal(bodyBytes, notice)if notice[trans_stat] S {log.Println(支付成功订单号, notice[req_seq_id])}// 必须返回 200w.Write([]byte(success))}/* 步骤 4main */func main() {// 初始化全局配置config.Init(hfCfg)http.HandleFunc(/api/huifu/order, orderHandler)http.HandleFunc(/huifu/notify, notifyHandler)log.Println(listen :8080)log.Fatal(http.ListenAndServe(:8080, nil))}前端拿到 /api/huifu/order 返回的 pay_info 后直接注入即可const res await fetch(/api/huifu/order,{method:POST,body:JSON.stringify({order_id:123,open_id:oXXX,amount:0.01,desc:测试,client_ip:127.0.0.1})})const {pay_info} await res.json()eval(pay_info) // 汇付返回的就是一段 WeixinJSBridge.invoke(...) 代码至此Go 后端职责完成下单、签名、验签、通知全部走官方 SDK无需自己拼 XML 或算 RSA。若后续要支持「小程序支付」只需把 trade_type 换成 T_MINIAPP 并把 sub_appid 换成小程序 appid 即可。