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

本文介绍如何使用Java获取微信JSAPI所需的timestamp, nonceStr 和 signature三个参数。通过具体代码示例,展示了从获取jsapi_ticket到生成最终签名的全过程。

摘要:上一节课讲了如何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   转载请注明出处!谢谢!
### 如何在PHP中为微信小程序生成签名所需参数 在PHP中为微信小程序生成签名所需的参数 `appId`、`timestamp`、`nonceStr` 和 `signature` 的过程中,需要遵循特定的工作流。以下是具体实现方式: #### 1. **生成时间戳 (Timestamp)** 时间戳通常表示从 Unix 纪元(1970年1月1日)以来的秒数。可以通过 PHP 函数 `time()` 来获取当前时间的时间戳。 ```php $timestamp = time(); // 获取当前时间戳 ``` #### 2. **生成随机字符串 (NonceStr)** 为了增强安全性,需生成一个不可预测的随机字符串作为 `nonceStr`。可以使用 PHP 中的 `bin2hex(random_bytes())` 方法来生成安全的随机字符串。 ```php function generateNonceStr($length = 16) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $str = ''; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } $nonceStr = generateNonceStr(); ``` #### 3. **准备待签名参数** 将必要的参数按字典序排列,并拼接成一个字符串用于后续加密处理。这些参数可能包括但不限于 `appId`、`secret` 或其他业务相关字段。 假设已知 `appId` 和 URL,则可构造如下形式的参数列表: ```php $params = [ 'jsapi_ticket' => 'your_jsapi_ticket', // 替换为实际 jsapi ticket 值 'noncestr' => $nonceStr, 'timestamp' => $timestamp, 'url' => 'http://example.com/page.html' ]; ``` #### 4. **对参数进行排序并拼接字符串** 按照键名升序重新整理数组中的数据项;接着依次取出每一对键值组合形成新的单一串连结构体以便下一步骤操作——即计算消息摘要值。 ```php ksort($params); // 对关联数组按键名排序 $string = http_build_query($params, '', '&'); // 将查询参数转换为 URL 编码格式 ``` #### 5. **生成 SHA1 加密后的 Signature** 最后一步是对上面获得的结果应用标准单向散列函数 SHA1 进行加密运算得出最终结果作为我们的数字指纹或者说电子签章。 ```php $signature = sha1($string); ``` 完整的代码示例如下所示: ```php <?php // 定义辅助函数 function generateNonceStr($length = 16){ $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; } $appId = 'wx123456'; // 微信开放平台分配给开发者的唯一标识符 AppID $url = 'https://www.example.com/path/to/resource'; // 当前页面完整路径地址 // 初始化变量 $timestamp = time(); $nonceStr = generateNonceStr(); // 构建基础参数集合 $params = array( 'jsapi_ticket'=>'JsApiTicketExampleValue',// 需要先通过接口换取有效的 jsapi_ticket 'noncestr'=>$nonceStr , 'timestamp'=> strval($timestamp), 'url'=>$url ); // 字母顺序重排参数组 uksort($params,'strcmp'); // 创建初始字符串 $str =''; foreach ($params as $key=>$value ){ if ('' !== trim($value)){ $str .="{$key}={$value}&"; } } $str=rtrim($str,"&"); // 计算签名 $signature =sha1($str); echo json_encode([ 'appId' =>$appId, 'timestamp' =>$timestamp, 'nonceStr' =>$nonceStr, 'signature' =>$signature ]); ?> ``` 以上程序片段展示了如何利用PHP语言完成整个流程从而得到符合要求的标准输出 JSON 数据包[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值