package main import ( "fmt" "github.com/gin-gonic/gin" "github.com/smartwalle/alipay/v3" "github.com/smartwalle/xid" "log" "net/http" ) var aliClient *alipay.Client const ( kAppId = "2021000119666270" 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" kServerPort = "9989" kServerDomain = "http://127.0.0.1" + ":" + kServerPort ) func main() { var err error if aliClient, err = alipay.New(kAppId, kPrivateKey, false); err != nil { log.Println("初始化支付宝失败", err) return } //应用公钥证书 if err = aliClient.LoadAppPublicCertFromFile("appCertPublicKey_2021000119666270.crt"); err != nil { log.Println("加载应用公钥证书发生错误", err) return } //支付宝根证书 if err = aliClient.LoadAliPayRootCertFromFile("alipayRootCert.crt"); err != nil { log.Println("加载支付宝根证书发生错误", err) return } //支付宝公钥证书 if err = aliClient.LoadAliPayPublicCertFromFile("alipayCertPublicKey_RSA2.crt"); err != nil { log.Println("加载支付宝公钥证书发生错误", err) return } //生成支付URL //WapAlipay() //WebPageAlipay() var s = gin.Default() s.GET("/alipay", pay) s.GET("/callback", callback) s.POST("/notify", notify) s.Run(":" + kServerPort) } func pay(c *gin.Context) { var orderId = fmt.Sprintf("%d", xid.Next()) var p = alipay.TradePagePay{} p.NotifyURL = kServerDomain + "/notify" p.ReturnURL = kServerDomain + "/callback" p.Subject = "Avata 服务平台资金账户充值" p.OutTradeNo = orderId p.TotalAmount = "0.01" p.ProductCode = "FAST_INSTANT_TRADE_PAY" url, _ := aliClient.TradePagePay(p) c.Redirect(http.StatusTemporaryRedirect, url.String()) } func callback(c *gin.Context) { c.Request.ParseForm() ok, err := aliClient.VerifySign(c.Request.Form) if err != nil { log.Println("回调验证签名发生错误", err) return } if ok == false { log.Println("回调验证签名未通过") return } var outTradeNo = c.Request.Form.Get("out_trade_no") var p = alipay.TradeQuery{} p.OutTradeNo = outTradeNo rsp, err := aliClient.TradeQuery(p) if err != nil { c.String(http.StatusBadRequest, "验证订单 %s 信息发生错误: %s", outTradeNo, err.Error()) return } if rsp.IsSuccess() == false { c.String(http.StatusBadRequest, "验证订单 %s 信息发生错误: %s-%s", outTradeNo, rsp.Content.Msg, rsp.Content.SubMsg) return } c.String(http.StatusOK, "订单 %s 支付成功", outTradeNo) } func notify(c *gin.Context) { c.Request.ParseForm() ok, err := aliClient.VerifySign(c.Request.Form) if err != nil { log.Println("异步通知验证签名发生错误", err) return } if ok == false { log.Println("异步通知验证签名未通过") return } log.Println("异步通知验证签名通过") var outTradeNo = c.Request.Form.Get("out_trade_no") var p = alipay.TradeQuery{} p.OutTradeNo = outTradeNo rsp, err := aliClient.TradeQuery(p) if err != nil { log.Printf("异步通知验证订单 %s 信息发生错误: %s \n", outTradeNo, err.Error()) return } if rsp.IsSuccess() == false { log.Printf("异步通知验证订单 %s 信息发生错误: %s-%s \n", outTradeNo, rsp.Content.Msg, rsp.Content.SubMsg) return } log.Printf("订单 %s 支付成功 \n", outTradeNo) }