|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + "github.com/gin-gonic/gin" |
| 6 | + "github.com/smartwalle/alipay/v3" |
| 7 | + "github.com/smartwalle/xid" |
| 8 | + "log" |
| 9 | + "net/http" |
| 10 | +) |
| 11 | + |
| 12 | +var aliClient *alipay.Client |
| 13 | + |
| 14 | +const ( |
| 15 | + kAppId = "2016073100129537" |
| 16 | + kPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC4UOTKtDstRrjyNPvek9eGqv1RYDmHtLw7olq4lBtqF/D+BfrPd04rMYoivqO5r+v1DQNUGs2yC48eQ4eWb0TSjl/kUy2jHzDcUGiZrGhgxw3e/TJ9w7ix6TrixVg5n542oC1zWstOl75gkiL7EkDfEKo/fZUbLt8aHgBW87NYE19obfAOxGn+YsH5Hpkl3GGby37Hq/mcX4tcWDYN55JPaAcSyjyeyl/uMA19StmQEuU992jqqYWd5Y3z58DotiD4dVAtjB5VogmCkLUcalvUB3N/z3y67GQT+gtOi42VfxnW/JoaXKurHK9Ukmw1GPu97iZAF3Sy19+mOdeR8I+RAgMBAAECggEAAXlEGwrN3lLOb8FUsjbkZkM/u0LVsuwTBTcLGqa0gWinmKBbnQULLvU6cYSssnNho5fzCt0b/+xvvII1t1I0bqqMwbqYhtFdBqXt8CycuQleZwYHPVIvS9zdh6qkRfGsxisJsf5r2bkE4KjKds9yjVYIxnEunAUH66GJxygzquSZQPxgYB3ASRkTzRRowe3ROqaGLF2ejEcvcASKAiIEaQ6Az0sMDtIUAcqFcN1mp9TQ+UyOgNsTw8qWHKv6z6XwjSfYcVfNhR5bcsf+3zr8CKK7cD6f6cjtIrrDSeDdbjdqXTMEYEOV4qs2PH6mNJwx2V1mAZKNZ3bIRGSiKme+sQKBgQD5UDqLBySXtqsCpMC31SvuHGOlkwEQAKslytJvE1kerh4VV9DCIyRsV9v57GZSc8HGo/AQq7dJAa3X9mumZ4vL8RIrtMkuU+scwT+AzPx8jeibNKLq1GI4GaPmdHJaJsBGtA2VUphWCw1HvHegJGgPUoymfpOc8iKwMdQZO3ZHxwKBgQC9QmWJ6zoBvkIOZdoNHpOMrHkIphzJagC/2dbdH6x58fEX787Nmd8yL3mU189EENmFJAdw9d5kPzi8Nxa84oIsbsQSTaYuF0VN6Kw+dZstoJ3U4pf5ReKjWiRNk6waeg6pzEYwH7mDbLcGBw+0+gW08KJLfsyl6aejJ75i9cnd5wKBgHa7UZYiabfi46BXq/wghlJYrNAOqWPgnaFa7Uq+0SN+Uo9hieba6565XOayQaykujUKn+qgjKI1LYB7N5tBFt+iSEAOUf1BM+g21DJX7Sq4Pn2j3K6vRLNo6ph2/nqWl91UJF/nvOrFSqbOR745eGFLs/Yas9v7qK92m4cEvXjDAoGAG2cOrp55YqE6jT0gCkBAGuEqER+EEYGgpCaVXqTkYy+tucqGBezejTSkhPGOWAucgxOJZEilL5ybyVyslSKyuF49U20cv5Ws+i/TKKP8mOmlkJpSaMw+mWpG0VitVZQQpXMnQnaFdMr74QqKsqh0xRMGXKn6VZd0J0Js5YUy+kcCgYEA5dxAzYHV2yH2/b/Uau99VUtp+xE3BssiEO5CiVLEvzLLQlqcqtFO3ptTMqfTeqe98iiYcr5EMSqLHte1qQeGziyKzPvMHkjrTPMDccVur0L2fcE+WBy2fNdBDzQQ5k3ra27/i5NcRzNAhoBXBNVRwnrLXpaUEjy7ERCoR6y1XkE=" |
| 17 | + kServerPort = "9989" |
| 18 | + kServerDomain = "http://127.0.0.1" + ":" + kServerPort |
| 19 | +) |
| 20 | + |
| 21 | +func main() { |
| 22 | + var err error |
| 23 | + |
| 24 | + if aliClient, err = alipay.New(kAppId, kPrivateKey, false); err != nil { |
| 25 | + log.Println("初始化支付宝失败", err) |
| 26 | + return |
| 27 | + } |
| 28 | + |
| 29 | + // 使用支付宝证书 |
| 30 | + if err = aliClient.LoadAppPublicCertFromFile("appCertPublicKey_2016073100129537.crt"); err != nil { |
| 31 | + log.Println("加载证书发生错误", err) |
| 32 | + return |
| 33 | + } |
| 34 | + |
| 35 | + if err = aliClient.LoadAliPayRootCertFromFile("alipayRootCert.crt"); err != nil { |
| 36 | + log.Println("加载证书发生错误", err) |
| 37 | + return |
| 38 | + } |
| 39 | + if err = aliClient.LoadAliPayPublicCertFromFile("alipayCertPublicKey_RSA2.crt"); err != nil { |
| 40 | + log.Println("加载证书发生错误", err) |
| 41 | + return |
| 42 | + } |
| 43 | + |
| 44 | + var s = gin.Default() |
| 45 | + s.GET("/alipay", pay) |
| 46 | + s.GET("/callback", callback) |
| 47 | + s.POST("/notify", notify) |
| 48 | + s.Run(":" + kServerPort) |
| 49 | +} |
| 50 | + |
| 51 | +func pay(c *gin.Context) { |
| 52 | + var tradeNo = fmt.Sprintf("%d", xid.Next()) |
| 53 | + |
| 54 | + var p = alipay.TradePagePay{} |
| 55 | + p.NotifyURL = kServerDomain + "/notify" |
| 56 | + p.ReturnURL = kServerDomain + "/callback" |
| 57 | + p.Subject = "支付测试:" + tradeNo |
| 58 | + p.OutTradeNo = tradeNo |
| 59 | + p.TotalAmount = "10.00" |
| 60 | + p.ProductCode = "FAST_INSTANT_TRADE_PAY" |
| 61 | + |
| 62 | + url, _ := aliClient.TradePagePay(p) |
| 63 | + |
| 64 | + c.Redirect(http.StatusTemporaryRedirect, url.String()) |
| 65 | +} |
| 66 | + |
| 67 | +func callback(c *gin.Context) { |
| 68 | + c.Request.ParseForm() |
| 69 | + |
| 70 | + //ok, err := aliClient.VerifySign(c.Request.Form) |
| 71 | + //if err != nil { |
| 72 | + // log.Println("回调验证签名发生错误", err) |
| 73 | + // return |
| 74 | + //} |
| 75 | + // |
| 76 | + //if ok == false { |
| 77 | + // log.Println("回调验证签名未通过") |
| 78 | + // return |
| 79 | + //} |
| 80 | + |
| 81 | + var outTradeNo = c.Request.Form.Get("out_trade_no") |
| 82 | + var p = alipay.TradeQuery{} |
| 83 | + p.OutTradeNo = outTradeNo |
| 84 | + rsp, err := aliClient.TradeQuery(p) |
| 85 | + if err != nil { |
| 86 | + c.String(http.StatusBadRequest, "验证订单 %s 信息发生错误: %s", outTradeNo, err.Error()) |
| 87 | + return |
| 88 | + } |
| 89 | + if rsp.IsSuccess() == false { |
| 90 | + c.String(http.StatusBadRequest, "验证订单 %s 信息发生错误: %s-%s", outTradeNo, rsp.Content.Msg, rsp.Content.SubMsg) |
| 91 | + return |
| 92 | + } |
| 93 | + |
| 94 | + c.String(http.StatusOK, "订单 %s 支付成功", outTradeNo) |
| 95 | +} |
| 96 | + |
| 97 | +func notify(c *gin.Context) { |
| 98 | + c.Request.ParseForm() |
| 99 | + |
| 100 | + ok, err := aliClient.VerifySign(c.Request.Form) |
| 101 | + if err != nil { |
| 102 | + log.Println("异步通知验证签名发生错误", err) |
| 103 | + return |
| 104 | + } |
| 105 | + |
| 106 | + if ok == false { |
| 107 | + log.Println("异步通知验证签名未通过") |
| 108 | + return |
| 109 | + } |
| 110 | + |
| 111 | + log.Println("异步通知验证签名通过") |
| 112 | + |
| 113 | + var outTradeNo = c.Request.Form.Get("out_trade_no") |
| 114 | + var p = alipay.TradeQuery{} |
| 115 | + p.OutTradeNo = outTradeNo |
| 116 | + rsp, err := aliClient.TradeQuery(p) |
| 117 | + if err != nil { |
| 118 | + log.Printf("异步通知验证订单 %s 信息发生错误: %s \n", outTradeNo, err.Error()) |
| 119 | + return |
| 120 | + } |
| 121 | + if rsp.IsSuccess() == false { |
| 122 | + log.Printf("异步通知验证订单 %s 信息发生错误: %s-%s \n", outTradeNo, rsp.Content.Msg, rsp.Content.SubMsg) |
| 123 | + return |
| 124 | + } |
| 125 | + |
| 126 | + log.Printf("订单 %s 支付成功 \n", outTradeNo) |
| 127 | +} |
0 commit comments