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  }