前言
1、h5需要的資料實體類
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 作者 :HealerJean
* 日期 :2018/12/17 下午7:11.
* 類描述:
*/
@Data
@Accessors
public class ResJsApiTickeData {
private String appId ; //微信公衆号id
private Long timestamp ;//時間戳
private String nonceStr; //随機字元串
private String signature ; //簽名
}
2、擷取JSapi中的ticket
/**
* @Desc: JsapiTicket
* @Date: 2018/5/24 下午6:50
*/
public static String getJsapiTicket( WeChatBusinessNo weChatBusinessNo){
WeChatJsApiTicket weChatJsApiTicket =jsSdkUtils.getWechatJsapiTicket(weChatBusinessNo.getId());
if(weChatJsApiTicket !=null){ //先判斷資料庫中有沒有
return weChatJsApiTicket.getJsTicke();
}
String accessToken = AccessToakeUtil.getAccessToaken(weChatBusinessNo);
String url = WechatApiUrlParams.JS_API_TICKET_URL.replace("ACCESS_TOKEN", accessToken) ;
HttpBackBean httpBackBean = HttpHelper.handleGet(url,null,null, HttpHelper.OVERTIME);
log.info("擷取 accessToken 傳回結果"+httpBackBean.getResult());
String jsTicket = JSONObject.fromObject(httpBackBean.getResult()).getString("ticket");
if(jsTicket!=null){
jsSdkUtils.saveWechatJsapiTicket(jsTicket, weChatBusinessNo.getId()); //向資料庫中儲存accessToaken
return jsTicket;
}else {
log.error("擷取accessToken失敗");
}
return null;
}
3、根據前台傳來的url制作簽名
public ResJsApiTickeData getSignature(String url, String key){
ResJsApiTickeData data = new ResJsApiTickeData() ;
WechatWebKey wechatWebKey = wechatWebKeyRepository.findByWeChatWebKey(key);
WeChatBusinessNo fuweChatBusinessNo = weChatBusinessNoRepository.findOne(wechatWebKey.getFuId());
data.setAppId(fuweChatBusinessNo.getAppId());
Long timestamp = System.currentTimeMillis() ;
data.setTimestamp(timestamp);
String noncestr = StringGeneratorUtil.generateString(5);
data.setNonceStr(noncestr);
String jsTicket= JsSdkUtils.getJsapiTicket(fuweChatBusinessNo);
data.setSignature(JsSdkUtils.sign(jsTicket, url, noncestr, timestamp));
return data ;
}
4、簽名制作
/**
*
* 作者: HealerJean
* 日期: 2018/12/11 下午5:14.
* 方法描述: 開始JS——SDK簽名
*/
public static String sign(String jsapi_ticket, String url,String noncestr ,Long timestamp) {
//注意這裡參數名必須全部小寫,且必須有序
String str = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + noncestr +
"×tamp=" + timestamp +
"&url=" + url;
String signature = AesUtils.SHA1(str);
return signature;
}
/**
* 微信 校驗 SHA1 加密
*
* @param decript
* @return
*/
public static String SHA1(String decript) {
try {
MessageDigest digest = MessageDigest
.getInstance("SHA-1");
digest.update(decript.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 位元組數組轉換為 十六進制 數
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}