源于我电商项目的支付模块,因为是练手项目,所以使用的是沙盒环境
1. 开启沙盒
文档:opendocs.alipay.com/common/02kk…
2. 生成证书
进入沙盒地址生成证书

生成证书后查看

将三个证书下载后放到项目目录,并复制私钥
3. 编码
获取 sdk :`go get github.com/smartwalle/alipay/v3
package main
import (
"fmt"
"github.com/smartwalle/alipay/v3"
"log"
"net/http"
"time"
)
var (
appId = "2021000122675958"
// 将上面复制的私钥放在这里
privateKey = ""
client, _ = alipay.New(appId, privateKey, false)
)
// 网站扫码支付
func WebPageAlipay() {
client.LoadAppPublicCertFromFile("appPublicCert.crt") // 加载应用公钥证书
client.LoadAliPayRootCertFromFile("alipayRootCert.crt") // 加载支付宝根证书
client.LoadAliPayPublicCertFromFile("alipayPublicCert.crt") // 加载支付宝公钥证书
pay := alipay.TradePagePay{}
// 支付成功之后,支付宝将会重定向到该 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)
}
func main() {
//生成支付URL
WebPageAlipay()
// 支付成功之后的返回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("支付成功"))
} else {
log.Println(err)
}
})
fmt.Println("server start....")
http.ListenAndServe(":8088", nil)
}
4. 支付
执行函数后终端会打印支付 url ,复制 url 到游览器打开即可得到支付页面

这里因为是沙盒环境,二维码是无效的,我们使用沙盒环境为我们提供的账号密码进行支付,地址为上面获取证书的地址

将账号密码输入后完成支付
5. 回调
完成支付后会重定向我们在代码中设置的 ReturnURL ,在上面的代码中,我们调用client.VerifySign方法对支付宝给我们返回的参数进行验证,验证通过就会执行req.Write方法

效果就是在游览器中出现支付成功字样
6. 总结
其实就是获取证书,调接口的过程,在实际开发中还需要考虑付款失败,回调后的处理逻辑等等