一/前端(我使用的uniapp)
<template> <view> <button open-type="getUserInfo" @getUserInfo="onGotUserInfo" lang="zh_CN" @tap="onGotUserInfo">獲取個人信息</button> <button @tap="goSign">長征活動報名</button> </view> </template>
<script> export default { data() { return{ } }, onLoad() { // 執行查看授權選項 this.getSettingMes(); }, methods:{ getSettingMes(){ let _this = this; uni.getSetting({ success(res) { console.log(res) if (res.authSetting['scope.userInfo']) { uni.getUserInfo({ success(infoRes) { console.log(infoRes) uni.setStorageSync('userinfo', infoRes.userInfo); }, fail() { console.log("獲取用戶信息失敗") } }) }else if(!res.authSetting['scope.userInfo']){ console.log("需要點擊按鈕手動授權") } }, fail() { console.log("獲取已授權選項失敗") } }) }, //手動授權 onGotUserInfo(e) { uni.login({ success: (res) => { var code = res.code uni.getUserInfo({ provider:'weixin', success:function(infoRes){ //個人信息存入緩存 uni.setStorageSync('userInfo', infoRes.userInfo); var rawData = infoRes.rawData; var signature = infoRes.signature; var encryptedData = infoRes.encryptedData; var iv = infoRes.iv; uni.request({ url:'請求url', data:{ 'code':code, 'rawData':rawData, 'signature':signature, 'iv':iv, 'encryptedData':encryptedData }, method:'POST', success:function(res){ uni.setStorageSync('uids', res.data.data.userId); uni.setStorageSync('token', res.data.data.token); if(res.data.ret == 200){ uni.showToast({ title:'登錄成功', icon:'none' }) } } }) } }) } }) } } } </script>
二/后端處理 PHP
public function miniProgramLoginApi() { $code = $this->post('code'); if (!$code) { return [501, 'code錯誤']; } $conf = $this->getGlobalConfig('mini_program.worker'); //配置文件 $data = [ 'appid' => $conf['appid'], 'secret' => $conf['appsecret'], 'js_code' => $code, 'grant_type' => 'authorization_code', ]; $response = $this->httpClient->get('https://api.weixin.qq.com/sns/jscode2session', ['query' =>$data]); $result=json_decode($response->getBody()->getContents(), true); if (!empty($result['openid'])) { $openid=$result['openid']; $encryptedData = $this->post('encryptedData'); $iv = $this->post('iv'); $sessionKey =$result['session_key']; if (!$encryptedData || !$iv) { return [501, '客戶端傳遞參數錯誤']; } //下邊要引入官方包 $datacrypt=new WXBizDataCrypt($conf['appid'],$sessionKey); $errCode = $datacrypt->decryptData($encryptedData,$iv,$data); $data = json_decode($data,true); if($errCode == 0){ $userInfo = [ 'openid' => $data['openId'], 'nickName' => $data['nickName'], 'avatarUrl' => $data['avatarUrl'], 'sex' => $data['gender'], 'country' => $data['language'], 'city' => $data['city'], 'create_time'=> time(), ]; $uid = $this->db->get('user','id',['openid' => $data['openId']]); if(empty($uid)){ $this->db->insert('user',$userInfo); $uid = $this->db->id(); }else{ $this->db->update('user',$userInfo,['openid' => $data['openId']]); } $loginToken = md5(date('YmdHis' . $uid)); //存入緩存 cacheRedis()->set($loginToken, $uid, 7200*12); return [200, ['token' => $loginToken, 'userId' => $uid]]; }else{ return [501, '微信解密錯誤']; } } }
三/ 第二步內官方包的下載路徑
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html