【uniapp】小程序中进行公众号授权

场景
使用uni app开发微信小程序,但是需要与之前的公众号进行用户关联。考虑到用户的唯一性,后端采用“UnionID”作为唯一标识。

【UnionID获取途径】

  1. 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
  2. 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。
  3. 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。

步骤
1、由于业务需求,进入小程序的场景有两种:直接进入小程序和扫描普通二维码进入小程序,所以我这里首先需要先做一些前置处理。
2、小程序中进行公众号跳转授权

  1. 小程序中使用webView嵌套一个授权公众号的H5页面;

    <web-view :src="webSrc"></web-view>
    
    onLoad() {
       this.webSrc = `${_config.AUTH_URL}?appid=${_config.APP_ID}`;
     }
    
    //授权的h5页面
    
    <!DOCTYPE html>
     <html lang="en">
     <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title></title>
       <style>
       </style>
     </head>
     <body></body>
     <script type="text/javascript">
       //如果只需要兼容微信小程序,只引入微信的js-sdk就可以了
       var userAgent = navigator.userAgent;
       if (userAgent.indexOf('AlipayClient') > -1) {
         // 支付宝小程序的 JS-SDK 防止 404 需要动态加载,如果不需要兼容支付宝小程序,则无需引用此 JS 文件。
         document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');
       } else if (/QQ/i.test(userAgent) && /miniProgram/i.test(userAgent)) {
         // QQ 小程序
         document.write('<script type="text/javascript" src="https://qqq.gtimg.cn/miniprogram/webview_jssdk/qqjssdk-1.0.0.js"><\/script>');
       } else if (/miniProgram/i.test(userAgent)) {
         // 微信小程序 JS-SDK 如果不需要兼容微信小程序,则无需引用此 JS 文件。
         document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>');
       } else if (/toutiaomicroapp/i.test(userAgent)) {
         // 头条小程序 JS-SDK 如果不需要兼容头条小程序,则无需引用此 JS 文件。
         document.write('<script type="text/javascript" src="https://s3.pstatp.com/toutiao/tmajssdk/jssdk-1.0.1.js"><\/script>');
       } else if (/swan/i.test(userAgent)) {
         // 百度小程序 JS-SDK 如果不需要兼容百度小程序,则无需引用此 JS 文件。
         document.write('<script type="text/javascript" src="https://b.bdstatic.com/searchbox/icms/searchbox/js/swan-2.0.18.js"><\/script>');
       }
       if (!/toutiaomicroapp/i.test(userAgent)) {
         document.querySelector('.post-message-section').style.visibility = 'visible';
       }
     </script>
     <!-- uni 的 SDK -->
     <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
     <script>
       //获取url参数
      function parseUrl(name) {
        let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        let r = window.location.search.substr(1).match(reg);
        if (r != null) {
          return decodeURI(r[2]);
        } else {
          return null;
        }
      }
     
     //授权成功后会走回调,带回个code,通过code是否授权,成功后跳回小程序
       if(parseUrl('code')){
        document.addEventListener('UniAppJSBridgeReady', function() {
          uni.redirectTo({
            url: `/pages/custom/public_welfare/lottery?code=${parseUrl("code")}`
          });
        })} else {
          let url = window.location.href;
          let appid = parseUrl('appid');
          window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${encodeURIComponent(url)}&user_info=0&response_type=code&scope=snsapi_base&state=1#wechat_redirect`;
        }
     </script>
     </html>
    
  2. 授权成功,回到小程序对应页面,option参数里面接收公众号授权后的code码进行后续操作;

  3. wx.login + code2Session 获取到该用户 UnionID


版权声明:本文为qq_41595903原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。