为 Go 应用接入支付宝支付

814 阅读2分钟

源于我电商项目的支付模块,因为是练手项目,所以使用的是沙盒环境

1. 开启沙盒

文档:opendocs.alipay.com/common/02kk…

2. 生成证书

进入沙盒地址生成证书

image.png

生成证书后查看

image.png

将三个证书下载后放到项目目录,并复制私钥

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 到游览器打开即可得到支付页面

image.png

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

image.png

将账号密码输入后完成支付

5. 回调

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

image.png

效果就是在游览器中出现支付成功字样

6. 总结

其实就是获取证书,调接口的过程,在实际开发中还需要考虑付款失败,回调后的处理逻辑等等