脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - go使用支付宝沙箱实现支付宝支付的操作步骤

go使用支付宝沙箱实现支付宝支付的操作步骤

2024-03-11 17:03晓看云起时 Golang

支付宝沙箱支付是支付宝提供的一个测试环境,用于开发者在不影响真实交易的情况下进行支付接口的开发和调试,本文给大家介绍了go使用支付宝沙箱实现支付宝支付的操作步骤,文中有详细的代码示例和图文供大家参考,需要的朋友

支付宝沙箱支付使用背景:

支付宝沙箱支付是支付宝提供的一个测试环境,用于开发者在不影响真实交易的情况下进行支付接口的开发和调试。在沙箱环境中,开发者可以模拟真实的支付流程,包括支付、退款、查询等操作,以便更好地调试和验证自己的支付接口是否正确。

使用支付宝沙箱支付可以帮助开发者提高支付接口的稳定性和安全性,避免在开发过程中对真实交易造成影响。同时,沙箱环境还提供了丰富的测试工具和文档,方便开发者快速上手和进行测试。

 

实现的页面效果

go使用支付宝沙箱实现支付宝支付的操作步骤

go使用支付宝沙箱实现支付宝支付的操作步骤

go使用支付宝沙箱实现支付宝支付的操作步骤

 

第一步:建立项目,复制下方main.go代码

代码架构展示

go使用支付宝沙箱实现支付宝支付的操作步骤

main里的代码

package main
 
import (
	"fmt"
	"log"
	"net/http"
 
	"github.com/gin-gonic/gin"
	"github.com/smartwalle/alipay/v3"
	"github.com/smartwalle/xid"
)
 
var client *alipay.Client
 
const (
	kAppId = "9021000134674475"
	//私钥
	kPrivateKey = "MIIEpAIBAAKCAQEAzSHBDVo52MqoAMvn1KFY7iuzFEUHDp/Iya3vK5s6Qp1N9hxvxwbN5Y3CjtyapDyPwBNGFYpxsoDFUOoH55vc5Z0mTxWAI3a9R1WSrL3cAAi7/2DIf0CHk9RCnzOJWGOY8luNY3iEHl2hdn0qRqBSryTKwD5znedpowphTdIDeXHBzEhkSGTAQ5+VDT9H7j3Fka6BMgmMaNvrmMh/23y6ZEYKvFncTJOBWeHcWX5wdONle1RDEC2YL9hkxZhjC3wIpMwDgDLA3J+Bx8nNhuVJW+eTV6iVaXy4HVojgoIYYyniT64VwFRIYsp9ArCKbWWJz+IIueaZe0eSiOfsH/hIuQIDAQABAoIBAG0/N8h7r+kkbPsXnV0hnPIjNdlqtcp1EINQbdsEba/ChR24oVMW7Zr+t4pMNNOZKVm7Kg0Y0Vqmt+9S5GjWGnvzCM7/fWHlwAJ4sYfsCXm/LRhiHAWhgVMarWyKDvCTAoa4eYFrUrm1VeN734MDqWV7q7tcx0hmUV0yjwXZ/l2zYkiyN5z6ElqNDI7gfKNEBmlCm42qwOEs6Xc3So2+LTSI+fpkLoI0FBqsj0AJ6nKc2gzQzTkfZ0MNY9hd//tCpz8FINxiO3z/ZcKDU90Ug3QIVxXEg/XLEYySPoetaCzaG+Qnrkz4JHBXObppObGmbff+7eConipHMPubCb81xzECgYEA9OyYmy7K+ibsdARgwEweV8KzVYCWND3O0KC/73eNOJi4thqDMV9RVJWp3CgFIVR1c1z3Gf4ZctO9jC/GvmPI72DWc/K9NyrHTGTnZhIVEQy85c9/sdm2SByTOoBWF9OwPlhlP+meOGmMxECvgL3dlFiGUoIYMu7JXNkF/eiS2F0CgYEA1mh+2qSZ6wtuW+F7Z/T4PhKgzWH4by1oOdMc4BDnA4+rw/Yp1emBlnIFr5TbTaQmS+HNl6mXsHyZiZ1/2FNVDPIaKU3nbkEVQ33LYMV/qPUixxH5ArO+btUHDPac7U4hBoxt/xdVTRqjV57x59+/eFHokQ542dekDe12u4orvA0CgYEA06uyS9NJ6p0/Fxk9gJOIWbJUCJ4DsgyEs3tpxYxdyT77y63oGgBVqrNZxIH1xRNYGiaLC7S1y65BD2mu6pYUbwUS8cwkSQw4h8Zg0a7o8/49NqN4qX0Ncw73EsUdIqR5mbgNcQn3Cqv10xpQUwRD/lPvalkyjrod3pdU/VZFqqUCgYEAlYenAMFO/xenzbiBoky8XD4Nm286Hf9i8wEC4FmpY1htiGtDXgZN9ChtQrjkAU/7zWwbQCxsuA8N3WXUZYAojrDCAhBs2P3W4Iz4q/LRR3o+2Or16SaGJzG2ixnq861LZw/FHuSc/vsW8+LL/tSS6kzlj1Syf+reZUA5UC3atnkCgYBfQjNAhDpUJQKpt+9KgdqjBa6YUtVxeFWQF9Ves9Rdk6KSE+mWounV4u3Tq/FUjDaHUOdyfiV+Q5Vrs9yQdwrWRTnMGFCTM6zfJEoU19ahtXaodoeaDpefOZhQU7Nfnv1r/xjlAP/LZsPACPIXPayKK+UWN1/ay2Jq7jp4yWna7Q=="
	// TODO 设置回调地址域名
	kServerDomain = ""
)
 
func main() {
	var err error
	//支付宝提供了用于开发时测试的 sandbox 环境,对接的时候需要注意相关的 app id 和密钥是 sandbox 环境还是 production 环境的。如果是 sandbox 环境,本参数应该传 false,否则为 true。
	if client, err = alipay.New(kAppId, kPrivateKey, false); err != nil {
		log.Println("初始化支付宝失败", err)
		return
	}
 
	// 加载证书
	// 加载应用公钥证书
	if err = client.LoadAppCertPublicKeyFromFile("appPublicCert.crt"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}
	// 加载支付宝根证书
	if err = client.LoadAliPayRootCertFromFile("alipayRootCert.crt"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}
	// 加载支付宝公钥证书
	if err = client.LoadAlipayCertPublicKeyFromFile("alipayPublicCert.crt"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}
	//接口内容加密
	//	if err = client.SetEncryptKey("iotxR/d99T9Awom/UaSqiQ=="); err != nil {
			log.Println("加载内容加密密钥发生错误", err)
			return
		}
	//路由函数
	r := gin.Default()
	r.GET("/alipay/pay", pay)
	r.GET("/alipay/callback", callback)
	r.GET("/alipay/notify", notify)
 
	//http.HandleFunc("/alipay/pay", pay)
	//http.HandleFunc("/alipay/callback", callback)
	//http.HandleFunc("/alipay/notify", notify)
 
	//http.ListenAndServe(":"+kServerPort, nil)
	r.Run()
}
 
func pay(c *gin.Context) {
	var tradeNo = fmt.Sprintf("%d", xid.Next())
 
	var p = alipay.TradePagePay{}
	p.NotifyURL = kServerDomain + "/alipay/notify"
	p.ReturnURL = kServerDomain + "/alipay/callback"
	p.Subject = "支付测试:" + tradeNo
	p.OutTradeNo = tradeNo
	p.TotalAmount = "20.00"
	p.ProductCode = "FAST_INSTANT_TRADE_PAY"
 
	url, _ := client.TradePagePay(p)
	c.Redirect(http.StatusTemporaryRedirect, url.String())
	//http.Redirect(writer, request, url.String(), http.StatusTemporaryRedirect)
}
 
func callback(c *gin.Context) {
	// 解析请求参数
	if err := c.Request.ParseForm(); err != nil {
		log.Println("解析请求参数发生错误", err)
		c.JSON(http.StatusBadRequest, gin.H{"error": "解析请求参数发生错误"})
		return
	}
 
	// 获取通知参数
	outTradeNo := c.Request.Form.Get("out_trade_no")
 
	// 验证签名
	if err := client.VerifySign(c.Request.Form); err != nil {
		log.Println("回调验证签名发生错误", err)
		c.JSON(http.StatusBadRequest, gin.H{"error": "回调验证签名发生错误"})
		return
	}
 
	log.Println("回调验证签名通过")
 
	// 查询订单状态
	var p = alipay.TradeQuery{}
	p.OutTradeNo = outTradeNo
 
	rsp, err := client.TradeQuery(p)
	if err != nil {
		log.Printf("验证订单 %s 信息发生错误: %s", outTradeNo, err.Error())
		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("验证订单 %s 信息发生错误: %s", outTradeNo, err.Error())})
		return
	}
 
	if rsp.IsFailure() {
		log.Printf("验证订单 %s 信息发生错误: %s-%s", outTradeNo, rsp.Msg, rsp.SubMsg)
		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("验证订单 %s 信息发生错误: %s-%s", outTradeNo, rsp.Msg, rsp.SubMsg)})
		return
	}
 
	c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("订单 %s 支付成功", outTradeNo)})
}
func notify(c *gin.Context) {
	// 解析请求参数
	if err := c.Request.ParseForm(); err != nil {
		log.Println("解析请求参数发生错误", err)
		c.JSON(http.StatusBadRequest, gin.H{"error": "解析请求参数发生错误"})
		return
	}
 
	// 解析异步通知
	notification, err := client.DecodeNotification(c.Request.Form)
	if err != nil {
		log.Println("解析异步通知发生错误", err)
		c.JSON(http.StatusBadRequest, gin.H{"error": "解析异步通知发生错误"})
		return
	}
 
	log.Println("解析异步通知成功:", notification.NotifyId)
 
	// 查询订单状态
	var p = alipay.NewPayload("alipay.trade.query")
	p.AddBizField("out_trade_no", notification.OutTradeNo)
 
	var rsp *alipay.TradeQueryRsp
	if err := client.Request(p, &rsp); err != nil {
		log.Printf("异步通知验证订单 %s 信息发生错误: %s", notification.OutTradeNo, err.Error())
		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("异步通知验证订单 %s 信息发生错误: %s", notification.OutTradeNo, err.Error())})
		return
	}
 
	if rsp.IsFailure() {
		log.Printf("异步通知验证订单 %s 信息发生错误: %s-%s", notification.OutTradeNo, rsp.Msg, rsp.SubMsg)
		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("异步通知验证订单 %s 信息发生错误: %s-%s", notification.OutTradeNo, rsp.Msg, rsp.SubMsg)})
		return
	}
 
	log.Printf("订单 %s 支付成功", notification.OutTradeNo)
 
	client.ACKNotification(c.Writer)
}

 

第二步:去支付宝开放平台下载自己的三个密钥证书以及APPID

支付宝开放平台链接

扫码登录

go使用支付宝沙箱实现支付宝支付的操作步骤

进入控制台

go使用支付宝沙箱实现支付宝支付的操作步骤

下滑到最底部点击沙箱

go使用支付宝沙箱实现支付宝支付的操作步骤

go使用支付宝沙箱实现支付宝支付的操作步骤

go使用支付宝沙箱实现支付宝支付的操作步骤

go使用支付宝沙箱实现支付宝支付的操作步骤

 

第三步:在main.go中修改配置信息

(1)修改私钥和KAppId

const (
	kAppId = "9021000134674475"
	//私钥
	kPrivateKey = "MIIEpAIBAAKCAQEAzSHBDVo52MqoAMvn1KFY7iuzFEUHDp/Iya3vK5s6Qp1N9hxvxwbN5Y3CjtyapDyPwBNGFYpxsoDFUOoH55vc5Z0mTxWAI3a9R1WSrL3cAAi7/2DIf0CHk9RCnzOJWGOY8luNY3iEHl2hdn0qRqBSryTKwD5znedpowphTdIDeXHBzEhkSGTAQ5+VDT9H7j3Fka6BMgmMaNvrmMh/23y6ZEYKvFncTJOBWeHcWX5wdONle1RDEC2YL9hkxZhjC3wIpMwDgDLA3J+Bx8nNhuVJW+eTV6iVaXy4HVojgoIYYyniT64VwFRIYsp9ArCKbWWJz+IIueaZe0eSiOfsH/hIuQIDAQABAoIBAG0/N8h7r+kkbPsXnV0hnPIjNdlqtcp1EINQbdsEba/ChR24oVMW7Zr+t4pMNNOZKVm7Kg0Y0Vqmt+9S5GjWGnvzCM7/fWHlwAJ4sYfsCXm/LRhiHAWhgVMarWyKDvCTAoa4eYFrUrm1VeN734MDqWV7q7tcx0hmUV0yjwXZ/l2zYkiyN5z6ElqNDI7gfKNEBmlCm42qwOEs6Xc3So2+LTSI+fpkLoI0FBqsj0AJ6nKc2gzQzTkfZ0MNY9hd//tCpz8FINxiO3z/ZcKDU90Ug3QIVxXEg/XLEYySPoetaCzaG+Qnrkz4JHBXObppObGmbff+7eConipHMPubCb81xzECgYEA9OyYmy7K+ibsdARgwEweV8KzVYCWND3O0KC/73eNOJi4thqDMV9RVJWp3CgFIVR1c1z3Gf4ZctO9jC/GvmPI72DWc/K9NyrHTGTnZhIVEQy85c9/sdm2SByTOoBWF9OwPlhlP+meOGmMxECvgL3dlFiGUoIYMu7JXNkF/eiS2F0CgYEA1mh+2qSZ6wtuW+F7Z/T4PhKgzWH4by1oOdMc4BDnA4+rw/Yp1emBlnIFr5TbTaQmS+HNl6mXsHyZiZ1/2FNVDPIaKU3nbkEVQ33LYMV/qPUixxH5ArO+btUHDPac7U4hBoxt/xdVTRqjV57x59+/eFHokQ542dekDe12u4orvA0CgYEA06uyS9NJ6p0/Fxk9gJOIWbJUCJ4DsgyEs3tpxYxdyT77y63oGgBVqrNZxIH1xRNYGiaLC7S1y65BD2mu6pYUbwUS8cwkSQw4h8Zg0a7o8/49NqN4qX0Ncw73EsUdIqR5mbgNcQn3Cqv10xpQUwRD/lPvalkyjrod3pdU/VZFqqUCgYEAlYenAMFO/xenzbiBoky8XD4Nm286Hf9i8wEC4FmpY1htiGtDXgZN9ChtQrjkAU/7zWwbQCxsuA8N3WXUZYAojrDCAhBs2P3W4Iz4q/LRR3o+2Or16SaGJzG2ixnq861LZw/FHuSc/vsW8+LL/tSS6kzlj1Syf+reZUA5UC3atnkCgYBfQjNAhDpUJQKpt+9KgdqjBa6YUtVxeFWQF9Ves9Rdk6KSE+mWounV4u3Tq/FUjDaHUOdyfiV+Q5Vrs9yQdwrWRTnMGFCTM6zfJEoU19ahtXaodoeaDpefOZhQU7Nfnv1r/xjlAP/LZsPACPIXPayKK+UWN1/ay2Jq7jp4yWna7Q=="
	// TODO 设置回调地址域名
	kServerDomain = ""
)

将私钥 和 KAppId改成自己的

go使用支付宝沙箱实现支付宝支付的操作步骤

(2)将下载好的应用公钥、支付宝公钥证书、支付宝根证书复制到文件夹下

go使用支付宝沙箱实现支付宝支付的操作步骤

(3)修改main.go里支付宝里证书的名称

// 加载应用公钥证书
	if err = client.LoadAppCertPublicKeyFromFile("自己公钥证书的文件名"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}
	// 加载支付宝根证书
	if err = client.LoadAliPayRootCertFromFile("自己支付宝根证书的文件名"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}
	// 加载支付宝公钥证书
	if err = client.LoadAlipayCertPublicKeyFromFile("自己支付宝公钥证书的文件名"); err != nil {
		log.Println("加载证书发生错误", err)
		return
	}

结束 

在控制台的沙箱操作时可以查看自己的沙箱账号用于模拟收付款

go使用支付宝沙箱实现支付宝支付的操作步骤

以上就是go使用支付宝沙箱实现支付宝支付的操作步骤的详细内容,更多关于go支付宝沙箱支付的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/xiao_xiao_w/article/details/136586052

延伸 · 阅读

精彩推荐
  • Golanggolang之log rotate详解

    golang之log rotate详解

    下面小编就为大家带来一篇golang之log rotate详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    jingxian6622020-05-07
  • Golang详解golang开发中http请求redirect的问题

    详解golang开发中http请求redirect的问题

    这篇文章主要介绍了详解golang开发中http请求redirect的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    飞翔码农5692021-01-31
  • GolangGo语言小白入门刷题打印输出沙漏

    Go语言小白入门刷题打印输出沙漏

    这篇文章主要介绍了Go语言刷题打印输出沙漏的示例过程详解,非常适合刚入门Go语言的小白学习,有需要的朋友可以借鉴参考下,希望能够有所帮助...

    小生凡一11662021-12-02
  • GolangGolang通脉之类型定义

    Golang通脉之类型定义

    这篇文章主要介绍了Golang通脉之类型定义,在Go语言中有一些基本的数据类型,如 string 、 整型 、 浮点型 、 布尔 等数据类型, Go语言中可以使用 type 关键...

    5912021-11-24
  • Golanggo中string、int、float相互转换的实现示例

    go中string、int、float相互转换的实现示例

    本文主要介绍了go中string、int、float相互转换的实现示例,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    _七里香5642022-09-07
  • Golanggo zero微服务实战系服务拆分

    go zero微服务实战系服务拆分

    这篇文章主要为大家介绍了go zero微服务实战系服务拆分的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    万俊峰Kevin11652022-10-24
  • GolangGolang实现AES加密和解密的示例代码

    Golang实现AES加密和解密的示例代码

    AES( advanced encryption standard)使用相同密钥进行加密和解密,也就是对称加密。本文将详细讲解Golang实现AES加密和解密的方法,感兴趣的可以学习一下...

    醉奕笑9162022-10-07
  • Golang详解Go flag实现二级子命令的方法

    详解Go flag实现二级子命令的方法

    这篇文章主要介绍了Go flag 详解,实现二级子命令,本文就探讨一下 Go 语言中如何写一个拥有类似特性的命令行程序,需要的朋友可以参考下...

    YahuiAn6952022-07-08