github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/pay/alipay/handle.go (about) 1 package alipay 2 3 import ( 4 "common" 5 "crypto" 6 "crypto/rand" 7 "crypto/rsa" 8 "crypto/sha256" 9 "crypto/x509" 10 "encoding/base64" 11 "encoding/pem" 12 "io/ioutil" 13 "net/http" 14 "net/url" 15 "strings" 16 "time" 17 18 "github.com/name5566/leaf/log" 19 ) 20 21 var ( 22 rsaPrivateKey = []byte(`-----BEGIN RSA PRIVATE KEY----- 23 MIIEowIBAAKCAQEAngF+Gi0z+WC61Ct1b8psllUSnoLs9iedJygZp2ATNVND7GizhkfWlfydadKf9tK7NUtkOjpYylxMGvwapnjR8rXNu+0ZIszfVHor7/Po9LEZRbIaO/++l8JI03OgBsN/pJdACvxpCngUEfwolcfUUR50YH93MpoRaBFvgNDPzW51W/NhNSYveUBYn55VK6ZFuDltliAvN40TDL4k8UA1q2p6j2h19XRV5R1hZP80b3hmRStRR4t7K8cRQ7awzaqYn/U+LEOb3DBOdMTI1wD7RRuEQmyzjC8WxgB+jVOZHgjOdK6TTx6iQtgSyCeh1IoGnOTAi689OsgJQz7gUzy+9wIDAQABAoIBAFjYeALaFhaMqKEzCqbgiOyDS6Pr9Lh5D+n7p2kxIbvjZRcizIeeD3BpCk59y8rrNa9DBEmlk1W+TmECDy46U7uJNPUN3gtubcm/pMMZQI2Oo6pH+m5wYMhOy8pygrIq7bQsBCvpQFtNp+NxCZUnNyCh4kh8hBblARKmcy9YuvBE4PR4yXrzDWtwkxyopdQPLI7Efeq572zfPftIILOdz7+lMraOXj6WMDpYIOf6e8FK2CIge8tbCwYPZHvl2BQIMvY6C4ocgX7rrAmhL+eEA+RmC0GOObiolTZ0VPSzDWZf2lESBmOrbAdrnkW9HgqDtiFb+hmg59sI9PXBO0VmSTECgYEAyYJWTwDLrxuEDKgjePf1F8IrzFfgy1IqkP0PZkba1TbJkQzgeSE1VyzSkaxenEDQSshrALBHs7oCPPRiwFsKV1i5FL7ueihbrEpG8o7eu40eZ+KANV6zAGGZHxnX1ytHKOJ07aOffxSIa9z0VCjfkVv1yExy54dJ9csVXhvVVK8CgYEAyLuZCtCZcA7xo1tmFeek+fwhpWORPpJbmpZMeyhP1PkAg0f2HHVncOxSbi+hwaZavKJ2LZfyWhXvWry5rTsAEtQP+Wi4MK1QMPNKO1ceaVBXbEC8YHPldXeWW9o2y4vAyZkrccrpa4itxUuHwFo6qDyFfehytjGkdvGnsR4SXDkCgYBqa3YPZRks0jhLwuRw92qt8HLXCTYDytIGHk9qsVLStYuAGi/WaM5VyqsuGb0hgi0+wVeZVn+XkE2sSVh5w9rTRF0Ccs9ZHkVD2Tpc0U0Z+a4sKPeSt/+K3QBT538Q+J8tHWOpOPd70qk1Zcx3QdrIVquX65/nXJCXyXfwanygqwKBgQDEXkEpQ0fXR8c7d342j5Xkt7JyiSTdgW/7mmzXTmhKgAzwYMVysaev4IADKrWjK4o4XvYdRDfhyPOOYHGD9ePsh2fZJYiKlgGM4XQM+PzXKbFcRTgDY11lvMdqs95G4UCH9z944nfWqq7UAz+Z/KrFSe+NbIhLk+TAN0dFDZYIgQKBgE95o0td5uSlGRVgVzP3bcqYgj0ytWyJKfWR6Y/vjcUqOUInjyhCDdSr6ufDIPI1QZHrdGaomVkz+Y3jUIMP+HGTM8KYCr5EGdwGXhHilRbuya6fqydDT9tgXEjelvzK2oJzJX8K7QiT4051+k1BLCqiubfpzBldyeOXS7OcPmoY 24 -----END RSA PRIVATE KEY-----`) 25 26 alipayRSAPublicKey = []byte(`-----BEGIN PUBLIC KEY----- 27 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhZ5tUwVnou3dfmginCDmRX8Lfu3HwOOitBEY0buaAb65C6dL9xXtnKJp5QzOuylfRNy4sdXXWXXd6SlkK0Xb8tuBxLcTW67TBz1SmzUstxvWbH18o8e6MED1VhvEt8puNdcBInfgDdeKx+x8X/u8zBldzL4K9Yieb67fMsfvDszWV2rI+BvxaKnNmYYBpC8oyJpq261d43WZosbuFghoT7hYks8NuLfPc+T6+xGRNfl0BrGMsVE4xAvE7E79AvXLCkZh+AV2FPGvy7TB0Dxbnn0mpNt2NrcwvMM7sbIlDL3hPdtCXl2/vY5KIA87qIyBQHpR+w9BTNIW5mkXm36ZQQIDAQAB 28 -----END PUBLIC KEY-----`) 29 30 partnerID = "2088811602965802" 31 appID = "2017110809804067" 32 gatewayUrl = "https://openapi.alipay.com/gateway.do" 33 notifyUrl = "http://czddz.shenzhouxing.com:8084/alipay" 34 ) 35 36 func DoRequest(req *AlipayTradeAppPayRequest) []byte { 37 p := url.Values{} 38 p.Add("app_id", appID) 39 p.Add("biz_content", req.BizContent) 40 p.Add("charset", "utf-8") 41 p.Add("method", req.Method) 42 p.Add("notify_url", req.NotifyUrl) 43 p.Add("sign_type", "RSA2") 44 p.Add("timestamp", time.Now().Format("2006-01-02 15:04:05")) 45 p.Add("version", req.Version) 46 p.Add("sign", generateSign(p)) 47 48 r, err := http.NewRequest("POST", gatewayUrl, strings.NewReader(p.Encode())) 49 if err != nil { 50 log.Debug("%v", err) 51 return []byte{} 52 } 53 defer r.Body.Close() 54 result, _ := ioutil.ReadAll(r.Body) 55 return result 56 } 57 58 func rsaCheck(params url.Values) bool { 59 sign := params.Get("sign") 60 params.Del("sign") 61 params.Del("sign_type") 62 return verify([]byte(common.GetSignContent(params)), sign) 63 } 64 65 func Check(params url.Values) bool { 66 tradeStatus := params.Get("trade_status") 67 if appID == params.Get("app_id") && partnerID == params.Get("seller_id") && (tradeStatus == "TRADE_SUCCESS" || tradeStatus == "TRADE_FINISHED") { 68 return rsaCheck(params) 69 } 70 return false 71 } 72 73 func generateSign(params url.Values) string { 74 return sign([]byte(common.GetSignContent(params))) 75 } 76 77 func sign(data []byte) string { 78 block, _ := pem.Decode(rsaPrivateKey) 79 if block == nil { 80 return "" 81 } 82 privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) 83 if err != nil { 84 return "" 85 } 86 h := sha256.New() 87 h.Write(data) 88 sign, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, h.Sum(nil)) 89 if err != nil { 90 return "" 91 } 92 return base64.StdEncoding.EncodeToString(sign) 93 } 94 95 func verify(data []byte, sign string) bool { 96 sig, err := base64.StdEncoding.DecodeString(sign) 97 if err != nil { 98 return false 99 } 100 block, _ := pem.Decode(alipayRSAPublicKey) 101 if block == nil { 102 return false 103 } 104 pub, err := x509.ParsePKIXPublicKey(block.Bytes) 105 if err != nil { 106 return false 107 } 108 h := sha256.New() 109 h.Write(data) 110 err = rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.SHA256, h.Sum(nil), sig) 111 if err == nil { 112 return true 113 } 114 return false 115 }