alipay.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package main
  2. import (
  3. "crypto"
  4. "crypto/rand"
  5. "crypto/rsa"
  6. "crypto/sha256"
  7. "crypto/x509"
  8. "encoding/base64"
  9. "encoding/json"
  10. "encoding/pem"
  11. "errors"
  12. "hash"
  13. "io/ioutil"
  14. "net/http"
  15. "net/url"
  16. "strings"
  17. "time"
  18. )
  19. // DoRequest 支付宝支付统一HTTP调用接口
  20. func DoRequest(appId, bizCcontent, curl, methodType string, privateKey *rsa.PrivateKey) (*map[string]interface{}, error) {
  21. var data = url.Values{}
  22. data.Add("app_id", appId)
  23. data.Add("method", methodType)
  24. data.Add("format", "json")
  25. data.Add("charset", "UTF-8")
  26. data.Add("sign_type", "RSA2")
  27. data.Add("timestamp", time.Now().Format("2006-01-02 15:04:05"))
  28. data.Add("version", "1.0")
  29. data.Add("biz_content", bizCcontent)
  30. signContentBytes, _ := url.QueryUnescape(data.Encode())
  31. signature, err := getSign([]byte(signContentBytes), privateKey)
  32. if err != nil {
  33. return nil, err
  34. }
  35. data.Add("sign", signature)
  36. url := curl + "?" + data.Encode()
  37. client := http.Client{Jar: nil}
  38. req, _ := http.NewRequest("POST", url, nil)
  39. res, err := client.Do(req)
  40. if err != nil {
  41. return nil, err
  42. }
  43. bArr, err := ioutil.ReadAll(res.Body)
  44. if err != nil {
  45. return nil, err
  46. }
  47. m := map[string]interface{}{}
  48. err = json.Unmarshal(bArr, &m)
  49. return &m, nil
  50. }
  51. // 生成加密token
  52. func getSign(data []byte, PrivateKey *rsa.PrivateKey) (signature string, err error) {
  53. var h hash.Hash
  54. var hType crypto.Hash
  55. h = sha256.New()
  56. hType = crypto.SHA256
  57. h.Write(data)
  58. d := h.Sum(nil)
  59. bs, err := rsa.SignPKCS1v15(rand.Reader, PrivateKey, hType, d)
  60. if err != nil {
  61. return "", err
  62. }
  63. signature = base64.StdEncoding.EncodeToString(bs)
  64. return
  65. }
  66. // 加载秘钥
  67. func parsePrivateKey(key string) (*rsa.PrivateKey, error) {
  68. block, _ := pem.Decode([]byte(key))
  69. if block == nil {
  70. return nil, errors.New("私钥格式不正确,无法解析PEM块")
  71. }
  72. if strings.ToUpper(block.Type) != "RSA PRIVATE KEY" {
  73. return nil, errors.New("私钥类型不正确,期望为RSA PRIVATE KEY但得到的是" + block.Type)
  74. }
  75. // 注意:这里使用x509.ParsePKCS1PrivateKey来解析PKCS#1格式的私钥
  76. rsaPrivateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
  77. if err != nil {
  78. return nil, err
  79. }
  80. return rsaPrivateKey.(*rsa.PrivateKey), nil
  81. }