微信jssdk开发 java_Java微信公众平台开发(十一)--微信JSSDK中Config配置

JSSDK曾经引爆前端以及后端的工程师,其魔性的力量毋庸置疑,在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它的config配置实现,参考文档:http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html  !

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包,通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验;本篇将面向网页开发者介绍微信JS-SDK如何使用及相关注意事项!JSSDK使用步骤:

步骤一:在微信公众平台绑定安全域名

步骤二:后端接口实现JS-SDK配置需要的参数

步骤三:页面实现JS-SDk中config的注入配置,并实现对成功和失败的处理

(一)在微信公众平台绑定安全域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”(如下图),如果需要使用支付类接口,需要确保支付目录在支付的安全域名下,否则将无法完成支付!(注:登录后可在“开发者中心”查看对应的接口权限),因为我用的是测试号,所以登录以后界面就如下图:

(二)后端接口实现JS-SDK配置需要的参数

1 wx.config({2 debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。3 appId: '', // 必填,公众号的唯一标识4 timestamp: , // 必填,生成签名的时间戳5 nonceStr: '', // 必填,生成签名的随机串6 signature: '',// 必填,签名,见附录17 jsApiList: [] // 必填,需要使用的JS接口列表8 });

我们查看js-sdk的配置文档和以上的代码可以发现config的配置需要4个必不可少的参数appId、timestamp、nonceStr、signature,这里的signature就是我们生成的签名!

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket ,所以这里我们将jsapi_ticket的获取放到定时任务中,因为它和token的生命周期是一致的,所以在这里我们将他们放到一起。

①将原有的定时任务WeChatTask中获取token的代码做如下修改:

1 packagecom.gede.wechat.common;2 importjava.text.SimpleDateFormat;3 importjava.util.Date;4 importjava.util.HashMap;5 importjava.util.Map;6

7 importcom.gede.web.util.GlobalConstants;8 importcom.gede.wechat.util.HttpUtils;9

10 importnet.sf.json.JSONObject;11 /**

12 *@authorgede13 *@versiondate:2019年5月26日 下午7:50:3814 * @description :15 */

16 public classWeChatTask {17 /**

18 * @Description: 任务执行体19 *@param @throwsException20 */

21 public void getToken_getTicket() throwsException {22 Map params = new HashMap();23 //获取token执行体

24 params.put("grant_type", "client_credential");25 params.put("appid", GlobalConstants.getInterfaceUrl("appid"));26 params.put("secret", GlobalConstants.getInterfaceUrl("AppSecret"));27 String jstoken =HttpUtils.sendGet(28 GlobalConstants.getInterfaceUrl("tokenUrl"), params);29

30 String access_token =JSONObject.fromObject(jstoken).getString(31 "access_token"); //获取到token并赋值保存

32 GlobalConstants.interfaceUrlProperties.put("access_token", access_token);33

34 //获取jsticket的执行体

35 params.clear();36 params.put("access_token", access_token);37 params.put("type", "jsapi");38 String jsticket =HttpUtils.sendGet(39 GlobalConstants.getInterfaceUrl("ticketUrl"), params);40 String jsapi_ticket =JSONObject.fromObject(jsticket).getString(41 "ticket");42 GlobalConstants.interfaceUrlProperties.put("jsapi_ticket", jsapi_ticket); //获取到js-SDK的ticket并赋值保存

43

44 System.out.println("jsapi_ticket================================================" +jsapi_ticket);45 System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"token为=============================="+access_token);46 }47 }

然后我们根据【JS-SDK使用权限签名算法】对参数进行签名得到signature,这里的url必须采用前端传递到后端,因为每次的url会有所变化,

②所以我们自定义一个权限签名算法JSSDK_Config类,如下:

1 packagecom.gede.wechat.common;2

3 importjava.security.MessageDigest;4 importjava.util.Formatter;5 importjava.util.HashMap;6 importjava.util.UUID;7 importcom.gede.web.util.GlobalConstants;8

9 /**

10 *@authorgede11 *@versiondate:2019年5月30日 下午2:52:5712 * @description :13 */

14 public classJSSDK_Config {15

16 /**

17 * @Description: 前端jssdk页面配置需要用到的配置参数18 *@param @returnhashmap {appid,timestamp,nonceStr,signature}19 *@param @throwsException20 *@authorgede21 */

22 public static HashMap jsSDK_Sign(String url) throwsException {23 String nonce_str =create_nonce_str();24 String timestamp=GlobalConstants.getInterfaceUrl("timestamp");25 String jsapi_ticket=GlobalConstants.getInterfaceUrl("jsapi_ticket");26 //注意这里参数名必须全部小写,且必须有序

27 String string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" +nonce_str28 + "&timestamp=" + timestamp + "&url=" +url;29 MessageDigest crypt = MessageDigest.getInstance("SHA-1");30 crypt.reset();31 crypt.update(string1.getBytes("UTF-8"));32 String signature =byteToHex(crypt.digest());33 HashMap jssdk=new HashMap();34 jssdk.put("appId", GlobalConstants.getInterfaceUrl("appid"));35 jssdk.put("timestamp", timestamp);36 jssdk.put("nonceStr", nonce_str);37 jssdk.put("signature", signature);38 returnjssdk;39

40 }41

42 private static String byteToHex(final byte[] hash) {43 Formatter formatter = newFormatter();44 for (byteb : hash) {45 formatter.format("%02x", b);46 }47 String result =formatter.toString();48 formatter.close();49 returnresult;50 }51

52 private staticString create_nonce_str() {53 returnUUID.randomUUID().toString();54 }55

56 }

③编写使用JSSDK的controller类。新增JssdkController,代码如下:

1 packagecom.gede.wechat.controller;2

3 importjava.util.Map;4 importorg.springframework.stereotype.Controller;5 importorg.springframework.web.bind.annotation.RequestMapping;6 importorg.springframework.web.bind.annotation.RequestMethod;7 importorg.springframework.web.bind.annotation.RequestParam;8 importorg.springframework.web.bind.annotation.ResponseBody;9

10

11 /**

12 *@authorgede13 *@versiondate:2019年5月30日 下午3:03:3114 * @description :15 */

16 @Controller17 @RequestMapping("/jssdk")18 public classJssdkController {19 /**

20 * @Description: 前端获取微信JSSDK的配置参数21 *@param @paramresponse22 *@param @paramrequest23 *@param @paramurl24 *@param @throwsException25 */

26 @RequestMapping(value="config",method=RequestMethod.POST)27 @ResponseBody28 publicMessage JSSDK_config(29 @RequestParam(value = "url", required = true) String url) {30 try{31 System.out.println(url);32 Map configMap =JSSDK_Config.jsSDK_Sign(url);33 returnMessage.success(configMap);34 } catch(Exception e) {35 System.out.println("error happened!!!");36 returnMessage.error();37 }38

39 }40 }

到这里我们后端对jssdk的签名参数的封装就基本完成了,其中用到了我们自己写的Message类,代码如下:

1 packagecom.gede;2

3 importcom.gede.Code;4

5 /**

6 *@authorgede7 *@versiondate:2019年5月30日 下午3:09:358 * @description :用于消息回复9 */

10 public classMessage {11 private intcode;12 privateString msg;13 privateObject data;14 publicMessage() {15

16 }17

18 public intgetCode() {19 returncode;20 }21

22 public void setCode(intcode) {23 this.code =code;24 }25

26 publicString getMsg() {27 returnmsg;28 }29

30 public voidsetMsg(String msg) {31 this.msg =msg;32 }33

34 publicObject getData() {35 returndata;36 }37

38 public voidsetData(Object data) {39 this.data =data;40 }41

42 public Message(intcode,String msg) {43 this.code=code;44 this.msg=msg;45 }46

47 public Message(intcode,String msg,Object data) {48 this.code=code;49 this.msg=msg;50 this.data=data;51 }52 /**

53 * 返回成功消息54 *@paramcontent 内容55 *@return成功消息56 */

57 public staticMessage success(String content, Object data) {58 return newMessage(Code.SUCCESS, content, data);59 }60 /**

61 * 返回成功消息62 *@paramcontent 内容63 *@return成功消息64 */

65 public staticMessage success(String content) {66 return newMessage(Code.SUCCESS, content);67 }68 /**

69 * 返回成功消息70 *@paramcontent 内容71 *@return成功消息72 */

73 public staticMessage success(Object data) {74 System.out.println(Code.SUCCESS);75 return new Message(Code.SUCCESS, "操作成功",data);76 }77 /**

78 * 返回成功消息79 *@paramcontent 内容80 *@return成功消息81 */

82 public staticMessage success() {83 return new Message(Code.SUCCESS, "操作成功");84 }85 /**

86 * 返回失败消息87 *@paramcontent 内容88 *@return成功消息89 */

90 public static Message error(intcode,String content, Object data) {91 return newMessage(code, content, data);92 }93 /**

94 * 返回失败消息95 *@paramcontent 内容96 *@return成功消息97 */

98 public staticMessage error(String content, Object data) {99 return newMessage(Code.FAIL, content, data);100 }101

102 /**

103 * 返回失败消息104 *@paramcontent 内容105 *@return成功消息106 */

107 public staticMessage error(String content) {108 return newMessage(Code.FAIL, content);109 }110 /**

111 * 返回失败消息112 *@paramcontent 内容113 *@return成功消息114 */

115 public staticMessage error() {116 return new Message(Code.FAIL, "操作失败");117 }118

119 }

code类代码为:

1 packagecom.gede;2 /**

3 *@authorgede4 *@versiondate:2019年5月30日 下午3:10:345 * @description :状态码6 */

7 public classCode {8 public static final int SUCCESS = 200; //成功

9 public static final int PARAMATER = 400; //参数错误

10 public static final int FAIL =500; //系统异常

11 }

到这里我们就开始写前端界面,来响应我们的方法。

(三)页面实现JS-SDk中config的注入配置,并实现对成功和失败的处理

这里在web目录下新建jssdkconfig.jsp,在jsp页面用ajax方式获取并进行配置,并开启debug模式,打开之后就可以看到配置是否成功的提示,简单代码如下:

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

8

JSSDk配置

9

10

11

12 functionjssdk() {13 $.ajax({14 url :"http://zqfbk.iok.la/wechat/wechatconfig/jssdk",15 type :'post',16 dataType :'json',17 contentType :"http://zqfbk.iok.la/mychat/jssdk/config",18 data : {19 'url': location.href.split('#')[0]20 },21 success :function(data) {22 wx.config({23 debug :true,24 appId : data.data.appId,25 timestamp : data.data.timestamp,26 nonceStr : data.data.nonceStr,27 signature : data.data.signature,28 jsApiList : ['checkJsApi','onMenuShareTimeline',29 'onMenuShareAppMessage','onMenuShareQQ',30 'onMenuShareWeibo','hideMenuItems',31 'showMenuItems','hideAllNonBaseMenuItem',32 'showAllNonBaseMenuItem','translateVoice',33 'startRecord','stopRecord','onRecordEnd',34 'playVoice','pauseVoice','stopVoice',35 'uploadVoice','downloadVoice','chooseImage',36 'previewImage','uploadImage','downloadImage',37 'getNetworkType','openLocation','getLocation',38 'hideOptionMenu','showOptionMenu','closeWindow',39 'scanQRCode','chooseWXPay',40 'openProductSpecificView','addCard','chooseCard',41 'openCard']42 });43 }44 });45 }46

47 functionisWeiXin5() {48 varua=window.navigator.userAgent.toLowerCase();49 varreg= /MicroMessenger\/[5-9]/i;50 returnreg.test(ua);51 }52

53 window.οnlοad= function() {54 //if (isWeiXin5() == false) {

55 //alert("您的微信版本低于5.0,无法使用微信支付功能,请先升级!");

56 //}

57 jssdk();58 };59

60

61

62

nihao

63

64

(四)pc端进行测试

我的浏览器是火狐developer版的,其他的也都差不多,打开浏览器按F12,找到一个叫网络的窗口,也有的浏览器叫network像我的就是network。

①运行项目后,打开浏览器输入访问地址http://zqfbk.iok.la/mychat/;点击Jssdk这里需要设置一下超链接,因为懒得从视图控制器返回了,超链接代码:

Welcome to Mychat

">UserInfo

">Jssdk

6905242fcc45bab14d5306c28c9d0b7e.png

②在我么点击Jssdk的时候,先按f12 打开network视图窗口。,然后再点击,效果图如下:

4af4d1bf725f86ecf69a097196d99da0.png

f302abea84734f7606b3d4e90cfc4b39.png

③如果你看到你的状态码中没有404,那你多半成功了,我们找对对应的文件名为config的那一行点击一下,进行查看,此时后台也会做出成功提示,上图:

c6fb2fbfb12c52832b59ea4cfd66e821.png

e502359e045e748f87f8481ed244ecfe.png

如果提示是这样,那么标识我们的配置是成功的,那么到这里微信jssdk的配置就基本完成了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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 获取位置失败并出现签名错误时,可能是网络问题、位置权限、签名配置或使用的接口不正确导致的。在解决问题时,可以逐一排查以上原因,并根据具体情况进行相应的调试和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值