App.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <script>
  2. const config = require('./static/config.js');
  3. export default {
  4. onLaunch: function() {
  5. let href = location.href;
  6. let code = this.getQueryString('code');
  7. /**
  8. * 解题思路,由于不可抗因素,导致必须想办法,现有如下想法
  9. * (一)如是不带code,则为自然进入,给他用微信加code;
  10. * (二)如果带了code,则有可能是分享(非图片分享)或者复制链接进来的
  11. * bug: 如果之前去掉code,则会进入(一)进入了死循环;
  12. * 想法:先去让他带着code去regist,成功则说明是新的code,失败则去掉code进入(一)
  13. */
  14. if(!code){
  15. let url = href.split('#')[0];
  16. url = encodeURIComponent(url);
  17. url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+config.appid+"&redirect_uri="+url+"&response_type=code&scope=snsapi_userinfo&state=123&connect_redirect=1#wechat_redirect"
  18. window.location.href = url;
  19. }
  20. this.globalData.BASE_URL = config.BASE_URL;
  21. let shareToken = this.getQueryString('shareToken');
  22. let projectId = this.getQueryString('projectId');
  23. this.globalData.projectId = projectId||'';
  24. this.globalData.shareToken = shareToken||'';
  25. this.regist();
  26. this.signJsapiTicket();
  27. },
  28. onShow: function() {
  29. document.body.style.setProperty("background-color",this.globalData.color4);
  30. },
  31. onHide: function() {
  32. },
  33. methods: {
  34. getThemeInfo() {
  35. },
  36. getQueryString(name){
  37. var reg = new RegExp("(^|\\?|&)"+ name +"=([^&]*)(\\s|&|$)", "i");
  38. return reg.test(location.href) ? unescape(RegExp.$2.replace(/\+/g, " ")) : ""
  39. },
  40. async regist() {
  41. let code = this.getQueryString('code');
  42. if(code){
  43. let ret = await this.$myRequest({
  44. url: "/regist",
  45. data: {
  46. "code": code,
  47. "shareToken":this.globalData.shareToken||"",
  48. "projectId":this.globalData.projectId||"",
  49. }
  50. });
  51. if (ret.data.success) {
  52. let userId = ret.data.single.userId;
  53. this.globalData.userId = userId;
  54. if (ret.data.single.authed == 1) {
  55. let token = ret.data.single.token;
  56. this.globalData.token = token
  57. }
  58. uni.$emit('request')
  59. }else{
  60. //注册失败,去掉老的code,会进入onLaunch,重新获取新的code
  61. let projectId = this.getQueryString('projectId');
  62. let shareToken = this.getQueryString('shareToken');
  63. let url = location.origin+location.pathname + "?projectId="+projectId+"&shareToken="+shareToken;
  64. window.location.href = url;
  65. }
  66. }
  67. },
  68. async signJsapiTicket(){
  69. const wx = require('weixin-js-sdk');
  70. let url = location.href.split('#')[0]
  71. let parmas = {
  72. url: url,
  73. }
  74. let self = this;
  75. let res = await this.$myRequest({
  76. url: '/wechat/signJsapiTicket',
  77. data: parmas,
  78. method:"GET",
  79. });
  80. if(res.data.success){
  81. let single = res.data.single;
  82. wx.config({
  83. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  84. appId: config.appid, // 必填,公众号的唯一标识
  85. timestamp: single.timestamp, // 必填,生成签名的时间戳
  86. nonceStr: single.nonceStr, // 必填,生成签名的随机串
  87. signature: single.signature, // 必填,签名
  88. jsApiList: ["updateAppMessageShareData","updateTimelineShareData",'showMenuItems'] // 必填,需要使用的JS接口列表
  89. });
  90. wx.ready(function() {
  91. });
  92. wx.error(function(res) {
  93. // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
  94. });
  95. }
  96. },
  97. },
  98. globalData: {
  99. token: "",
  100. userId:"",
  101. projectId:"",
  102. shareToken:"",
  103. pathName:"",
  104. color1: "#F07423",
  105. color2: "#FD8F3C",
  106. color3: "#FFC444",
  107. color4: "#F5F5F7",
  108. color5: "#F7A98E",
  109. color6: "#FFF4EB",
  110. color7:"#F8BA91",
  111. color8:"#FFF4EB",
  112. color9:"#8B654D",
  113. color10:"#FCF6F1",
  114. BASE_URL:"https://dm-api.elab-plus.cn",//默认环境
  115. }
  116. }
  117. </script>
  118. <style>
  119. </style>