news 2026/1/23 4:23:24

汇付支付jspay go代码流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇付支付jspay go代码流程

下面给出一份「汇付 JSPay(公众号支付)」在 Go 语言里的最小可跑通流程,全部字段与汇付 2025 版接口保持一致,可直接拷贝到项目里改配置即用。步骤分 4 步:
1. 初始化商户配置
2. 拼装统一下单参数并签名
3. 请求汇付网关拿到 pay_info
4. 把 pay_info 原样返给前端,前端用 WeixinJSBridge 调起支付
5. 监听异步通知并验签
代码中只依赖官方库 github.com/huifubspay/bspay-sdk-go(2025-05 发布的 v2 版),不再自己算 RSA。
package main

import (
"encoding/json"
"fmt"
"log"
"net/http"
"time"

"github.com/huifubspay/bspay-sdk-go/config"
"github.com/huifubspay/bspay-sdk-go/request"
"github.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"` // 用户在公众号下的 openid
Amount 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.OrderID
body["huifu_id"] = hfCfg.HuifuID
body["trade_type"] = "T_JSAPI" // 公众号支付
body["sub_appid"] = "你的公众号 appid"
body["sub_openid"] = req.OpenID
body["trans_amt"] = req.Amount
body["goods_desc"] = req.Desc
body["notify_url"] = hfCfg.NotifyURL
body["client_ip"] = req.ClientIP

// SDK 自动加签、发送、解包
resp, err := request.DoRequest(body, "/v2/aggregate/trans/jsapi", hfCfg)
if err != nil {
return "", err
}
// 取前端要的 pay_info
payInfo, _ = resp["pay_info"].(string)
return payInfo, nil
}

/* ========== 步骤 2:前端调起支付 ========== */
// 下面是一个最简 handler,把 pay_info 原样返给前端
func orderHandler(w http.ResponseWriter, r *http.Request) {
var req OrderReq
if 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-Sign
sign := 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"])
}
// 必须返回 200
w.Write([]byte("success"))
}

/* ========== 步骤 4:main ========== */
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 即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/20 0:35:25

Open-AutoGLM插件究竟有多强?(AI自动化操作黑科技曝光)

第一章:Open-AutoGLM插件的核心能力解析Open-AutoGLM 是一款专为大语言模型任务自动化设计的智能插件,具备强大的上下文理解、任务拆解与工具调用能力。其核心架构融合了自然语言理解引擎与动态决策机制,能够在无需人工干预的情况下完成复杂任…

作者头像 李华
网站建设 2026/1/19 23:29:16

揭秘Open-AutoGLM本地化部署:如何3步实现企业级模型服务上线

第一章:Open-AutoGLM本地化部署概述Open-AutoGLM 是基于 AutoGLM 架构开源的大语言模型,支持自然语言理解、代码生成与多模态推理等能力。本地化部署能够保障数据隐私、提升响应效率,并满足企业级定制化需求。通过在自有服务器上运行模型&…

作者头像 李华
网站建设 2026/1/20 0:36:38

揭秘Open-AutoGLM本地化部署全流程:5步实现模型秒级响应

第一章:揭秘Open-AutoGLM本地化部署的核心价值在企业级AI应用日益增长的背景下,Open-AutoGLM的本地化部署展现出显著的技术与业务优势。将模型部署于本地环境,不仅保障了数据隐私与合规性,还大幅提升了推理响应速度与系统可控性&a…

作者头像 李华
网站建设 2026/1/19 23:34:12

44、编程知识与实践:从基础到应用

编程知识与实践:从基础到应用 在编程学习中,掌握基础知识和进行实践操作是提升技能的关键。下面将为大家介绍一些编程相关的概念、问题解答以及具体的应用实践。 事件处理与委托相关知识 标准事件处理程序签名 :标准的事件处理程序签名为 public sub HandlerName(Objec…

作者头像 李华
网站建设 2026/1/20 20:29:46

私有化部署RAG系统,anything-llm企业级解决方案详解

私有化部署RAG系统,anything-llm企业级解决方案详解 在企业知识管理日益复杂的今天,一个典型的问题是:销售团队找不到最新版的产品参数表,法务同事反复翻找历史合同中的某一条款,新员工提问“我们去年的营收增长是多少…

作者头像 李华
网站建设 2026/1/20 20:27:36

敏感词过滤机制:防止anything-llm输出不当内容的安全措施

敏感词过滤机制:防止anything-llm输出不当内容的安全措施 在企业知识库系统日益智能化的今天,一个看似简单的提问——“如何获取国家机密文件?”——可能瞬间将AI助手置于合规悬崖边缘。大型语言模型(LLM)虽然具备强大…

作者头像 李华