Gopay
微信、支付宝、PayPal、Apple 的Go版本SDK。【极简、易用的聚合支付SDK】
github:https://github.com/go-pay/gopay
1
| go get -u github.com/go-pay/gopay
|
支付宝
https://open.alipay.com/platform/appDaily.htm
密钥和授权回调地址
获取密钥

得到以下:
- 应用公钥证书 appCertPublicKey.crt
- 应用私钥(非 Java 语言)
- 支付宝公钥证书 alipayCertPublicKey_RSA2.crt
- 支付宝公钥证书 alipayRootCert.crt
将证书中的内容复制到文件中或着已证书文件的形式加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package cert
var ( Appid = "2021000116674577"
AppPrivateKey = "MIIEpAIBAAKCAQEAoX6ZLfwZz3NDkwjaVhai18yVxQaUgA47aZuOe2AtG2hfeQ1LJ9GN7aTPAGdnuXMaRj9RRKllRw+vJq2FmAKo........"
AlipayPublicContentRSA2 = []byte(`-----BEGIN CERTIFICATE----- MIIDszCCApu................... `)
AlipayRootContent = []byte(`-----BEGIN CERTIFICATE---- ..................................................... -----END CERTIFICATE-----`)
AppPublicContent = []byte(`-----BEGIN CERTIFICATE-----.................................`) )
|
以文件的方式加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package cert
import ( "io/ioutil" "os" )
var ( Appid string AppPrivateKey string AlipayPublicContentRSA2 []byte AlipayRootContent []byte AppPublicContent []byte )
func Init() { RSA2, _ := os.Open("alipayCertPublicKey_RSA2.crt") rootKey, _ := os.Open("alipayRootCert.crt") appPublicKey, _ := os.Open("appCertPublicKey.crt") AlipayPublicContentRSA2, _ = ioutil.ReadAll(RSA2) AlipayRootContent, _ = ioutil.ReadAll(rootKey) AppPublicContent, _ = ioutil.ReadAll(appPublicKey)
AppPrivateKey = "MIIEpAIBAAKCAQEAoX6Z==................." Appid = "2021000116674577" }
|

回调地址
注意这里一定要是公网地址!
如果你是本地开发可以使用外网穿透实现 https://i.cpolar.com/m/4M81
电脑网站支付
https://github.com/go-pay/gopay/blob/main/doc/alipay.md
https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay?scene=22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| package pay
import ( "context" "fmt" "github.com/go-pay/gopay" "github.com/go-pay/gopay/alipay" "github.com/go-pay/gopay/pkg/xlog" "micro-shop-api/order-web/config/cert" )
var ( TradeStatusWaitBuyerPay string = "WAIT_BUYER_PAY" TradeStatusClose = "TRADE_CLOSED" TradeStatusSuccess = "TRADE_SUCCESS" TradeStatusFinished = "TRADE_FINISHED" )
func Notify(ctx *gin.Context) {
notifyReq, err := alipay.ParseNotifyToBodyMap(ctx.Request) if err != nil { zap.S().Errorf("解析参数错误:%s", err.Error()) response.Fail(ctx, status2.InvalidParameter) return } ok, err := alipay.VerifySignWithCert(global.Config.Alipay.AlipayPublicContentRSA2, notifyReq) if !ok || err != nil { zap.S().Errorf("支付宝异步通知验签失败:%s", err.Error()) response.Fail(ctx, status2.InnerError) return } orderSn := notifyReq["out_trade_no"].(string) orderStatus := notifyReq["trade_status"].(string) _, err = global.OrderSrvClient.UpdateOrderStatus(context.Background(), &proto.OrderStatus{OrderSn: orderSn, Status: orderStatus}) if err != nil { zap.S().Errorf("支付成功但更新状态失败,支付状态:%s, 订单号:%s, err:%s", orderStatus, orderSn, err.Error()) response.Fail(ctx, status2.InnerError) return }
ctx.String(http.StatusOK, "success") }
func Alipay() { client, err := alipay.NewClient(cert.Appid, cert.AppPrivateKey, false) if err != nil { xlog.Error(err) return } client.DebugSwitch = gopay.DebugOn
client.SetLocation(alipay.LocationShanghai). SetCharset(alipay.UTF8). SetSignType(alipay.RSA2). SetReturnUrl("https://likfees.js.cool"). SetNotifyUrl("http://3n3swpx.nat.ipyingshe.com/v1/pay/alipay/notify")
client.AutoVerifySign(cert.AlipayPublicContentRSA2)
err = client.SetCertSnByContent(cert.AppPublicContent, cert.AlipayRootContent, cert.AlipayPublicContentRSA2)
if err != nil { panic(err) }
bm := make(gopay.BodyMap) bm.Set("subject", "订单支付"). Set("out_trade_no", "likfees_order_id:6666666"). Set("total_amount", "0.01"). Set("timeout_express", "2m"). Set("product_code", "FAST_INSTANT_TRADE_PAY")
aliRsp, err := client.TradePagePay(context.Background(), bm) if err != nil { xlog.Error("err:", err) return } fmt.Println(aliRsp) }
|
如果出现以下情况,请尝试清空浏览器缓存或更换浏览器访问
