1、获取AccessToken
2、获取jsapi_ticket
3、生成签名
以下代码:
public class WechatSignUtil {
public static final String APPID = "APPID";
public static final String APPSECRET = "APPSECRET";
/**
* 获得AccessToken
*/
public static final String WECHAT_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
/**
* 获取jsapi_ticket
*/
public static final String WECHAT_JSAPI_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
/**
* 获取加密串
* @param jsapi_ticket
* @param timestamp 时间戳
* @param nonce 随机字符串
* @param jsurl
* @return
* @throws IOException
*/
public static String getSignature(String jsapi_ticket, String timestamp,
String nonce, String jsurl) throws IOException {
String[] paramArr = new String[] { "jsapi_ticket=" + jsapi_ticket,
"timestamp=" + timestamp, "noncestr=" + nonce, "url=" + jsurl };
Arrays.sort(paramArr);
// 将排序后的结果拼接成一个字符串
String content = paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2])
.concat("&"+paramArr[3]);
System.out.println("拼接之后的content为:"+content);
String gensignature = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
// 对拼接后的字符串进行 sha1 加密
byte[] digest = md.digest(content.toString().getBytes());
gensignature = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将 sha1 加密后的字符串与 signature 进行对比
if (gensignature != null) {
return gensignature;// 返回signature
} else {
return "false";
}
// return (String) (ciphertext != null ? ciphertext: false);
}
/**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
'b', 'c', 'd', 'e', 'f' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
}
/**
* 获得Access Token
* @return
* @throws IOException
*/
public JSONObject getAccessToken() throws IOException{
//获得Access Token
String accessTokenUrl = WechatSignUtil.WECHAT_ACCESS_TOKEN_URL.replace("APPID", WechatSignUtil.APPID).replace("SECRET",WechatSignUtil.APPSECRET);
String accessTokenResult = HttpUtils.URLPost(accessTokenUrl,"").toString();
JSONObject accessTokenJsonObject = JSONObject.fromObject(accessTokenResult);
logger.info("getAccessToken="+accessTokenJsonObject);
return accessTokenJsonObject;
}
/**
* 获取jsapi_ticket
*/
public JSONObject getJsapiTicket(String accessToken) throws IOException{
String jsapiTicketUrl = WechatSignUtil.WECHAT_JSAPI_TICKET_URL.replace("ACCESS_TOKEN",accessToken);
String jsapiTicketResult = HttpUtils.URLPost(jsapiTicketUrl,"").toString();
JSONObject jsapiTicketJsonObject = JSONObject.fromObject(jsapiTicketResult);
logger.info("getJsapiTicket="+jsapiTicketJsonObject);
return jsapiTicketJsonObject;
}
public Map<String, String> getWechatSign(String url) throws IOException {
Map<String,String> result = new HashMap<String,String>();
JSONObject accessTokenJsonObject = getAccessToken();
String accessToken = accessTokenJsonObject.get("access_token").toString();
JSONObject jsapiTicketJsonObject = getJsapiTicket(accessToken);
String jsapiTicket = jsapiTicketJsonObject.get("ticket").toString();
// 时间戳
Long timeStamp = new Date().getTime()/1000;
//随机字串
String noncestr = UUID.randomUUID().toString();
//签名
String signature = WechatSignUtil.getSignature(jsapiTicket,timeStamp.toString(),noncestr,url);
logger.info("timeStamp="+timeStamp+",noncestr="+noncestr+",signature="+signature+",url="+url);
result.put("appId", WechatSignUtil.APPID);
result.put("timestamp", timeStamp.toString());
result.put("nonceStr", noncestr);
result.put("signature", signature);
result.put("errcode","0000");
result.put("errmsg","success");
return result;
}