@V型知識庫原創,轉載請注明出處,謝謝
上一節課講了如何java如何獲取jsapi_ticket參數,其實這個參數是獲取本文所說的timestamp,nonceStr,signature三個參數的關鍵憑證。
根據微信的官方文檔和案例代碼,上述三個參數是必須的,而且上述三個參數都是動態獲取的,那么接下來,我們根據微信官方文檔,用java代碼來實現獲取timestamp,nonceStr,signature這三個參數,在這里呢只是一個main方法執行打印並輸出,這節課不實現把這三個參數傳遞到網頁中並成功調出微信jsapi,下一節課將着重講解。
Sign代碼:
package com.test.util;
/***
* V型知識庫 www.vxzsk.com
*/
import java.util.UUID;
import java.util.Map;
import java.util.HashMap;
import java.util.Formatter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;
public class Sign {
public static void main(String[] args) {
String jsapi_ticket =JsapiTicketUtil.getJSApiTicket();;
// 注意 URL 一定要動態獲取,不能 hardcode
String url = "http://www.vxzsk.com/xx/x.do";//url是你請求的一個action或者controller地址,並且方法直接跳轉到使用jsapi的jsp界面
Map ret = sign(jsapi_ticket, url);
for (Map.Entry entry : ret.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
};
public static Map sign(String jsapi_ticket, String url) {
Map ret = new HashMap();
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=" + url;
System.out.println(string1);
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();
}
ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
return ret;
}
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;
}
private static String create_nonce_str() {
return UUID.randomUUID().toString();
}
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}
第16行main方法中的一個變量url就是你請求的一個action或者controller地址,並且方法直接跳轉到使用jsapi的jsp界面,或者直接是個jsp地址也可以,例如http://www.vxzsk.com/xx/jsapi.jsp
獲取jsapi_ticket工具類代碼:
package com.test.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import net.sf.json.JSONObject;
import com.test.weixin.TestAcessToken;
/***
* @author V型知識庫 www.vxzsk.com
*
*/
public class JsapiTicketUtil {
/***
* 模擬get請求
* @param url
* @param charset
* @param timeout
* @return
*/
public static String sendGet(String url, String charset, int timeout)
{
String result = "";
try
{
URL u = new URL(url);
try
{
URLConnection conn = u.openConnection();
conn.connect();
conn.setConnectTimeout(timeout);
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
String line="";
while ((line = in.readLine()) != null)
{
result = result + line;
}
in.close();
} catch (IOException e) {
return result;
}
}
catch (MalformedURLException e)
{
return result;
}
return result;
}
/***
* 獲取acess_token
* 來源www.vxzsk.com
* @return
*/
public static String getAccessToken(){
String appid="你公眾號基本設置里的應用id";//應用ID
String appSecret="你公眾號基本設置里的應用密鑰";//(應用密鑰)
String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appSecret+"";
String backData=TestAcessToken.sendGet(url, "utf-8", 10000);
String accessToken = (String) JSONObject.fromObject(backData).get("access_token");
return accessToken;
}
/***
* 獲取jsapiTicket
* 來源 www.vxzsk.com
* @return
*/
public static String getJSApiTicket(){
//獲取token
String acess_token= JsapiTicketUtil.getAccessToken();
String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+acess_token+"&type=jsapi";
String backData=TestAcessToken.sendGet(urlStr, "utf-8", 10000);
String ticket = (String) JSONObject.fromObject(backData).get("ticket");
return ticket;
}
public static void main(String[] args) {
String jsapiTicket = JsapiTicketUtil.getJSApiTicket();
System.out.println("調用微信jsapi的憑證票為:"+jsapiTicket);
}
}
讀者可直接把代碼復制到myeclipse或者Eclipse中運行main方法即可,但是在這里提示讀者JsapiTicketUtil中獲取acces_token方法中需要讀者自行填寫自己的appid和appsecret。