1. 支付宝支付

本文采用沙箱环境

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

  • 保存好私钥,我们一会需要在代码中用到
  • 复制支付宝公钥,代码中验证需要用到

支付宝支付 - 图2

  • 配置支付成功后的回调地址

支付宝支付 - 图3

1.1.3. 证书认证

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

公钥秘钥说明

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

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

下载生成工具

支付宝支付 - 图4

生成 csr 证书签名请求文件

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

支付宝支付 - 图5

输入信息

主要是组织/公司这块一定要写的和你支付宝中应用的名一样,不然不会通过的,填写完毕之后点击生成CSR文件 ,点击页面的打开文件位置,就可以看到三个文件了,分别是证书签名请求文件,应用公钥,应用私钥

支付宝支付 - 图6

上传 CSR 证书签名请求文件

回到支付宝后台,点击 接口加签方式 设置,选择公钥证书,点击上次 CSR 生成证书,把我们刚才生成的那个证书 (.csr) 上传进去

支付宝支付 - 图7

下载证书

上传好之后,会弹出让你下载证书的页面,把那三个证书都下载下来,分别是:应用公钥证书,支付宝公钥证书,支付宝根证书

支付宝支付 - 图8

1.1.4. 代码部分

下载第三方库

  1. go get github.com/smartwalle/alipay/v3

网页扫码支付

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/smartwalle/alipay"
  5. "net/http"
  6. "os/exec"
  7. "strings"
  8. "time"
  9. )
  10. var (
  11. // appId
  12. appId = ""
  13. // 应用公钥(跟csr文件同级目录)
  14. aliPublicKey = ""
  15. // 应用私钥(跟csr文件同级目录)
  16. privateKey = ""
  17. client, _ = alipay.New(appId, aliPublicKey, privateKey, false)
  18. )
  19. func init() {
  20. client.LoadAppPublicCert("应用公钥证书")
  21. client.LoadAliPayPublicCert("支付宝公钥证书")
  22. client.LoadAliPayRootCert("支付宝根证书")
  23. }
  24. //网站扫码支付
  25. func WebPageAlipay() {
  26. pay := alipay.AliPayTradePagePay{}
  27. // 支付成功之后,支付宝将会重定向到该 URL
  28. pay.ReturnURL = "http://localhost:8088/return"
  29. //支付标题
  30. pay.Subject = "支付宝支付测试"
  31. //订单号,一个订单号只能支付一次
  32. pay.OutTradeNo = time.Now().String()
  33. //销售产品码,与支付宝签约的产品码名称,目前仅支持FAST_INSTANT_TRADE_PAY
  34. pay.ProductCode = "FAST_INSTANT_TRADE_PAY"
  35. //金额
  36. pay.TotalAmount = "0.01"
  37. url, err := client.TradePagePay(pay)
  38. if err != nil {
  39. fmt.Println(err)
  40. }
  41. payURL := url.String()
  42. //这个 payURL 即是用于支付的 URL,可将输出的内容复制,到浏览器中访问该 URL 即可打开支付页面。
  43. fmt.Println(payURL)
  44. //打开默认浏览器
  45. payURL = strings.Replace(payURL,"&","^&",-1)
  46. exec.Command("cmd", "/c", "start",payURL).Start()
  47. }
  48. //手机客户端支付
  49. func WapAlipay() {
  50. pay := alipay.AliPayTradeWapPay{}
  51. // 支付成功之后,支付宝将会重定向到该 URL
  52. pay.ReturnURL = "http://localhost:8088/return"
  53. //支付标题
  54. pay.Subject = "支付宝支付测试"
  55. //订单号,一个订单号只能支付一次
  56. pay.OutTradeNo = time.Now().String()
  57. //商品code
  58. pay.ProductCode = time.Now().String()
  59. //金额
  60. pay.TotalAmount = "0.01"
  61. url, err := client.TradeWapPay(pay)
  62. if err != nil {
  63. fmt.Println(err)
  64. }
  65. payURL := url.String()
  66. //这个 payURL 即是用于支付的 URL,可将输出的内容复制,到浏览器中访问该 URL 即可打开支付页面。
  67. fmt.Println(payURL)
  68. //打开默认浏览器
  69. payURL = strings.Replace(payURL,"&","^&",-1)
  70. exec.Command("cmd", "/c", "start",payURL).Start()
  71. }
  72. func main() {
  73. //生成支付URL
  74. WapAlipay()
  75. // 支付成功之后的返回URL页面
  76. http.HandleFunc("/return", func(rep http.ResponseWriter, req *http.Request) {
  77. req.ParseForm()
  78. ok, err := client.VerifySign(req.Form)
  79. if err == nil && ok {
  80. rep.Write([]byte("支付成功"))
  81. }
  82. })
  83. fmt.Println("server start....")
  84. http.ListenAndServe(":8088", nil)
  85. }

转自:https://learnku.com/go/t/31515