提交 bcca0cf40d7277eb22825965be31907d3d73d447

作者 chenang
1 个父辈 2dff354c

第一版

1   -package common
  1 +package socialwork_sdk
2 2
3 3 import (
4 4 "bytes"
... ... @@ -7,7 +7,7 @@ import (
7 7 "encoding/base64"
8 8 )
9 9
10   -func Aes_CBC_Decrypt(crypted []byte, key, iv []byte) ([]byte, error) {
  10 +func aes_CBC_Decrypt(crypted []byte, key, iv []byte) ([]byte, error) {
11 11 block, err := aes.NewCipher(key)
12 12 if err != nil {
13 13 return nil, err
... ... @@ -26,7 +26,7 @@ func unpadding(cipherText []byte) []byte {
26 26 return cipherText
27 27 }
28 28
29   -func Aes_CBC_Encrypt(data []byte, key, iv []byte) (string, error) {
  29 +func aes_CBC_Encrypt(data []byte, key, iv []byte) (string, error) {
30 30 block, err := aes.NewCipher(key)
31 31 if err != nil {
32 32 return "", err
... ...
  1 +package socialwork_sdk
  2 +
  3 +const (
  4 + orderUrl = "socialwork/v1/external/atandard"
  5 +)
... ...
  1 +package socialwork_sdk
  2 +
  3 +import (
  4 + "bytes"
  5 + "encoding/json"
  6 + "errors"
  7 + "fmt"
  8 + "io"
  9 + "io/ioutil"
  10 + "net/http"
  11 + "net/http/cookiejar"
  12 + "strings"
  13 +)
  14 +
  15 +const (
  16 + post = "POST"
  17 + get = "GET"
  18 + put = "PUT"
  19 +)
  20 +
  21 +func makeHttpRequestV4(method, url string, headers map[string]string, entity map[string]interface{}, jar *cookiejar.Jar) (string, int, error) {
  22 + var body io.Reader
  23 + var err error
  24 +
  25 + if entity != nil {
  26 + switch method {
  27 + case post, put:
  28 + if len(entity) == 1 && entity["jsonbody"] != nil {
  29 + jsonBody, ok := entity["jsonbody"].(string)
  30 + if ok {
  31 + body = bytes.NewBuffer([]byte(jsonBody))
  32 + }
  33 + } else {
  34 + b, err := json.Marshal(entity)
  35 + if err != nil {
  36 + return "", 0, err
  37 + }
  38 +
  39 + b = bytes.Replace(b, []byte("\\u003c"), []byte("<"), -1)
  40 + b = bytes.Replace(b, []byte("\\u003e"), []byte(">"), -1)
  41 + b = bytes.Replace(b, []byte("\\u0026"), []byte("&"), -1)
  42 +
  43 + body = bytes.NewBuffer(b)
  44 + }
  45 +
  46 + case get:
  47 + if len(entity) > 0 {
  48 + params := make([]string, len(entity))
  49 + index := 0
  50 + for k, v := range entity {
  51 + _v := fmt.Sprintf("%v", v)
  52 + params[index] = fmt.Sprintf("%s=%v", k, _v)
  53 + index++
  54 + }
  55 + queryStr := strings.Join(params, "&")
  56 + url = fmt.Sprintf("%s?%s", url, queryStr)
  57 + }
  58 + }
  59 + }
  60 +
  61 + req, err := http.NewRequest(method, url, body)
  62 + if err != nil {
  63 + return "", 0, err
  64 + }
  65 + // set the http request header
  66 + for key, value := range headers {
  67 + req.Header.Set(key, value)
  68 + }
  69 + if entity != nil && (method == post || method == put) {
  70 + req.Header.Set("Content-Type", "application/json;charset=utf-8")
  71 + req.Header.Set("Accept", "application/json")
  72 + }
  73 + req.Header.Add("Connection", "close")
  74 + req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5")
  75 +
  76 + //跳过证书验证
  77 + // tr := &http.Transport{
  78 + // TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  79 + // }
  80 + client := http.DefaultClient
  81 + if jar != nil {
  82 + client = &http.Client{
  83 + Jar: jar,
  84 + }
  85 + }
  86 + // client.Transport = tr
  87 +
  88 + fmt.Printf("xuht================Request: %+v\n", *req)
  89 + res, err := client.Do(req)
  90 + if err != nil {
  91 + fmt.Println("faild to do the request with error ", err)
  92 + return "", 0, err
  93 + }
  94 + defer res.Body.Close()
  95 +
  96 + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated && res.StatusCode != http.StatusNoContent {
  97 + resBody, _ := ioutil.ReadAll(res.Body)
  98 + fmt.Println("code is not 200 ", res.StatusCode, string(resBody))
  99 + return "", 0, errors.New("http request failed to call")
  100 + }
  101 + resBody, err := ioutil.ReadAll(res.Body)
  102 + if err != nil {
  103 + fmt.Println("could not read the response body")
  104 + return "", 0, errors.New("the response could not be read")
  105 + }
  106 +
  107 + return string(resBody), res.StatusCode, nil
  108 +}
... ...
  1 +package model
  2 +
  3 +type OrderModel struct {
  4 + Data string `json:"data"`
  5 + Sign string `json:"sign"`
  6 + PtCode string `json:"pt_code"`
  7 + BusinessCode string `json:"business_code"`
  8 +}
... ...
1 1 package socialwork_sdk
2 2
3 3 import (
  4 + "encoding/base64"
4 5 "encoding/json"
5   - "gitlab.workai.com.cn/chenang/socialwork-sdk/common"
  6 + "gitlab.workai.com.cn/chenang/socialwork-sdk/model"
6 7 "log"
7 8 )
8 9
... ... @@ -11,26 +12,28 @@ type OrderClient struct {
11 12 IV string `json:"iv"`
12 13 PublicKey string `json:"public_key"`
13 14 CustomerPrivateKey string `json:"customer_private_key"`
  15 + PtCode string `json:"pt_code"`
  16 + IP string `json:"ip"`
14 17 }
15 18
16   -func NewOrderClient(key, iv, customerPrivateKey, publicKey string) *OrderClient {
  19 +func NewOrderClient(key, iv, customerPrivateKey, publicKey, ip string) *OrderClient {
17 20 return &OrderClient{
18 21 Key: key,
19 22 IV: iv,
20 23 PublicKey: publicKey,
21 24 CustomerPrivateKey: customerPrivateKey,
  25 + IP: ip,
22 26 }
23 27 }
24 28
25   -func (o *OrderClient) EncryptAndSign(res interface{}) (string, string, error) {
26   - bs, _ := json.Marshal(res)
27   - cipherText, err := common.Aes_CBC_Encrypt(bs, []byte(o.Key), []byte(o.IV))
  29 +func (o *OrderClient) EncryptAndSign(bs []byte) (string, string, error) {
  30 + cipherText, err := aes_CBC_Encrypt(bs, []byte(o.Key), []byte(o.IV))
28 31 if err != nil {
29 32 log.Printf("Aes_CBC_Encrypt.failed.err=%v\n", err)
30 33 return "", "", err
31 34 }
32 35
33   - sign, err := common.RsaSignWithMd5Hex(cipherText, o.CustomerPrivateKey)
  36 + sign, err := rsaSignWithMd5Hex(cipherText, o.CustomerPrivateKey)
34 37 if err != nil {
35 38 log.Printf("RsaSignWithMd5Hex.failed.err=%v\n", err)
36 39 return "", "", err
... ... @@ -38,6 +41,52 @@ func (o *OrderClient) EncryptAndSign(res interface{}) (string, string, error) {
38 41 return cipherText, sign, nil
39 42 }
40 43
41   -func (o *OrderClient) PrintVersion() string {
42   - return "1.0"
  44 +func (o *OrderClient) DecryptAndVerySign(cipherText, sign string) ([]byte, error) {
  45 + _cipherText, err := base64.StdEncoding.DecodeString(cipherText)
  46 + if err != nil {
  47 + return nil, err
  48 + }
  49 + err = rsaVerifySignWithMd5Base64(cipherText, sign, o.PublicKey)
  50 + if err != nil {
  51 + return nil, err
  52 + }
  53 + content, err := aes_CBC_Decrypt(_cipherText, []byte(o.Key), []byte(o.IV))
  54 + if err != nil {
  55 + return nil, err
  56 + }
  57 + return content, nil
  58 +}
  59 +
  60 +func (o *OrderClient) SendRequest(businessCode, reqBody string) (string, error) {
  61 + //校验参数 reqbody
  62 + checkErr := o.checkParams(businessCode, reqBody)
  63 + if checkErr != nil {
  64 + return "", checkErr
  65 + }
  66 + cipherText, sign, err := o.EncryptAndSign([]byte(reqBody))
  67 + if err != nil {
  68 + return "", err
  69 + }
  70 +
  71 + orderModel := model.OrderModel{
  72 + Data: cipherText,
  73 + Sign: sign,
  74 + PtCode: o.PtCode,
  75 + BusinessCode: businessCode,
  76 + }
  77 +
  78 + _orderModel, err := json.Marshal(orderModel)
  79 + if err != nil {
  80 + return "", err
  81 + }
  82 + respBody, _, err := makeHttpRequestV4(post, o.IP+orderUrl, nil, map[string]interface{}{"jsonbody": string(_orderModel)}, nil)
  83 + if err != nil {
  84 + return "", err
  85 + }
  86 +
  87 + return respBody, nil
  88 +}
  89 +
  90 +func (o *OrderClient) checkParams(businessCode, reqBody string) error {
  91 + return nil
43 92 }
... ...
1   -package common
  1 +package socialwork_sdk
2 2
3 3 import (
4 4 "crypto"
... ... @@ -10,7 +10,7 @@ import (
10 10 "encoding/pem"
11 11 )
12 12
13   -func RsaSignWithMd5Hex(data string, prvKey string) (string, error) {
  13 +func rsaSignWithMd5Hex(data string, prvKey string) (string, error) {
14 14 block, _ := pem.Decode([]byte(prvKey))
15 15 privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
16 16 if err != nil {
... ... @@ -29,3 +29,22 @@ func RsaSignWithMd5Hex(data string, prvKey string) (string, error) {
29 29 out := base64.StdEncoding.EncodeToString(signature)
30 30 return out, nil
31 31 }
  32 +
  33 +func rsaVerifySignWithMd5Base64(originalData, signData, pubKey string) error {
  34 + sign, err := base64.StdEncoding.DecodeString(signData)
  35 + if err != nil {
  36 + return err
  37 + }
  38 + block, _ := pem.Decode([]byte(pubKey))
  39 + pub, err := x509.ParsePKIXPublicKey(block.Bytes)
  40 + if err != nil {
  41 + return err
  42 + }
  43 + hash := md5.New()
  44 + hash.Write([]byte(originalData))
  45 + err = rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.MD5, hash.Sum(nil), sign)
  46 + if err != nil {
  47 + return err
  48 + }
  49 + return nil
  50 +}
... ...
注册登录 后发表评论