- 前景
- 开发环境
- Go 基础
- 流程控制
- 函数
- 方法
- 面向对象
- 网络编程
- 并发编程
- 数据操作
- 常用标准库
- beego 框架
- gin 框架
- 微服务
- 插件库
- 项目
- 开源仓库
- go 学习线路图
- 音频和音乐
- 身份验证和 OAuth
- 机器人相关
- 标准 CLI
- 构建用户界面库
- 配置
- 持续集成
- CSS 预处理器
- 数据结构
- 数据库
- 数据库驱动
- 日期和时间
- 分布式系统
- 电子邮件
- 嵌入式脚本语言
- 错误处理
- 文件
- 金融
- Forms
- 功能性
- 游戏开发
- 生成与泛型
- 地理位置
- 编译器
- Goroutines
- 图形界面
- 图片
- 物联网
- 工作计划
- JSON格式
- Logging
- 机器学习
- 实现消息传递
- 微软办公软件
- 依赖注入
- 项目布局
- Strings
- 其他
- 自然语言处理
- 网络
- HTTP 客户端
- OpenGL
- ORM
- 包管理
- 性能
- 查询语言
- 资源嵌入
- 科学与数据分析
- 安全
- 序列化
- 服务器应用
- 流处理
- 模板引擎
- 测试
- 文字处理
- 第三方 API
- 实用工具
- UUID
- 验证方式
- 版本控制
- 视频
- Web 框架
- 中间件
- 路由器
- 视窗
- XML 格式
- 代码分析
- 编辑器插件
- 硬件
- go 生成工具
- go 工具
- DevOps 工具
- 其他
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
支付宝支付
本文采用沙箱环境
1.1.1. 开启沙箱
文档:https://docs.open.alipay.com/200/105311/ 沙箱地址:https://openhome.alipay.com/platform/appDaily.htm
1.1.2. 生成秘钥(已弃用,请直接使用步骤 3)
本文中的签名方法默认为 RSA2,采用支付宝提供的 RSA 签名 & 验签工具 生成秘钥时,秘钥的格式必须为 PKCS1,秘钥长度推荐 2048。所以在支付宝管理后台请注意配置 RSA2 (SHA256) 密钥。 生成秘钥对之后,将公钥提供给支付宝(通过支付宝后台上传)对我们请求的数据进行签名验证,我们的代码中将使用私钥对请求数据签名。
RSA 签名和验证工具下载:https://docs.open.alipay.com/291/105971
- 下载之后解压
- 双击 RSA签名验签工具.bat
- 秘钥格式选择 PKCS1
- 点击生成秘钥
- 复制公钥
- 回到沙箱中,点击查看应用公钥,然后点击修改
- 保存好私钥,我们一会需要在代码中用到
- 复制支付宝公钥,代码中验证需要用到
- 配置支付成功后的回调地址
1.1.3. 证书认证
目前新创建的支付宝应用只支持证书方式认证,已经弃用之前的公钥和私钥的方式
公钥秘钥说明
我们生成秘钥对之后,将公钥提供给支付宝(通过支付宝后台上传)对我们请求的数据进行签名验证,我们的代码中使用私钥对请求数据签名。
- 证书签名请求文件(用来提交给支付宝后台生成证书的)
- 应用私钥(调用支付宝接口的时候,我们需要使用该私钥对参数进行签名)
- 支付宝公钥证书(用来验证我们的签名的,现在已经被支付宝公钥证书取代)
下载生成工具
生成 csr 证书签名请求文件
工具安装好之后打开,点击获取
输入信息
主要是组织/公司这块一定要写的和你支付宝中应用的名一样,不然不会通过的,填写完毕之后点击生成CSR文件 ,点击页面的打开文件位置,就可以看到三个文件了,分别是证书签名请求文件,应用公钥,应用私钥
上传 CSR 证书签名请求文件
回到支付宝后台,点击 接口加签方式 设置,选择公钥证书,点击上次 CSR 生成证书,把我们刚才生成的那个证书 (.csr) 上传进去
下载证书
上传好之后,会弹出让你下载证书的页面,把那三个证书都下载下来,分别是:应用公钥证书,支付宝公钥证书,支付宝根证书
1.1.4. 代码部分
下载第三方库
go get github.com/smartwalle/alipay/v3
网页扫码支付
package main
import (
"fmt"
"github.com/smartwalle/alipay"
"net/http"
"os/exec"
"strings"
"time"
)
var (
// appId
appId = ""
// 应用公钥(跟csr文件同级目录)
aliPublicKey = ""
// 应用私钥(跟csr文件同级目录)
privateKey = ""
client, _ = alipay.New(appId, aliPublicKey, privateKey, false)
)
func init() {
client.LoadAppPublicCert("应用公钥证书")
client.LoadAliPayPublicCert("支付宝公钥证书")
client.LoadAliPayRootCert("支付宝根证书")
}
//网站扫码支付
func WebPageAlipay() {
pay := alipay.AliPayTradePagePay{}
// 支付成功之后,支付宝将会重定向到该 URL
pay.ReturnURL = "http://localhost:8088/return"
//支付标题
pay.Subject = "支付宝支付测试"
//订单号,一个订单号只能支付一次
pay.OutTradeNo = time.Now().String()
//销售产品码,与支付宝签约的产品码名称,目前仅支持FAST_INSTANT_TRADE_PAY
pay.ProductCode = "FAST_INSTANT_TRADE_PAY"
//金额
pay.TotalAmount = "0.01"
url, err := client.TradePagePay(pay)
if err != nil {
fmt.Println(err)
}
payURL := url.String()
//这个 payURL 即是用于支付的 URL,可将输出的内容复制,到浏览器中访问该 URL 即可打开支付页面。
fmt.Println(payURL)
//打开默认浏览器
payURL = strings.Replace(payURL,"&","^&",-1)
exec.Command("cmd", "/c", "start",payURL).Start()
}
//手机客户端支付
func WapAlipay() {
pay := alipay.AliPayTradeWapPay{}
// 支付成功之后,支付宝将会重定向到该 URL
pay.ReturnURL = "http://localhost:8088/return"
//支付标题
pay.Subject = "支付宝支付测试"
//订单号,一个订单号只能支付一次
pay.OutTradeNo = time.Now().String()
//商品code
pay.ProductCode = time.Now().String()
//金额
pay.TotalAmount = "0.01"
url, err := client.TradeWapPay(pay)
if err != nil {
fmt.Println(err)
}
payURL := url.String()
//这个 payURL 即是用于支付的 URL,可将输出的内容复制,到浏览器中访问该 URL 即可打开支付页面。
fmt.Println(payURL)
//打开默认浏览器
payURL = strings.Replace(payURL,"&","^&",-1)
exec.Command("cmd", "/c", "start",payURL).Start()
}
func main() {
//生成支付URL
WapAlipay()
// 支付成功之后的返回URL页面
http.HandleFunc("/return", func(rep http.ResponseWriter, req *http.Request) {
req.ParseForm()
ok, err := client.VerifySign(req.Form)
if err == nil && ok {
rep.Write([]byte("支付成功"))
}
})
fmt.Println("server start....")
http.ListenAndServe(":8088", nil)
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论