main.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "github.com/smartwalle/alipay/v3"
  6. "github.com/smartwalle/xid"
  7. "log"
  8. "net/http"
  9. )
  10. var aliClient *alipay.Client
  11. const (
  12. kAppId = "2021000119666270"
  13. kPrivateKey = "MIIEowIBAAKCAQEAkbkW2kQldWDejDYjRWyBSjHua0kSLHj/jHW01zXTUjTOr+iWssepFPANjWGskbNUIF3frZEDfLIC3TPGGm1+2PQceG1YTXtHm0biOfO8tWR8z6htYxmWaTBShQpGKsMDL54WNOfrxr9SA6u77YkEdmfvGm213mQHKb6M9U2T/I3svii9nLiv71CWVsXSpQdZBE8hY4Sk/RBltqdQ0btqdzIp7Z7H5gPv66Jdms3ewlUjt96SokSDxo4qo4tPToDqDmGeheHqgC6IbpeyCMEZVs3QBtCChB3NPFcdEyxbhgJ9J6zo9tsdDNGTTs4Bn2ALsXbllyrVs1oznv+OCO381wIDAQABAoIBAGp26LxUt21XdaDI2OIa0Sbs7fzSKQX27PWo9ZOaTqcrz6nza0540w5qB+y4ZMUaWKdBDm+XmA2dXLxR3DVotBk72CUf9ji9jeZjVlryuXdpUErDChAyHJMDa/apN/R7/7Llc+H5Y2gUVY47BRUZWvpLGwSbDRnKyPT1s7RwlmMYBugmoREpIknQbzrsygOH27dw6QPdJRgng8Uy1K7/KD8Ycf2i0jUfcHhGmsWysJofr723bjq0j7T2XALekiPzPlH85mf1rdBWtCcTuOZ8J/6A5HQJhn57KABiK3MrB5X7DTapz5htiiiEfq/+TVdsc3+uYYWZMVpYn/kM8oLELlECgYEA92ksUssXz/iDm+GrNz4n5wxuOXhQsN/F4/QoekeBUkqr7ixhJH/K9EQWjdYsHeE+HzZkXf9bJr9deXyMJSNbfGkJhdK5pezVunpm/W1uR021R6giHGyvA6JLsX9svdqhGxiMJnNs6bWAGvm8ZexIdzHmnBJPuDeF1FQwhtWspq8CgYEAlsguRIcYjO0tplfN9WuveWoa5IDlV8iu8WSIA2+pHBS3tzOopU7vSw2GzTSY/n6M/aTZd1AdjJrFkANQ2u3ngg11Ajv1woZqg99qAUfy0eSbIPIhK9GsHvkh/TNLIY8da+i2bOyHEzlMi3RV75FQP7z1ii+iAM/6yoZvLUT7FlkCgYEArTEVkvuStsYbsyJdTbWYDzh3bImZysdK6xD+yOKHV8jn5Dly4y8GLsn/E9kKVvxXFVhpGBfqggxR7fpOzKycnVGWFfT2en14/Co1MFDLcuSl8vxyrH00YpHY9O7je1+xiZs8eKoyYsPoYnnR9XNbIv1ulnCHF8jeSU2KDslDLAcCgYAXOJsPiLK6OWi3XnxkmIH8s9+SY1tuqoRuvqnHxbGIlpQ4jaciVka6C0pAXiJVx02VXobzPg5e8hMM+8W/AbaOq93iSzOtEqBi0Mx1iAwYURmm+EMtiWv1lS6r3PNsJqtETCGUItUmm8NzEqaNb5apSkOSVYWglGcuO4fxs9breQKBgBcm+9GvriyH0Rvd0iXCTXLcd80oLCgkAgyKyOY42MTT4akFHG1P9mE8tUzZefqWGsNC3zycaOXSz4OIElIie+LnWMeKp1QpR3tV2EKX1am9IZeqm9SRa/7Fk7PQJS5/MFmHoDhhv7XoxZamjXphkpoQKtbCOaeYZCqb+XwPyxo5"
  14. kServerPort = "9989"
  15. kServerDomain = "http://127.0.0.1" + ":" + kServerPort
  16. )
  17. func main() {
  18. var err error
  19. if aliClient, err = alipay.New(kAppId, kPrivateKey, false); err != nil {
  20. log.Println("初始化支付宝失败", err)
  21. return
  22. }
  23. //应用公钥证书
  24. if err = aliClient.LoadAppPublicCertFromFile("appCertPublicKey_2021000119666270.crt"); err != nil {
  25. log.Println("加载应用公钥证书发生错误", err)
  26. return
  27. }
  28. //支付宝根证书
  29. if err = aliClient.LoadAliPayRootCertFromFile("alipayRootCert.crt"); err != nil {
  30. log.Println("加载支付宝根证书发生错误", err)
  31. return
  32. }
  33. //支付宝公钥证书
  34. if err = aliClient.LoadAliPayPublicCertFromFile("alipayCertPublicKey_RSA2.crt"); err != nil {
  35. log.Println("加载支付宝公钥证书发生错误", err)
  36. return
  37. }
  38. //生成支付URL
  39. //WapAlipay()
  40. //WebPageAlipay()
  41. var s = gin.Default()
  42. s.GET("/alipay", pay)
  43. s.GET("/callback", callback)
  44. s.POST("/notify", notify)
  45. s.Run(":" + kServerPort)
  46. }
  47. func pay(c *gin.Context) {
  48. var orderId = fmt.Sprintf("%d", xid.Next())
  49. var p = alipay.TradePagePay{}
  50. p.NotifyURL = kServerDomain + "/notify"
  51. p.ReturnURL = kServerDomain + "/callback"
  52. p.Subject = "Avata 服务平台资金账户充值"
  53. p.OutTradeNo = orderId
  54. p.TotalAmount = "0.01"
  55. p.ProductCode = "FAST_INSTANT_TRADE_PAY"
  56. url, _ := aliClient.TradePagePay(p)
  57. c.Redirect(http.StatusTemporaryRedirect, url.String())
  58. }
  59. func callback(c *gin.Context) {
  60. c.Request.ParseForm()
  61. ok, err := aliClient.VerifySign(c.Request.Form)
  62. if err != nil {
  63. log.Println("回调验证签名发生错误", err)
  64. return
  65. }
  66. if ok == false {
  67. log.Println("回调验证签名未通过")
  68. return
  69. }
  70. var outTradeNo = c.Request.Form.Get("out_trade_no")
  71. var p = alipay.TradeQuery{}
  72. p.OutTradeNo = outTradeNo
  73. rsp, err := aliClient.TradeQuery(p)
  74. if err != nil {
  75. c.String(http.StatusBadRequest, "验证订单 %s 信息发生错误: %s", outTradeNo, err.Error())
  76. return
  77. }
  78. if rsp.IsSuccess() == false {
  79. c.String(http.StatusBadRequest, "验证订单 %s 信息发生错误: %s-%s", outTradeNo, rsp.Content.Msg, rsp.Content.SubMsg)
  80. return
  81. }
  82. c.String(http.StatusOK, "订单 %s 支付成功", outTradeNo)
  83. }
  84. func notify(c *gin.Context) {
  85. c.Request.ParseForm()
  86. ok, err := aliClient.VerifySign(c.Request.Form)
  87. if err != nil {
  88. log.Println("异步通知验证签名发生错误", err)
  89. return
  90. }
  91. if ok == false {
  92. log.Println("异步通知验证签名未通过")
  93. return
  94. }
  95. log.Println("异步通知验证签名通过")
  96. var outTradeNo = c.Request.Form.Get("out_trade_no")
  97. var p = alipay.TradeQuery{}
  98. p.OutTradeNo = outTradeNo
  99. rsp, err := aliClient.TradeQuery(p)
  100. if err != nil {
  101. log.Printf("异步通知验证订单 %s 信息发生错误: %s \n", outTradeNo, err.Error())
  102. return
  103. }
  104. if rsp.IsSuccess() == false {
  105. log.Printf("异步通知验证订单 %s 信息发生错误: %s-%s \n", outTradeNo, rsp.Content.Msg, rsp.Content.SubMsg)
  106. return
  107. }
  108. log.Printf("订单 %s 支付成功 \n", outTradeNo)
  109. }