微信JSSDK开发JAVA版实现

JSSDK JAVA开发第一步:绑定域名

先登录微信公众平台进入“公众号设置”(作者:在页面左下角,认证订阅号,认证服务号皆可配置)

(备注:登录后可在“开发者中心”可查看对应的接口权限。)

set.jpg

再选择页面上方“功能设置”

1.jpg

这时可以看到“JS接口安全域名”。点击设置弹出以下输入框,按照要求填写域名(注意:IP不可用)

如:www.ipastimes.com, ipastimes.com,  examples.ipastimes.com 可用

2.jpg

JSSDK JAVA开发第二步:引入微信JS

    在需要引用微信JS接口的页面引入微信js文件(微信在其浏览器内置wx对象)http://res.wx.qq.com/open/js/jweixin-1.0.0.js

JSSDK JAVA开发第三步:后台实现签名逻辑

    1.获取access_token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
     /**
      * 获取接口访问凭证
     
      * @param appid 凭证
      * @param appsecret 密钥
      * @return
      */
     public  static  String getAccess_token(String appid, String appsecret) {
             //凭证获取(GET)
         String requestUrl = token_url.replace( "APPID" , appid).replace( "APPSECRET" , appsecret);
         // 发起GET请求获取凭证
         JSONObject jsonObject = httpsRequest(requestUrl,  "GET" null );
                 String access_token =  null ;
         if  ( null  != jsonObject) {
             try  {
                 access_token = jsonObject.getString( "access_token" );
             catch  (JSONException e) {
                 // 获取token失败
                 log.error( "获取token失败 errcode:{} errmsg:{}" , jsonObject.getInt( "errcode" ), jsonObject.getString( "errmsg" ));
             }
         }
         return  access_token;
     }

    2.获取jsapi_ticket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
      * 调用微信JS接口的临时票据
     
      * @param access_token 接口访问凭证
      * @return
      */
     public  static  String getJsApiTicket(String access_token) {
         String requestUrl = url.replace( "ACCESS_TOKEN" , access_token);
         // 发起GET请求获取凭证
         JSONObject jsonObject = httpsRequest(requestUrl,  "GET" null );
         String ticket =  null ;
         if  ( null  != jsonObject) {
             try  {
                 ticket = jsonObject.getString( "ticket" );
             catch  (JSONException e) {
                 // 获取token失败
                 log.error( "获取token失败 errcode:{} errmsg:{}" , jsonObject.getInt( "errcode" ), jsonObject.getString( "errmsg" ));
             }
         }
         return  ticket;
     }

3.实现签名逻辑(根据官方sample改)

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import  java.io.UnsupportedEncodingException;
import  java.security.MessageDigest;
import  java.security.NoSuchAlgorithmException;
import  java.text.SimpleDateFormat;
import  java.util.Date;
import  java.util.Formatter;
import  java.util.HashMap;
import  java.util.Map;
import  java.util.UUID;
 
import  javax.servlet.http.HttpServletRequest;
 
import  net.sf.json.JSONObject;
 
import  org.apache.struts2.ServletActionContext;
 
public  class  PastUtil {
     public  static  Token token =  null ;
     public  static  String time =  null ;
     public  static  String jsapi_ticket =  null ;
     /**
     
      * @param appId   公账号appId
      * @param appSecret
      * @param url    当前网页的URL,不包含#及其后面部分
      * @return
      */
     public  static  String getParam(String appId,String appSecret){
         if (token ==  null ){
             token = CommonUtil.getToken(appId, appSecret);
             jsapi_ticket = CommonUtil.getJsApiTicket(token.getAccessToken());
             time = getTime();
         } else {
             if (!time.substring( 0 13 ).equals(getTime().substring( 0 13 ))){  //每小时刷新一次
                 token =  null ;
                 token = CommonUtil.getToken(appId, appSecret);
                 jsapi_ticket = CommonUtil.getJsApiTicket(token.getAccessToken());
                 time = getTime();
             }
         }
         
         String url = getUrl();
         
         Map<String, String> params = sign(jsapi_ticket, url);
         params.put( "appid" , appId);
         
         JSONObject jsonObject = JSONObject.fromObject(params);  
         String jsonStr = jsonObject.toString();
         System.out.println(jsonStr);
         return  jsonStr;
     }
     
     private  static  String getUrl(){
         HttpServletRequest request = ServletActionContext.getRequest();
         
         StringBuffer requestUrl = request.getRequestURL();
         
         String queryString = request.getQueryString();
         String url = requestUrl + "?" +queryString;
         return  url;
     }
     
     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 str;
         String signature =  "" ;
 
         //注意这里参数名必须全部小写,且必须有序
         str =  "jsapi_ticket="  + jsapi_ticket +
                   "&noncestr="  + nonce_str +
                   "&timestamp="  + timestamp +
                   "&url="  + url;
 
         try
         {
             MessageDigest crypt = MessageDigest.getInstance( "SHA-1" );
             crypt.reset();
             crypt.update(str.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 );
     }
     
     //获取当前系统时间 用来判断access_token是否过期
     public  static  String getTime(){
         Date dt= new  Date();
         SimpleDateFormat sdf = new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
         return  sdf.format(dt);
     }
}

大部分开发者在签名认证处出错,开启debug模式,当进入页面时会alert出如下信息:

1.jpg

按照如下步骤排错:

1.确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。

2.确认config中noncestr, timestamp与用以签名中的对应noncestr, timestamp一致。

3.确认url是页面完整的url,包括GET参数部分。

4.确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。

5.确保一定缓存access_token和jsapi_ticket,可以减少两次服务器请求加速体验外,还避免了触发频率限制,提高服务稳定性。

附JS SDK权限表

JSSDK 权限.jpg

更多信息请参考:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 微信jssdk是一种用于在网页中调用微信功能的开发工具包。其中,获取位置是其中的一个功能之一。当在调用微信jssdk获取位置接口时,如果出现获取位置失败,签名错误的情况,可能是以下几个原因所导致: 1. 签名错误:在调用获取位置接口前,需要对相关参数进行签名验证,以确保数据的完整性和安全性。签名错误可能是由于签名算法实现错误、调用接口时传入的参数错误或者服务器时间戳与微信服务器时间戳不一致等原因所导致。解决方法是检查签名算法是否正确,参数是否正确传递,并确保服务器时间戳与微信服务器时间戳一致。 2. 接口权限问题:在申请微信jssdk使用权限时,需要在公众号设置中配置相关权限。如果没有正确配置接口权限,则无法调用获取位置接口,会出现获取位置失败的情况。解决方法是检查公众号设置中的权限配置,确保获取位置接口的权限被正确开启。 3. 用户拒绝授权:在用户使用网页时,系统会通过微信弹出授权窗口,询问用户是否允许获取位置信息。如果用户选择拒绝授权,则无法获取位置信息,从而导致获取位置失败的情况。解决方法是在用户拒绝授权后,提示用户重新授权,或者提供其他方式获取位置信息。 总之,当微信jssdk获取位置失败,签名错误时,需要仔细检查签名算法、参数传递和接口权限配置等方面的问题,并根据具体情况进行相应的调整和处理。 ### 回答2: 微信jssdk是一个用于在网页中调用微信的接口的开发工具包。在使用jssdk时,通过wx.config方法来进行配置,并且在配置的过程中需要传入一个参数:签名(signature)。 签名是基于一定算法生成的,用于验证消息的真实性和完整性。当微信jssdk获取位置失败并且报错签名错误时,可能是由以下几个原因造成的: 1. 签名生成错误:签名的生成过程中可能出现错误,导致最终生成的签名不正确。这可能是由于服务端生成签名的算法或参数配置有误,需要检查签名生成代码并修正错误。 2. 参数传递错误:在传递签名参数时,可能存在传递错误的情况。签名参数包括appId、timestamp、nonceStr、signature,这些参数需要按照规定的格式传递给wx.config方法。需要仔细检查参数传递的过程,确保参数的准确性和完整性。 3. SSL证书问题:微信要求在调用jssdk时使用HTTPS协议,并且需要使用有效的SSL证书。如果网页没有配置有效的SSL证书,那么在获取位置时会报错签名错误。需要确保网页使用HTTPS协议,并且配置了有效的SSL证书。 解决以上问题的步骤为: 1. 检查签名生成代码,确认生成签名的算法和参数没有错误; 2. 检查参数传递过程,确保传递给wx.config方法的参数准确无误; 3. 确认网页使用了HTTPS协议,并配置了有效的SSL证书; 4. 在修改代码后,重新测试获取位置功能,如果问题仍然存在,可以参考微信官方文档或寻求微信开发者论坛的帮助。 ### 回答3: 微信 JSSDK 是一种用于开发微信公众号的前端开发工具包,它提供了丰富的接口和功能,方便开发者构建丰富的微信公众号应用。当使用 JSSDK 中的定位功能时,获取位置失败并出现签名错误的问题可能是由以下几个原因引起的。 1. 网络问题:在使用微信 JSSDK 时,要求设备能够连接到互联网,如果网络不稳定或者设备无法连接到互联网,就可能导致定位功能失败。请确保设备有稳定的网络连接。 2. 位置权限:微信 JSSDK 需要用户授权才能获取设备的位置信息。如果用户拒绝了位置权限请求,那么就无法获取到位置信息。在使用定位功能前,应该向用户请求位置权限,并在用户授权后才能使用。 3. 未配置有效的签名:微信 JSSDK 需要在后台进行配置并生成签名,用于验证请求的合法性。如果签名错误,就无法正确获取位置信息。在生成签名时,需要保证参数的正确性,包括参数的顺序、大小写等。请仔细检查签名生成的代码逻辑和参数配置是否正确。 4. 使用的 API 接口不支持:微信 JSSDK 提供了多个获取位置的接口,不同的接口可能有不同的要求和适用场景。如果使用的接口与当前场景不匹配或者不支持当前设备的操作系统本,可能会导致获取位置失败。请确认使用的接口与当前场景的要求是匹配的。 综上所述,当微信 JSSDK 获取位置失败并出现签名错误时,可能是网络问题、位置权限、签名配置或使用的接口不正确导致的。在解决问题时,可以逐一排查以上原因,并根据具体情况进行相应的调试和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值