JAVA获取微信小程序分享群的openGId

一、通过code取得用户session_key

private final String AppId="wxcd1755167a4cb";
private final String AppSecret=",,,,,";

public static String JSONObject get(String code){
        HttpURLConnection http = null;

        InputStream is = null;

        String session_key = "";

        try {

        //授权(必填)
        String grant_type = "authorization_code";
        //URL
        String requestUrl = "https://api.weixin.qq.com/sns/jscode2session?";
        //请求参数

      String params = "appid=" + AppId + "&secret=" + AppSecret + "&js_code=" + code + "&grant_type=" + grant_type;

            String url = requestUrl+params;

            URL urlGet = new URL(url);
            http = (HttpURLConnection) urlGet.openConnection();

            http.setRequestMethod("GET");
            http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
            System.setProperty("sun.net.client.defaultReadTimeout", "30000");
            http.connect();
            is =http.getInputStream();
            int size =is.available();
            byte[] jsonBytes =new byte[size];
            is.read(jsonBytes);
            String message=new String(jsonBytes,"UTF-8");

            JSONObject data = JSONObject.fromObject(message);

            session_key =String.valueOf(data.get("session_key"));

        } catch (Exception e) {
            return "";
        }finally {
            if(null != http) http.disconnect();
            try {
                if (null != is) is.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        return session_key;

    }

二、微信小程序页面

onLoad: function () {

    //设置分享获取shareTicket  
      wx.showShareMenu({
        withShareTicket: true,
      })
  }

三、调用登录接口获取用户登录的code,取得session_key,放入缓存

wx.login({
        success: function (res) {
          if (res.code) {
            //发起网络请求
            wx.request({
              url: 'https://ctm.taoxueqinzi.com/ctmweixin/smprogram/wx/login.htm',
              data: {
                code: res.code
              }, success: function (res) {
                console.log(res.data);
                var uid = res.data.uid;
                var session_key = res.data.session_key;
                wx.setStorageSync('uid', uid);
                wx.setStorageSync('session_key', session_key);
                //由于这里是网络请求,可能会在 Page.onLoad 之后才返回
                // 所以此处加入 callback 以防止这种情况
                if (this.employIdCallback) {
                  this.employIdCallback(res.data.uid);
                }
                wx.request({
                  url: '',
                  data: {
                    
                  }, success: function (res) {

                  }
                })
              }
            })
          } else {
            console.log('登录失败!' + res.errMsg)
          }
        }
      });
    }

四、根据session_key,encryptedData,iv获取转发群 openGid

public static JSONObject decrypt(String encryptedData,String sessionkey, String iv){
            // 被加密的数据
            byte[] dataByte = Base64.decodeFast(encryptedData);
            // 加密秘钥
            byte[] keyByte = Base64.decodeFast(sessionkey);
            // 偏移量
            byte[] ivByte = Base64.decodeFast(iv);
            try {
                // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
                int base = 16;
                if (keyByte.length % base != 0) {
                    int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                    byte[] temp = new byte[groups * base];
                    Arrays.fill(temp, (byte) 0);
                    System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                    keyByte = temp;
                }
                // 初始化
                Security.addProvider(new BouncyCastleProvider());
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
                SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
                AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
                parameters.init(new IvParameterSpec(ivByte));
                cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
                byte[] resultByte = cipher.doFinal(dataByte);
                if (null != resultByte && resultByte.length > 0) {
                    String result = new String(resultByte, "UTF-8");

                    return JSONObject.parseObject(result);

                    String openGid = jsObj.getString("openGId");//直接从json中取得opengid

                }
            }catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }


五、在页面转发函数onShareAppMessage 】中使用【获取转发详细信息】API获取加密数据encryptedData和加密算法iv

/**
   * 用户点击右上角分享
   */
  onShareAppMessage: function (res) {
    if (res.from === 'button') {
      // 来自页面内转发按钮
      console.log(res.target)
    }
    return {
      title: '朝天门一家人',
      path: '/pages/index/index',
      success: function (res) {
          //转发成功
        //getSystemInfo是为了获取当前设备信息,判断是android还是ios,如果是android  
        //还需要调用wx.getShareInfo(),只有当成功回调才是转发群,ios就只需判断shareTickets  
        //获取用户设备信息  
        wx.getSystemInfo({
          success: function (d) {
            console.log(d);
            var session_key = wx.getStorageSync('session_key');
            //判断用户手机是IOS还是Android  
            if (d.platform == 'android') {
              wx.getShareInfo({//获取群详细信息  
                shareTicket: res.shareTickets[0],
                success: function (res) {
                  var encryptedData = res.encryptedData;
                  var iv = res.iv;
                  console.log(encryptedData);
                  console.log(iv);
                  console.log(session_key);
                  //发起网络请求
                  wx.request({
                    url: 'https://ctm.taoxueqinzi.com/ctmweixin/smprogram/wx/luckDraw.htm',
                    data: {
                      uid: uid,
                      session_key: session_key,
                      encryptedData: encryptedData,
                      iv: iv
                    }, success: function (res) {
                      var msg = res.data.msg;
                      wx.showModal({
                        title: '分享成功',
                        content: msg,
                        showCancel: false,
                        success: function (res) {
                          wx.navigateTo({
                            url: '../index/index'
                          })
                        }
                      })
                    }
                  })  
                },
                fail: function (res) {//这个方法就是分享到的是好友,给一个提示  
                  wx.showModal({
                    title: '提示',
                    content: '分享好友无效,请分享群',
                    success: function (res) {
                      if (res.confirm) {
                        console.log('用户点击确定')
                      } else if (res.cancel) {
                        console.log('用户点击取消')
                      }
                    }
                  })
                }
              })
            }
            if (d.platform == 'ios') {//如果用户的设备是IOS  
              if (res.shareTickets != undefined) {
                console.log("分享的是群");
                wx.getShareInfo({
                  shareTicket: res.shareTickets,
                  success: function (res) {
                    var encryptedData = res.encryptedData;
                    var iv = res.iv;
                    //发起网络请求
                    wx.request({
                      url: 'https://ctm.taoxueqinzi.com/ctmweixin/smprogram/wx/luckDraw.htm',
                      data: {
                        uid: uid,
                        session_key: session_key,
                        encryptedData: encryptedData,
                        iv: iv
                      }, success: function (res) {
                        var msg = res.data.msg;
                        wx.showModal({
                          title: '分享成功',
                          content: msg,
                          showCancel: false,
                          success: function (res) {
                            wx.navigateTo({
                              url: '../index/index'
                            })
                          }
                        })
                      }
                    })   
                  }
                })
              } else {//分享到个人要做的事情,我给的是一个提示  
                console.log("分享的是个人");
                wx.showModal({
                  title: '提示',
                  content: '分享好友无效,请分享群',
                  success: function (res) {
                    if (res.confirm) {
                      console.log('用户点击确定')
                    } else if (res.cancel) {
                      console.log('用户点击取消')
                    }
                  }
                })
              }
            }
          }
      })
    },
      fail: function (res) {
        // 转发失败
      }
    }

  }


注:微信小程序所有的url请求必须是https的

你可能感兴趣的:(JAVA获取微信小程序分享群的openGId)