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;
}
總結
因為場景問題,可能大家的解決方案會不一樣,但是分享者的初衷就是為了問題提供多種解決方案,通過度娘總會看到讓你靈光一閃的文章。最後小程式的釋出用到資質也是坑,大家開發前最好做好調研,不然産品出來了,發現沒有資質就涼涼了,稽核估計被各種打回。。。
最後鎮文圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX61ERNJzYE1kMNpnTuVzVZFDaywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYvwFd4VGdvwlMvw1ayFWbyVGdhd3PyIzMyQDNxATMyATM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)