[golang gin框架] 32.Gin 商城项目- 支付宝支付操作相关功能讲解

52 篇文章 26 订阅
10 篇文章 2 订阅

一.支付宝支付之前的准备工作

创建应用、配置签名、提交审核
  1. 支付宝支付之前的准备工作

支付宝开放平台支持使用 普通公钥公钥证书 两种签名方式

公钥证书模式下完成支付需要获取的内容:

  • appId

  • 应用私钥

  • 应用公钥证书

  • 支付宝根证书

  • 支付宝公钥证书

普通公钥模式下完成支付需要获取的内容:

  • appId

  • 应用私钥

  • 支付宝公钥

生成私钥,证书具体可参考官方文档:https://opendocs.alipay.com/open/291/105971

普通公钥与公钥证书区别

企业开发者若涉及 资金类支出接口接入,必须使用 公钥证书模式,如果不涉及到资金类支出接口,建议使用 普通公钥方式进行加签
  1. 接入支付宝、创建应用

(1). 必须注册企业支付宝账户,如果已有企业支付宝账户忽略此步骤

(2). 浏览器搜索《支付宝开放平台》,或者点击下面链接进入支付宝开发接入页面:

https://openhome.alipay.com/platform/home.htm

(3).鼠标放在网页&移动应用上面点击立即创建 如下图:

(4).填写对应应用名称,如下图 点击创建:

(5).创建以后进入下面页面

(6).添加 《电脑网站支付》功能

也可以添加其他支付( app支付,小程序支付,公众号支付,移动端支付)等功能

(7).设置应用接口加密方式,然后提交审核

  1. 接口加密签名

见官方文档:https://opendocs.alipay.com/open/291/105971

  1. 配置签名 提交审核

  1. 官方支付流程

见官网:https://docs.open.alipay.com/203/107084/

参考文章:支付宝手机网站支付,app支付,PC端支付流程以及服务端php支付下单,回调流程详解

二.支付案例

  1. Golang 支付宝支付 sdk

github sdk地址: https://github.com/smartwalle/alipay/
  1. v2版本支付

引入github.com/smartwalle/alipay/v2, 先在import中导入 github.com/smartwalle/alipay/v2,然后在main.go文件夹下运行命令: go mod tidy即可
package frontend

import (
    "fmt"
    "time"
    "github.com/gin-gonic/gin"
    "github.com/smartwalle/alipay/v2"
)

type PayV2Controller struct{}

func (con PayV2Controller) Alipay(c *gin.Context) {
    //支付宝公钥
    var aliPublicKey = "xxx" // 可选,支付宝提供给我们用于签名验证的公钥,通过支付宝管理后台获取
    //应用私钥
    var privateKey = "xxx" // 必须,上一步中使用 RSA签名验签工具 生成的私钥
    //应用id
    var appId = "xxx"

    //最后一个参数 false 表示沙箱环境 true表示正式环境
    client, _ := alipay.New(appId, aliPublicKey, privateKey, true)
    //调用Page 支付(根据不同情况,选择不同支付)
    var p = alipay.TradePagePay{}
    //配置回调地址
    p.NotifyURL = "http://xxx/alipayNotify" //post
    //配置支付完成后的跳转地址
    p.ReturnURL = "http://xxx/alipayReturn"
    p.Subject = "测试-这是一个Gin订单"
    template := "2006-01-02 15:04:05"
    //订单号
    p.OutTradeNo = time.Now().Format(template)
    p.TotalAmount = "0.1" //元
    //产品code
    p.ProductCode = "FAST_INSTANT_TRADE_PAY"

    var url, err4 = client.TradePagePay(p)
    if err4 != nil {
        fmt.Println(err4)
    }

    var payURL = url.String()
    fmt.Print(payURL)
    c.Redirect(302, payURL)
}

//异步通知  处理订单
func (con PayV2Controller) AlipayNotify(c *gin.Context) {  
    var aliPublicKey = "xxx"
    var privateKey = "xxx"
    var appId = "xxx"
    var client, err1 = alipay.New(appId, aliPublicKey, privateKey, true)
    if err1 != nil {
        fmt.Println(err1)
        return
    }
    req := c.Request
    req.ParseForm()
    ok, _ := client.VerifySign(req.Form)

    fmt.Println(ok)

    //更新订单逻辑
    fmt.Println(req.Form)
    c.String(200, "ok")
}

//支付成功以后返回的地址
func (con PayV2Controller) AlipayReturn(c *gin.Context) {
    c.String(200, "支付成功")
}
  1. v3版本支付

package frontend

import (
    "fmt"
    "time"
    "github.com/gin-gonic/gin"
    "github.com/smartwalle/alipay/v3"
)

type PayV3Controller struct{}

func (con PayV3Controller) Alipay(c *gin.Context) {
    var privateKey = ""
    var client, err = alipay.New("2021001xxx588", privateKey, true)
    
    client.LoadAppPublicCertFromFile("crt/appCertPublicKey_xx8.crt") // 加载应用公钥证书
    client.LoadAliPayRootCertFromFile("crt/alipayRootCert.crt")                   // 加载支付宝根证书
    client.LoadAliPayPublicCertFromFile("crt/alipayCertPublicKey_RSA2.crt")       // 加载支付宝公钥证书

    // 将 key 的验证调整到初始化阶段
    if err != nil {
        fmt.Println(err)
        return
    }

    var p = alipay.TradePagePay{}
    p.NotifyURL = "http://xxx/v3/alipayNotify"
    p.ReturnURL = "http://xxx/v3/alipayReturn"
    p.Subject = "测试 公钥证书模式-这是一个gin订单"
    template := "2006-01-02 15:04:05"
    p.OutTradeNo = time.Now().Format(template)
    p.TotalAmount = "0.1"
    p.ProductCode = "FAST_INSTANT_TRADE_PAY"

    var url, err4 = client.TradePagePay(p)
    if err4 != nil {
        fmt.Println(err4)
    }

    var payURL = url.String()
    fmt.Println(payURL)

    c.Redirect(302, payURL)
}
func (con PayV3Controller) AlipayNotify(c *gin.Context) {
    var privateKey = ""
    var client, err = alipay.New("202100xxx6588", privateKey, true)
    client.LoadAppPublicCertFromFile("crt/appCertPublicKey_2021xxx6588.crt") // 加载应用公钥证书
    client.LoadAliPayRootCertFromFile("crt/alipayRootCert.crt")                   // 加载支付宝根证书
    client.LoadAliPayPublicCertFromFile("crt/alipayCertPublicKey_RSA2.crt")       // 加载支付宝公钥证书

    if err != nil {
        fmt.Println(err)
        return
    }

    req := c.Request
    req.ParseForm()
    ok, _ := client.VerifySign(req.Form)

    fmt.Println(ok)
    //处理订单逻辑关系
    fmt.Println(req.Form)

    c.String(200, "ok")
}

func (con PayV3Controller) AlipayReturn(c *gin.Context) {
    c.String(200, "支付成功")
}
  1. 发布

以上操作完成后,还需发布到服务器上,发布步骤:

windows 平台

//编译生成main.exe
go build main.go
//把生成的main.exe以及项目中的静态资源文件(css,js,html,routers,crt密钥等)一同上传到对应的服务器上

Linux 平台

//编译生成main.exe
SET CGO_ENABLED=0
set GOARCH=amd64
set GOOS=linux
go build main.go
//把生成的main.exe以及项目中的静态资源文件(css,js,html,routers,crt密钥等)一同上传到对应的服务器上

ok, 支付宝支付操作就到这里了

[上一节][golang gin框架] 31.Gin 商城项目- 提交订单逻辑操作以及去支付页面制作

[上一节][golang gin框架] 33.Gin 商城项目- 微信支付操作相关功能讲解

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于使用 Golang Gin 框架进行项目实战的建议。 首先,您需要安装 GolangGin 框架。安装过程可以参考官方文档进行操作。然后,您可以按照以下步骤进行项目实战: 1. 创建项目结构 在您的 GOPATH 目录下创建一个新的项目文件夹。通常情况下,您需要为项目创建以下子文件夹: ``` . ├── main.go ├── config │ ├── config.go │ └── ... ├── controller │ ├── home_controller.go │ └── ... ├── middleware │ ├── auth.go │ └── ... ├── model │ ├── user.go │ └── ... ├── router │ ├── router.go │ └── ... └── service ├── user_service.go └── ... ``` 2. 创建路由 在 router 文件夹中创建一个 router.go 文件,并编写以下代码: ```go package router import ( "github.com/gin-gonic/gin" "your-project/controller" "your-project/middleware" ) func SetupRouter() *gin.Engine { r := gin.Default() // 中间件 r.Use(middleware.AuthMiddleware()) // 路由 r.GET("/", controller.HomePageHandler) return r } ``` 在上面的代码中,我们使用了 gin 框架中的 gin.Default() 函数来创建一个默认的 gin.Engine 实例,并使用中间件来进行身份验证。然后我们定义了一个路由,将根路径映射到 HomePageHandler 方法。 3. 创建控制器 在 controller 文件夹中创建 home_controller.go 文件,并编写以下代码: ```go package controller import ( "github.com/gin-gonic/gin" "your-project/service" ) func HomePageHandler(c *gin.Context) { users := service.GetAllUsers() c.JSON(200, users) } ``` 在上面的代码中,我们定义了一个 HomePageHandler 方法,它接收一个 gin.Context 对象作为参数,并使用 service 层中的 GetAllUsers 函数获取所有用户的数据。然后我们使用 JSON 方法将数据以 JSON 格式返回给客户端。 4. 创建服务层 在 service 文件夹中创建 user_service.go 文件,并编写以下代码: ```go package service import "your-project/model" func GetAllUsers() []*model.User { // TODO: 查询数据库获取所有用户数据 return []*model.User{} } ``` 在上面的代码中,我们定义了一个 GetAllUsers 函数,它返回一个包含所有用户数据的切片。在实际项目中,我们需要查询数据库来获取这些数据。 5. 创建模型 在 model 文件夹中创建 user.go 文件,并编写以下代码: ```go package model type User struct { ID int `json:"id"` Name string `json:"name"` Age int `json:"age"` } ``` 在上面的代码中,我们定义了一个 User 结构体,它包含三个字段:ID、Name 和 Age。这些字段将用于存储每个用户的信息。 6. 创建配置文件 在 config 文件夹中创建 config.go 文件,并编写以下代码: ```go package config const ( DB_HOST = "localhost" DB_PORT = "3306" DB_USERNAME = "root" DB_PASSWORD = "password" DB_NAME = "your-database-name" ) ``` 在上面的代码中,我们定义了一些常量,用于存储数据库配置信息。这些常量将在连接数据库时使用。 7. 连接数据库 在 service 层中的 GetAllUsers 函数中,我们需要连接数据库来获取所有用户数据。可以使用以下代码来连接 MySQL 数据库: ```go package service import ( "database/sql" "fmt" "your-project/config" "your-project/model" ) func GetAllUsers() []*model.User { // 连接数据库 db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", config.DB_USERNAME, config.DB_PASSWORD, config.DB_HOST, config.DB_PORT, config.DB_NAME, )) if err != nil { panic(err) } defer db.Close() // 查询所有用户数据 rows, err := db.Query("SELECT * FROM users") if err != nil { panic(err) } // 解析查询结果 users := []*model.User{} for rows.Next() { user := &model.User{} err := rows.Scan(&user.ID, &user.Name, &user.Age) if err != nil { panic(err) } users = append(users, user) } return users } ``` 在上面的代码中,我们使用 sql.Open 函数来打开 MySQL 数据库连接。然后我们使用 db.Query 函数来查询所有用户数据,并使用 rows.Scan 函数将查询结果解析为 User 结构体的切片。 以上就是使用 Golang Gin 框架进行项目实战的流程。当然,在实际项目中,您需要根据自己的需求进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值