微信公众号开发之如何接入微信的SDK(二)

缺乏、安全感 2022-06-06 23:36 357阅读 0赞

前段时间做了公众号的一些开发工作,比如接入了微信的分享等功能,需要就如微信的JS-SDK,这段时间程序出了一点小小的bug,故重头把这一块缕了一下,做一个总结,方便他们看,也方便自己以后复习。

一。准备工作

1.首先根据微信开发文档介绍,要想接入微信的sdk需要做一些签名的认证,此签名认证需要用到微信服务器token和服务器ticket

2.那么何谓服务器token呢,我这里将他谢伟服务器token是因为跟有一个临时token做区分的,服务器token是通过appid和appsecret获取到的,

3.临时的token是微信获取个人信息时,由微信的一个code来获取临时的token,再有这个临时的token获取用户的信息

4.此处的ticket是为了做shar1签名用的

5.根据接口将服务器token和ticket获得之后存放到数据库中,因为获取token和获取ticket的接口是有限的,故要存起来

二。然后再java层进行签名

  1. public RemoteResponse initJSSDK(RemoteRequest request){
  2. logger.info("进入WeixinJSSDKAction--initJSSDK");
  3. logger.debug("进入WeixinJSSDKAction--initJSSDK--debug");
  4. RemoteResponse response = null;
  5. DBAction db = null;
  6. try {
  7. String url = request.getParameter("url");
  8. url = java.net.URLDecoder.decode(url, "UTF-8");
  9. logger.info("initJSDate--url:"+url);
  10. String appId = "wx4c479737c9f2877c";//写死 因为这次活动是心聆家塾订阅号的活动,使用的心聆家塾的接口权限,此为心聆家塾的appId
  11. //1.获得token
  12. db = RemoteService.getDbInfo().createDBAction();
  13. db.openTransaction();
  14. //TODO
  15. //暂时写死
  16. long schoolRI = 100010;//写死 因为这次活动是心聆家塾订阅号的活动,使用的心聆家塾的接口权限
  17. logger.info("schoolRI(真实的):"+schoolRI);
  18. String access_token = "";
  19. String jsapi_ticket = "";
  20. Map<String, String> map_school = db.queryMap("select weixin_access_token, weixin_jsapi_ticket from edu_school where ri="+schoolRI+"");
  21. if(map_school == null){
  22. throw new Exception("您现在不属于任何学校");
  23. }else{
  24. if(map_school.containsKey("WEIXIN_ACCESS_TOKEN") && map_school.containsKey("WEIXIN_JSAPI_TICKET")){
  25. access_token = map_school.get("WEIXIN_ACCESS_TOKEN");
  26. jsapi_ticket = map_school.get("WEIXIN_JSAPI_TICKET");
  27. }
  28. }
  29. logger.info("access_token:"+access_token);
  30. logger.info("jsapi_ticket:"+jsapi_ticket);
  31. db.commitTransaction();
  32. Map<String, String> map = Sign.sign(jsapi_ticket, url);
  33. //6.获得jsApiList接口列表
  34. List<String> jsApiList = new ArrayList<String>();
  35. jsApiList.add("startRecord");
  36. //jsApiList.add("stopRecord");
  37. logger.info("--------------------------");
  38. logger.info("access_token:"+access_token);
  39. logger.info("jsapi_ticket:"+jsapi_ticket);
  40. logger.info("nonceStr:"+map.get("nonceStr"));
  41. logger.info("timestamp:"+map.get("timestamp"));
  42. logger.info("signature:"+map.get("signature"));
  43. logger.info("--------------------------");
  44. response = new RemoteResponse(request, 0, null);
  45. String errorCode = "0";
  46. if(map_school.get("WEIXIN_JSAPI_TICKET").isEmpty()){
  47. errorCode = "-1";
  48. }
  49. response.setAttribute("appId", appId);
  50. response.setAttribute("timestamp", map.get("timestamp"));
  51. response.setAttribute("nonceStr", map.get("nonceStr"));
  52. response.setAttribute("signature", map.get("signature"));
  53. response.setAttribute("jsApiList", jsApiList);
  54. response.setAttribute("errorCode", errorCode);
  55. } catch (Exception e) {
  56. logger.error("处理错误", e);
  57. response = new RemoteResponse(request, e);
  58. }
  59. return response;
  60. }

三。前端引入

四。init函数中的访问刚刚的java接口

  1. function init(){
  2. alert("pic_upload.jsp---init");
  3. try {
  4. var url = getUrl();
  5. alert("URL:"+url);
  6. $.get("<%=ermRestApiUrl%>", {service:"WeixinJSSDKAction", method:"initJSSDK", url: ""+url+""}, function(resp){
  7. if(resp.returnCode!=0){
  8. alert(resp.returnMessage);
  9. return;
  10. }
  11. var appId = resp.result.appId;
  12. var timestamp = resp.result.timestamp;
  13. var nonceStr = resp.result.nonceStr;
  14. var signature = resp.result.signature;
  15. var errorCode = resp.result.errorCode;
  16. if(errorCode != "-1"){
  17. wx.config({
  18. debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  19. appId: appId, // 必填,公众号的唯一标识
  20. timestamp: timestamp, // 必填,生成签名的时间戳
  21. nonceStr: nonceStr, // 必填,生成签名的随机串
  22. signature: signature,// 必填,签名,见附录1
  23. jsApiList: [
  24. 'checkJsApi',
  25. 'onMenuShareTimeline',
  26. 'onMenuShareAppMessage',
  27. 'onMenuShareQQ',
  28. 'onMenuShareWeibo',
  29. 'onMenuShareQZone',
  30. 'translateVoice',
  31. 'startRecord',
  32. 'stopRecord',
  33. 'closeWindow',
  34. 'getNetworkType'
  35. ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  36. });
  37. wx.ready(function() {
  38. //下句是为了解决苹果手机打开页面不自动播放音频的问题
  39. alert("成功了");
  40. });
  41. wx.error(function (res) {
  42. alert("失败了");
  43. });
  44. }
  45. });
  46. } catch (e) {
  47. alert(e.message);
  48. }
  49. }

发表评论

表情:
评论列表 (有 0 条评论,357人围观)

还没有评论,来说两句吧...

相关阅读

    相关 公众接入服务器

    引言 微信公众号可以分享人文趣事,也可以用来传播公司文化,不管我们用来分享什么,总少不了与用户的交互环节,为了提高用户体验,我们可以通过自定义接入服务器的形式来实现更...