Browse Source

fix panic error

Jerry 6 years ago
parent
commit
b177c2f854
2 changed files with 22 additions and 8 deletions
  1. 5 1
      alipay_service_api.go
  2. 17 7
      util.go

+ 5 - 1
alipay_service_api.go

@@ -84,6 +84,7 @@ func ParseAliPayNotifyResult(req *http.Request) (notifyReq *AliPayNotifyRequest,
 //    sessionKey:会话密钥
 //    beanPtr:需要解析到的结构体指针
 //    文档:https://docs.alipay.com/mini/introduce/aes
+//    文档:https://docs.open.alipay.com/common/104567
 func DecryptAliPayOpenDataToStruct(encryptedData, secretKey string, beanPtr interface{}) (err error) {
 	//验证参数类型
 	beanValue := reflect.ValueOf(beanPtr)
@@ -109,7 +110,10 @@ func DecryptAliPayOpenDataToStruct(encryptedData, secretKey string, beanPtr inte
 	blockMode := cipher.NewCBCDecrypter(block, ivKey)
 	originData := make([]byte, len(secretData))
 	blockMode.CryptBlocks(originData, secretData)
-	originData = PKCS5UnPadding(originData)
+
+	if len(originData) > 0 {
+		originData = PKCS5UnPadding(originData)
+	}
 	//fmt.Println("originDataStr:", string(originData))
 	//解析
 	err = json.Unmarshal(originData, beanPtr)

+ 17 - 7
util.go

@@ -228,16 +228,26 @@ func Int642String(intNum int64) (int64Str string) {
 
 //解密填充模式(去除补全码) PKCS7UnPadding
 //解密时,需要在最后面去掉加密时添加的填充byte
-func PKCS7UnPadding(plainText []byte) []byte {
-	length := len(plainText)
-	unpadding := int(plainText[length-1])   //找到Byte数组最后的填充byte
-	return plainText[:(length - unpadding)] //只截取返回有效数字内的byte数组
+func PKCS7UnPadding(origData []byte) (bs []byte) {
+	length := len(origData)
+	unpaddingNumber := int(origData[length-1]) //找到Byte数组最后的填充byte 数字
+	if unpaddingNumber <= 7 {
+		bs = origData[:(length - unpaddingNumber)] //只截取返回有效数字内的byte数组
+	} else {
+		bs = origData
+	}
+	return
 }
 
 //解密填充模式(去除补全码) PKCS5UnPadding
 //解密时,需要在最后面去掉加密时添加的填充byte
-func PKCS5UnPadding(origData []byte) []byte {
+func PKCS5UnPadding(origData []byte) (bs []byte) {
 	length := len(origData)
-	unpadding := int(origData[length-1])   //找到Byte数组最后的填充byte
-	return origData[:(length - unpadding)] //只截取返回有效数字内的byte数组
+	unpaddingNumber := int(origData[length-1]) //找到Byte数组最后的填充byte
+	if unpaddingNumber <= 5 {
+		bs = origData[:(length - unpaddingNumber)] //只截取返回有效数字内的byte数组
+	} else {
+		bs = origData
+	}
+	return
 }