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

news2025/1/23 6:19:52

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

创建应用、配置签名、提交审核
  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, "支付成功")
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

热乎的面经——不屈不挠

⭐️前言⭐️ 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主日常练习代码均已上传GitHub &#x1f4…

【Linux常见指令以及权限理解】基本指令(3)

写在前面 上一篇文章,我们学习了Linux的一些常用指令, 学习了如何理解Linux系统,介绍了对Linux系统的理解:Linux下一切皆文件 介绍了重定向还有管道相关的知识。这里是上一篇博客的链接:http://t.csdn.cn/2d6fc 接…

Kali HTTrack演示-渗透测试察打一体(1)

HTTrack是一个免费并易于使用的线下浏览器工具,全称是HTTrack Website Copier for Windows,它能够让你从互联网上下载指定的网站进行线下浏览(离线浏览),也可以用来收集信息(甚至有网站使用隐藏的密码文件),一些仿真度极高的伪网站(为了骗取用户密码),也是使用类似工具做…

[一篇读懂]C语言十二讲:栈与队列和真题实战

[一篇读懂]C语言十二讲:栈与队列和真题实战 1. 与408关联解析及本节内容介绍1 与408关联解析2 本节内容介绍 2. 栈(stack)的原理解析2.1 **栈:只允许在一端进行插入或删除操作的线性表**2.2 栈的基本操作2.3 栈的顺序存储2.4 栈的链表存储 3. 初始化栈 -…

PE文件+UPX壳 ida分析

die查壳发现是UPX壳,直接用ida分析,会发现能分析出来的信息特别少,需要脱壳 工具链接发布 UPX/UPX (github.com) 下载压缩包后解压,直接在该文件路径下cmd,输入upx.exe -h安装完成,使用命令“upx -d 文件路…

计算机网络-网络层与链路层协议分析实验

一.实验目的 通过本实验,进一步熟悉PacketTracer的使用,学习路由器与交换机的基本配置,加深对网络层与链路层协议的理解。 二.实验内容 1.完成路由器交换机的基本配置 2.了解 ICMP 数据包的格式 3.检查ARP交换 三.实验过程 1.完成路由…

链表——循环链表

其他形式的链表——循环链表 循环链表 定义:循环链表是表中最后一个结点的指针指向头结点,使链表构成环状 特点:从表中任一结点发出均可找到表中其他结点,提高查找效率 双向循环链表 data:数据元素 prior&#xff1…

进程间通信--管道

文章目录 一.通信二.管道匿名管道(只能用于有血缘关系的进程之间通信)1.匿名管道的创建2.匿名管道的读取情况3.管道的特征4.基于匿名管道的简单进程池 有名管道(用于没有血缘关系的进程间的通信)1.有名管道的建立和删除2.通过一段…

CodeForces 438 D线段树暴力修改

线段树暴力修改 关键是每个数取余操作,看似我们如果暴力改的话m*n肯定超时了 容易发现一个数小于给定模数的时候,取模不会发生改变,而大于给定模数的时候我们得到的最大的结果是x/2向上取整,结果一定小于等于这个数字,这里我想说…

AECC全球留学趋势报告解读

AECC全球留学趋势报告解读 相对更安全的留学目的地: 留学安全是留学生及家长最关注的一个问题。报告显示,在“你认为相对更安全的留学目 的"的问答中,澳大利亚获得总评8.76分(满分10分)位居第一。 英澳新留学更受…

VMware Tanzu Kubernetes Grid (TKG) 2.1 - 企业级 Kubernetes 解决方案

VMware Tanzu Kubernetes Grid (TKG) 2.1 - 企业级 Kubernetes 解决方案 VMware 构建、签名和支持的开源 Kubernetes 容器编排平台的完整分发版 请访问原文链接:https://sysin.org/blog/vmware-tkg-2/,查看最新版。原创作品,转载请保留出处…

华为OD机试真题 Java 实现【最优资源分配】【2023Q1 200分】

一、题目描述 某块业务芯片最小容量单位为 1.25G,总容量为 M*1.25G,对该芯片资源编号为 1,2,… M。 该芯片支持 3 种不同的配置,分别为 A、B、C. 配置 A: 占用容量为 1.25 * 1 1.25G配置 B: 占用容量为 1.25* 2 2…

白嫖chatgpt的Edge插件,很难不爱啊

目录 🍁1.常见的Edge浏览器界面 🍁二.安装WebTab插件 🍁三.WebTab插件的各种功能 🍁1.支持免费的chatgpt,不限次数​编辑 🍁2.有几个休闲的小游戏可以玩耍,点击即玩。 🍁3.支…

【迷宫问题】找出迷宫所有可能的路径C++

1 引入情境 我记得小时候玩过推箱子游戏,也是如下图这种,四周由深色的方格作为墙壁,白色的地方是可以通过的。现在想要从红色方格出发走到黄色方格,能有什么好办法呢? 注意到,对于计算机没有全局的观念&…

Flutter音乐播放audioplayers

简介 Flutter的audioplayers是一个Flutter插件,可以播放多个同时的音频文件,支持Android、iOS、Linux、macOS、Windows和web平台。它有以下特点: 可以从本地文件、网络资源或内存中加载音频可以控制音量、进度、速度和循环可以播放多个音频…

《编程思维与实践》1069.第一位数字

《编程思维与实践》1069.第一位数字 题目 思路 由于正整数N的N次方最大可以为 1 0 8 ⋅ 1 0 8 10^{8\cdot 10^8} 108⋅108,加上数据可能有很多组,所以直接采用大整数计算次方这方法很可能超时, 这里给出一种数学算法: 幂指函数通常的处理方式是取对数将乘方转化为乘法: N N 1…

Linux驱动编程(驱动程序基石)(上)

一、休眠与唤醒 要休眠的线程,放在 wq 队列里,中断处理函数从 wq 队列里把它取出来唤醒。所以,我们要做这几件事: ① 初始化 wq 队列 ② 在驱动的 read 函数中,调用 wait_event_interruptible: 它本身会判断…

English Learning - L3 作业打卡 Lesson1 Day7 2023.5.11 周四

English Learning - L3 作业打卡 Lesson1 Day7 2023.5.11 周四 引言🍉句1: Blues is slow, sad and soulful.成分划分弱读连读爆破语调 🍉句2: Duke Ellington and his orchestra recorded a famous song – Mood Indigo – about the deep blue color, …

【嵌入式环境下linux内核及驱动学习笔记-(11-设备树)】

目录 1、设备树体系1.1 DTS /DTSI / DTC / DTB 2、基础语法2.1 节点语法2.1.1 通用名称建议 2.2 属性语法2.2.1 属性值 2.3 关于label2.4 节点的[unit-address] 与reg属性2.5 根节点 /2.6 标准属性compatible2.6.1 of_machine_is_compatible函数 2.7 地址编码2.7.1 标准属性#ad…

Linux常用命令(4)

文章目录 Linux常用命令(4)查找文件或目录 find在当前文件下找一个hello.txt的文件在/user/include目录下找stdio.h文件 查找内容 grep在当前目录的hello.txt 文件中搜索1234在当前目录下所有文件中搜索1234在当前目录下所有以.txt结尾的文件中搜索1234 制作压缩包和解压缩命令…