java微信網頁授權獲取使用者資訊以及JSSDK自定義分享等功能
阿新 • • 發佈:2019-01-01
<span style="font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">一個超級重要的類,簽名類忘記發源碼了:</span>
<pre name="code" class="java"><span style="font-size:18px;color:#ff0000;background-color: rgb(255, 255, 255);">SignUtil.java</span>
import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Formatter; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.lvyouju.entity.JsapiTicket; import org.lvyouju.entity.SignPackage; import org.lvyouju.web.controller.CommonController; /** * * @Description: 驗證簽名工具類 * @ClassName: SignUtil * @author heboy * @date 2015年9月24日 下午5:35:45 */ public class SignUtil { /** * * @Description: 驗證簽名 * @Title: checkSignature * @return boolean * @date: 2015年9月8日 上午10:56:37 * @author heboy */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String token = CommonUtil.weixinProperties.getString("wx.token"); String[] arr = new String[] { token, timestamp, nonce }; // 將token、timestamp、nonce三個引數進行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 將三個引數字串拼接成一個字串進行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 將sha1加密後的字串可與signature對比,標識該請求來源於微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * * @Description: 將位元組陣列轉換為十六進位制字串 * @Title: byteToStr * @return String * @date: 2015年9月8日 上午10:56:50 * @author heboy */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * * @Description: 將位元組轉換為十六進位制字串 * @Title: byteToHexStr * @return String * @date: 2015年9月8日 上午10:57:02 * @author heboy */ 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; } /** * * @Description: 將位元組陣列轉換成字串 * @Title: byteToHex * @return String * @date: 2015年9月11日 下午3:30:46 * @author heboy */ private static String byteToHex(final byte[] hash) { Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; } /** * * @Description: 驗證簽名 * @Title: sign * @return SignPackage * @date: 2015年9月14日 上午8:54:54 * @author heboy */ public static SignPackage sign(HttpServletRequest request) { StringBuffer requestUrl = request.getRequestURL(); String queryString = request.getQueryString(); String sighurl = requestUrl +"?"+queryString; String jsapi_ticket = TokenUtil.jsapiTicket.getTicket(); String nonce_str = create_nonce_str(); String timestamp = create_timestamp(); String string1; String signature = ""; // 注意這裡引數名必須全部小寫,且必須有序 string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "×tamp=" + timestamp + "&url=" + sighurl; try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getBytes("UTF-8")); signature = byteToHex(crypt.digest()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } SignPackage signPackage = new SignPackage(); signPackage.setNonceStr(nonce_str); signPackage.setSignature(signature); signPackage.setTimestamp(timestamp); signPackage.setUrl(sighurl); JsapiTicket jsapiTicket = new JsapiTicket(); jsapiTicket.setTicket(jsapi_ticket); signPackage.setJsapiTicket(jsapiTicket); signPackage.setAppid(CommonUtil.weixinProperties.getString("wx.appid")); return signPackage; } /** * * @Description: 獲取隨機字串 * @Title: create_nonce_str * @return String * @date: 2015年9月14日 上午8:53:04 * @author heboy */ private static String create_nonce_str() { return UUID.randomUUID().toString(); } /** * * @Description: 建立時間戳 * @Title: create_timestamp * @return String * @date: 2015年9月14日 上午8:53:27 * @author heboy */ private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); } }