根据微信的官方文档和案例代码,上述三个参数是必须的,而且上述三个参数都是动态获取的,那么接下来,我们根据微信官方文档,用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
for
(Map.Entry entry : ret.entrySet()) {
System.out.println(entry.getKey() +
", "
+ entry.getValue());
}
};
public
static
Map
Map
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。
转自:http://www.vxzsk.com/79.html