微信jsapi开发教程之java获取微信timestamp,nonceStr,signature(第三课)

摘要:上一节课讲了如何java如何获取jsapi_ticket参数,其实这个参数是获取本文所说的timestamp,nonceStr,signature三个参数的关键凭证。

根据微信的官方文档和案例代码,上述三个参数是必须的,而且上述三个参数都是动态获取的,那么接下来,我们根据微信官方文档,用java代码来实现获取timestamp,nonceStr,signature这三个参数,在这里呢只是一个main方法执行打印并输出,这节课不实现把这三个参数传递到网页中并成功调出微信jsapi,下一节课将着重讲解。

Sign代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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<String, String> ret = sign(jsapi_ticket, url);
         for  (Map.Entry entry : ret.entrySet()) {
             System.out.println(entry.getKey() +  ", "  + entry.getValue());
         }
     };
   public  static  Map<String, String> sign(String jsapi_ticket, String url) {
         Map<String, String> ret =  new  HashMap<String, String>();
         String nonce_str = create_nonce_str();
         String timestamp = create_timestamp();
         String string1;
         String signature =  "" ;
 
         //注意这里参数名必须全部小写,且必须有序
         string1 =  "jsapi_ticket="  + jsapi_ticket +
                   "&noncestr="  + nonce_str +
                   "&timestamp="  + 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工具类代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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   转载请注明出处!谢谢!

猜你喜欢

转载自blog.csdn.net/ij_fantasy/article/details/78845401