Просмотр исходного кода

add DecryptAliPayOpenDataToStruct

Jerry 6 лет назад
Родитель
Сommit
d2fb5017d3
1 измененных файлов с 42 добавлено и 0 удалено
  1. 42 0
      alipay_server_api.go

+ 42 - 0
alipay_server_api.go

@@ -8,6 +8,8 @@ package gopay
 import (
 	"bytes"
 	"crypto"
+	"crypto/aes"
+	"crypto/cipher"
 	"crypto/rsa"
 	"crypto/x509"
 	"encoding/base64"
@@ -18,6 +20,7 @@ import (
 	"hash"
 	"log"
 	"net/http"
+	"reflect"
 	"time"
 )
 
@@ -81,6 +84,45 @@ func ParseAliPayNotifyResult(req *http.Request) (notifyRsp *AliPayNotifyRequest,
 	return notifyRsp, err
 }
 
+//解密支付宝开放数据
+//    encryptedData:包括敏感数据在内的完整用户信息的加密数据
+//    sessionKey:会话密钥
+//    beanPtr:需要解析到的结构体指针
+func DecryptAliPayOpenDataToStruct(encryptedData, secretKey string, beanPtr interface{}) (err error) {
+	//验证参数类型
+	beanValue := reflect.ValueOf(beanPtr)
+	if beanValue.Kind() != reflect.Ptr {
+		return errors.New("传入参数类型必须是以指针形式")
+	}
+	//验证interface{}类型
+	if beanValue.Elem().Kind() != reflect.Struct {
+		return errors.New("传入interface{}必须是结构体")
+	}
+	aesKey, _ := base64.StdEncoding.DecodeString(secretKey)
+	ivKey := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+	secretData, _ := base64.StdEncoding.DecodeString(encryptedData)
+
+	block, err := aes.NewCipher(aesKey)
+	if err != nil {
+		return err
+	}
+	if len(secretData)%len(aesKey) != 0 {
+		return errors.New("encryptedData is error")
+	}
+
+	blockMode := cipher.NewCBCDecrypter(block, ivKey)
+	originData := make([]byte, len(secretData))
+	blockMode.CryptBlocks(originData, secretData)
+	originData = PKCS5UnPadding(originData)
+	//fmt.Println("originDataStr:", string(originData))
+	//解析
+	err = json.Unmarshal(originData, beanPtr)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 //支付通知的签名验证和参数签名后的Sign
 //    aliPayPublicKey:支付宝公钥
 //    notifyRsp:利用 gopay.ParseAliPayNotifyResult() 得到的结构体