本文采用沙箱环境

1. 开启沙箱

文档:https://docs.open.alipay.com/200/105311/
沙箱地址:https://openhome.alipay.com/platform/appDa...

2. 生成秘钥(已弃用,请直接使用步骤3)

本文中的签名方法默认为 RSA2,采用支付宝提供的 RSA签名&验签工具 生成秘钥时,秘钥的格式必须为 PKCS1,秘钥长度推荐 2048。所以在支付宝管理后台请注意配置 RSA2(SHA256)密钥。
生成秘钥对之后,将公钥提供给支付宝(通过支付宝后台上传)对我们请求的数据进行签名验证,我们的代码中将使用私钥对请求数据签名。

RSA签名验签工具.batPKCS1
3. 证书认证

目前新创建的支付宝应用只支持证书方式认证,已经弃用之前的公钥和私钥的方式

公钥秘钥说明

我们生成秘钥对之后,将公钥提供给支付宝(通过支付宝后台上传)对我们请求的数据进行签名验证,我们的代码中使用私钥对请求数据签名。

  • 证书签名请求文件(用来提交给支付宝后台生成证书的)
  • 应用私钥(调用支付宝接口的时候,我们需要使用该私钥对参数进行签名)
  • 支付宝公钥证书(用来验证我们的签名的,现在已经被支付宝公钥证书取代)

3.1 下载生成工具

3.2 生成csr证书签名请求文件

工具安装好之后打开,点击获取

3.3 输入信息

生成CSR文件证书签名请求文件应用公钥应用私钥

3.4 上传CSR证书签名请求文件

接口加签方式.csr
代码部分
go get github.com/smartwalle/alipay/v3

1. 网页扫码支付

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)
}