parent
eaecc720b3
commit
bcd762c309
@ -0,0 +1,10 @@ |
|||||||
|
package com.gitee.sop.gatewaycommon.validate.taobao; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author tanghc |
||||||
|
*/ |
||||||
|
public class Constants { |
||||||
|
public static final String SIGN_METHOD_HMAC = "hmac"; |
||||||
|
public static final String SIGN_METHOD_MD5 = "md5"; |
||||||
|
public static final String CHARSET_UTF8 = "UTF-8"; |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
package com.gitee.sop.gatewaycommon.validate.taobao; |
||||||
|
|
||||||
|
import com.gitee.sop.gatewaycommon.validate.alipay.StringUtils; |
||||||
|
|
||||||
|
import javax.crypto.Mac; |
||||||
|
import javax.crypto.SecretKey; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.charset.StandardCharsets; |
||||||
|
import java.security.GeneralSecurityException; |
||||||
|
import java.security.MessageDigest; |
||||||
|
import java.security.NoSuchAlgorithmException; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author tanghc |
||||||
|
*/ |
||||||
|
public class TaobaoSignature { |
||||||
|
|
||||||
|
|
||||||
|
public static String signTopRequest(Map<String, String> params, String secret, String signMethod) throws IOException { |
||||||
|
String content = getSignContent(params); |
||||||
|
return doSign(content, secret, signMethod); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getSignContent(Map<String, ?> params) { |
||||||
|
// 第一步:检查参数是否已经排序
|
||||||
|
String[] keys = params.keySet().toArray(new String[0]); |
||||||
|
Arrays.sort(keys); |
||||||
|
|
||||||
|
// 第二步:把所有参数名和参数值串在一起
|
||||||
|
StringBuilder query = new StringBuilder(); |
||||||
|
|
||||||
|
for (String key : keys) { |
||||||
|
Object val = params.get(key); |
||||||
|
String value = val == null ? null : val.toString(); |
||||||
|
if (StringUtils.areNotEmpty(key, value)) { |
||||||
|
query.append(key).append(value); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return query.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static String doSign(String content,String secret, String signMethod) throws IOException { |
||||||
|
// 第三步:使用MD5/HMAC加密
|
||||||
|
byte[] bytes; |
||||||
|
if (Constants.SIGN_METHOD_HMAC.equals(signMethod)) { |
||||||
|
bytes = encryptHMAC(content, secret); |
||||||
|
} else { |
||||||
|
bytes = encryptMD5(secret + content + secret); |
||||||
|
} |
||||||
|
|
||||||
|
// 第四步:把二进制转化为大写的十六进制(正确签名应该为32大写字符串,此方法需要时使用)
|
||||||
|
return byte2hex(bytes); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] encryptHMAC(String data, String secret) throws IOException { |
||||||
|
byte[] bytes = null; |
||||||
|
try { |
||||||
|
SecretKey secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacMD5"); |
||||||
|
Mac mac = Mac.getInstance(secretKey.getAlgorithm()); |
||||||
|
mac.init(secretKey); |
||||||
|
bytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8)); |
||||||
|
} catch (GeneralSecurityException gse) { |
||||||
|
throw new IOException(gse.toString()); |
||||||
|
} |
||||||
|
return bytes; |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] encryptMD5(String data) throws IOException { |
||||||
|
return encryptMD5(data.getBytes(StandardCharsets.UTF_8)); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] encryptMD5(byte[] data) { |
||||||
|
try { |
||||||
|
MessageDigest digest = MessageDigest.getInstance(Constants.SIGN_METHOD_MD5); |
||||||
|
return digest.digest(data); |
||||||
|
} catch (NoSuchAlgorithmException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public static String byte2hex(byte[] bytes) { |
||||||
|
StringBuilder sign = new StringBuilder(); |
||||||
|
for (int i = 0; i < bytes.length; i++) { |
||||||
|
String hex = Integer.toHexString(bytes[i] & 0xFF); |
||||||
|
if (hex.length() == 1) { |
||||||
|
sign.append("0"); |
||||||
|
} |
||||||
|
sign.append(hex.toUpperCase()); |
||||||
|
} |
||||||
|
return sign.toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package com.gitee.sop.storyweb.controller; |
||||||
|
|
||||||
|
import com.gitee.sop.servercommon.annotation.ApiAbility; |
||||||
|
import com.gitee.sop.storyweb.controller.param.StoryParam; |
||||||
|
import com.gitee.sop.storyweb.controller.result.StoryResult; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author tanghc |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@Slf4j |
||||||
|
// 注解放在这里,表示类中的方法都具备接口开放能力
|
||||||
|
@ApiAbility |
||||||
|
public class TaobaoController { |
||||||
|
|
||||||
|
@RequestMapping("/order/get") |
||||||
|
public StoryResult get(@RequestParam String data) { |
||||||
|
StoryResult story = new StoryResult(); |
||||||
|
story.setId(1L); |
||||||
|
story.setName(data); |
||||||
|
return story; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("/order/save") |
||||||
|
public StoryResult save(StoryParam param) { |
||||||
|
StoryResult story = new StoryResult(); |
||||||
|
story.setId((long) param.getId()); |
||||||
|
story.setName(param.getName()); |
||||||
|
return story; |
||||||
|
} |
||||||
|
|
||||||
|
@RequestMapping("/order/json") |
||||||
|
public StoryResult json(@RequestBody StoryParam param) { |
||||||
|
StoryResult story = new StoryResult(); |
||||||
|
story.setId((long) param.getId()); |
||||||
|
story.setName(param.getName()); |
||||||
|
return story; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue