天天看點

PHP+微信小程式分享擷取群ID前言需求說明代碼總結

PHP+微信小程式分享擷取群ID

  • 前言
  • 需求說明
  • 代碼
  • 總結

前言

時間2018年10月,吐槽下微信小程式,因為一些原因說不能在分享到群的時候擷取群id,但是我在開發的時候明顯說可以擷取的(體驗版),但是正式版一跑問題就來了,擷取群id時得時不得,不得:不進分享成功後的回調方法0.0。無愛來,是以隻能更換下思路,從使用者點選群裡面的分享位址進來後在進行擷取來,浪費俺寶貴的時間。

需求說明

通過小程式釋出文章,要求可以指定使用者檢視,然後通過分享到群進行擴散。那問題來了,要想指定使用者檢視你得有使用者分組(組對應群),是以就有來目前的問題和解決方案。

代碼

小程式app.js

因為onLaunch事件的生命周期問題,是以放onShow中,我這裡是把iv和encryptedData緩存起來,因為要跟文章使用者關聯的話在這裡處理會有重複

onShow: function (ops) {
    // console.log(ops);
    if (ops.scene == 1044) {
      wx.getShareInfo({
        shareTicket: ops.shareTicket,
        success: function (res) {
          var params = {
            iv: res.iv,
            encryptedData: res.encryptedData
          };
          wx.setStorageSync('shareTicket', params);
        }
      })
    }
  },
           

小程式index.js

index屬于入口,我把邏輯放這裡來處理,分享得位址進來的話要把對應的群資訊拿到,并關聯到文章,使用者,然後在判斷通路的使用者是不是有權通路文章内容,符合條件就會在跳轉進文章的詳情頁面,過程中雖然會有點體驗上的問題,但是總體來說影響不大。。。

/**
   * 生命周期函數--監聽頁面加載
   */
  onLoad: function(options) {
    var that = this;
    var user_id = '';
    //使用者緩存資訊,如果沒有就重新授權,記得把對應參數帶過去
    user_id = wx.getStorageSync('userinfo');
    if (!user_id) {
      wx.removeStorageSync('userinfo');
      that.setData({
        redview: false
      });
      wx.reLaunch({
        url: '../auth/auth?soft_wen_id=' + options.soft_wen_id + '&matching=' + options.matching + '&type=' + options.type,
      });
      return false;
    }
    var shareTicket = wx.getStorageSync('shareTicket');
    //判斷是否上分享進來,判斷是否有權限(api)順便綁定使用者的群資訊,如果沒有權限就跳轉到首頁
    if (typeof(options.matching) != "undefined") {
      var where = {
        matching: options.matching,//文章每次分享都會生成的随機碼,跟群進行比對
        soft_wen_id: options.soft_wen_id,//文章id
        member_id: user_id.member_id,//使用者id
        session_key: user_id.session_key,//使用者授權後拿到的key
        iv: shareTicket.iv,
        encryptedData: shareTicket.encryptedData
      };
      //接口請求
      http.http_post('memberbinding', where, false, function(binddata) {
        if (binddata.data.status == 200) {
          wx.removeStorageSync('shareTicket');
           //業務邏輯
      });
    } else {
     //業務邏輯
    }
  },
           

PHP代碼

接口這裡就是走一些業務邏輯了

/**
     * 使用者通過文章分享位址進入小程式,關聯綁定群id
     * @param $post
     * @return array
     */
    public static function MemberBinding($post)
    {
        //不是分享位址進來
        if ($post['matching'] != '9999') {
            //關聯群跟用,群跟文章
            if ($post['encryptedData'] != 'undefined') {
                $result = WxVisitLogic::getGroup($post);
                if (!$result) {
                    return ['features' => 2, 'msg' => '軟文群資訊異常'];
                }
            }
        }
        //判斷目前文章是否需要權限
        //判斷目前使用者是否少文章制定閱讀的人
        $SoftMember = SoftMember::find()->where(['soft_wen_id' => $post['soft_wen_id'], 'is_appoint' => 1])->asArray()->all();
        $myMember = SoftMember::find()->where(['soft_wen_id' => $post['soft_wen_id'], 'member_id' => $post['member_id'], 'is_release_id' => 1])->asArray()->one();
        if ($myMember) {
            return ['features' => 1, 'msg' => '使用者釋出者,有權限通路'];
        }
        if (count($SoftMember) > 0) {
            $is = false;
            foreach ($SoftMember as $item) {
                if ($item['member_id'] == $post['member_id']) {
                    $is = false;
                    break;
                } else {
                    $is = true;
                }
            }
            if ($is) {
                return ['features' => 2, 'msg' => '目前使用者不是軟文制定閱讀的,無權限通路'];
            } else {
                return ['features' => 1, 'msg' => '使用者屬于制定閱讀的人,有權限通路'];
            }
        } else {
            //雖然無權限,還是要幫增加一條關聯資訊
            $SoftMembers = SoftMember::find()->where(['soft_wen_id' => $post['soft_wen_id'], 'member_id' => $post['member_id']])->asArray()->one();
            if (!$SoftMembers) {
                //新增一條
                $SoftMember = new SoftMember();
                $SoftMember->member_id = $post['member_id'];
                $SoftMember->soft_wen_id = $post['soft_wen_id'];
                $SoftMember->is_release_id = 0;
                $SoftMember->created_at = time();
                $SoftMember->updated_at = time();
                $SoftMember->save(false);
            }
            return ['features' => 1, 'msg' => '軟文無權限限制,随意檢視'];
        }
    }
           

WXBizDataCrypt是解密擷取群id的類,基礎上通用,這裡就不放出來

/**
    * 分享到群後擷取群id
    */
    public static function getGroup($post)
    {
        $weiXinXcx = Yii::$app->params['WECHAT']['weixinxcx'];
        $pc = new WXBizDataCrypt($weiXinXcx['appid'], $post['session_key']);
        $errCode = $pc->decryptData($post['encryptedData'], $post['iv'], $result, $weiXinXcx['appid'], $post['session_key']);

        //解密是否出錯
        if ($errCode != 0) {
            return false;
        }
        //轉換數組
        $result = json_decode($result, JSON_UNESCAPED_UNICODE);
        $Group = Group::find()->where(['groupwx_id' => $result['openGId']])->one();
        //不存在就新增
        if (!$Group) {
            $Group = new Group();
            $Group->groupwx_id = $result['openGId'];
            $Group->save();
        }

        //如果分享到的群關聯目前通路使用者(包括釋出者)
        $MemberGroup = MemberGroup::find()->where(['member_id' => $post['member_id'], 'group_id' => $Group->group_id])->one();
        $SSoftWen =  SSoftWen::find()->where(['soft_wen_id' => $post['soft_wen_id']])->asArray()->one();
        $MemberGroup1 = MemberGroup::find()->where(['member_id' => $SSoftWen['cuser_id'], 'group_id' => $Group->group_id])->one();
        if (!$MemberGroup) {
            //新增關系
            $MemberGroup = new MemberGroup();
            $MemberGroup->member_id = $post['member_id'];
            $MemberGroup->group_id = $Group->group_id;
            $MemberGroup->save(false);
        }
        if(!$MemberGroup1){
            //新增關系
            $MemberGroup1 = new MemberGroup();
            $MemberGroup1->member_id = $SSoftWen['cuser_id'];
            $MemberGroup1->group_id = $Group->group_id;
            $MemberGroup1->save(false);
        }
        //修改進軟文表中
        if(!$SSoftWen['scenario']){
           SSoftWen::updateAll(['scenario' => $result['openGId']] , ['soft_wen_id' => $post['soft_wen_id']]);
        }
        $group = SSoftGroup::find()->where(['matching' => $post['matching'],'soft_wen_id'=>$post['soft_wen_id'],'group_id'=>$Group->group_id])->asArray()->one();
        if(!$group){
            $SSoftGroup = new SSoftGroup();
            $SSoftGroup->group_id = $Group->group_id;
            $SSoftGroup->soft_wen_id = $post['soft_wen_id'];
            $SSoftGroup->matching = $post['matching'];
            $SSoftGroup->save();
        }
        return true;
    }
           

總結

因為場景問題,可能大家的解決方案會不一樣,但是分享者的初衷就是為了問題提供多種解決方案,通過度娘總會看到讓你靈光一閃的文章。最後小程式的釋出用到資質也是坑,大家開發前最好做好調研,不然産品出來了,發現沒有資質就涼涼了,稽核估計被各種打回。。。

最後鎮文圖

PHP+微信小程式分享擷取群ID前言需求說明代碼總結