1.app.js获取用户oppenid等信息(不包括用户头像名称)
//app.js
// 引入通用请求封装
const util = require('./utils/util.js');
App({
onLaunch: function () {
// 展示本地存储能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
if (res.code) {
var that = this;
// 发起网络请求
var url = that.globalData.domain + 'User/getopenid';
var params = { js_code: res.code};
util.wxRequest(url, params, data => {
// 验证成功
if (data) {
//console.log(data)
that.globalData.openid = data;
that.getUser();
} else {
// 错误信息显示
console.log('获取openid失败');
}
}, data => { }, data => { });
// wx.request({
// url: 'https://api.weixin.qq.com/sns/jscode2session',
// data: {
// appid:'wxd25fb3e18f0617f6',
// secret:'17328ff2fb4f97957369486e4fb9a5ef',
// js_code:res.code,
// grant_type:'authorization_code'
// },
// success:function(response){
// //console.log(response.data.openid);
// if (response.data.openid != null && response.data.openid != undefined){
// that.globalData.openid = response.data.openid;
// that.getUser();
// }
// },
// fail:function(error){
// console.log('获取openid失败');
// }
// })
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
// 可以将 res 发送给后台解码出 unionId
this.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
//新的获取用户信息
getUser:function(){
var that = this;
wx.login({
success: res => {
if (res.code) {
var url = that.globalData.domain + 'User/get_user';
var params = { code: res.code, openid: that.globalData.openid};
util.wxRequest(url, params, data => {
// 验证成功
if(data.status == 200){
that.globalData.userInfo=data.data;
//只有用户头像和名称存在时,才是登录成功
if(data.data.username){
that.globalData.login = true;
}
} else if (data.status == 400){
// 用户不存在,注册
that.register();
}else{
// 错误信息显示
that.globalData.login=false;
wx.showToast({
title:data.msg,
icon: none,
duration: 1500
})
}
}, data => { }, data => { });
}else{
console.log('error');
}
}
})
},
//注册
register:function(){
var url = this.globalData.domain + 'User/register';
var openid = this.globalData.openid;
var params = {openid:openid};
util.wxRequest(url, params, data => {
if(data.status == 200){
this.globalData.userInfo = data.data
}
}, data => { }, data => { });
},
// 全局变量
globalData: {
domain:'https://shanghaigubao.cn/index.php/api/',
userInfo: null,
openid:'',
login:false
}
})
2.后台处理
<?php
namespace app\api\controller;
use app\api\controller\Common;
use app\api\model\Fabu as UserModel;
class User extends Common
{
//获取openid
public function getopenid()
{
$appid = config('appid');
$secret = config('secret');
$js_code = input('js_code');
//通过code换取网页授权access_token
$weixin = file_get_contents("https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$js_code&grant_type=authorization_code");
$jsondecode = json_decode($weixin); //对JSON格式的字符串进行编码
$array = get_object_vars($jsondecode);//转换成数组
return $array['openid'];//输出openid
}
//获取用户信息
public function get_user()
{
if($this->check_openid()){
$openid = input('openid');
$data['username'] = input('username');
$data['userpic'] = input('userpic');
$user = db('user')->where('openid',$openid)->find();
if($user){
//判断用户的头像和名称为空的话,更新信息,并更新返回的$user
if($user['username']=='' && $user['userpic']==''){
db('user')->where('openid',$openid)->update($data);
$user['username'] = $data['username'];
$user['userpic'] = $data['userpic'];
}
//重置token
$user['token'] = $this->restToken($openid);
if($user['token']){
return json(['status'=>200,'msg'=>'验证成功','data'=>$user]);
}else{
return json(['status'=>401,'msg'=>'token重置失败']);
}
}else{
return json(['status'=>400,'msg'=>'用户不存在']);
}
}else{
return json(['status'=>401,'msg'=>'登录失败,请重新授权登录']);
}
}
//注册
public function register()
{
$data['openid'] = input('openid');
$data['token'] = getRandChar(32);
$data['token_time'] = time();
$data['reg_time'] = time();
$user = db('user')->insert($data);
if($user){
return json(['status'=>200,'msg'=>'注册成功','data'=>$user]);
}else{
return json(['status'=>400,'msg'=>'注册失败',]);
}
}
}
3.common.php公共文件公共方法
<?php
namespace app\api\controller;
use think\Controller;
class Common extends Controller
{
//检验openid,服务端获取的openid与传过来的openid进行对比
public function check_openid()
{
$appid = config('appid');
$secret = config('secret');
$grant_type = 'authorization_code';
$url = 'https://api.weixin.qq.com/sns/jscode2session';
$openid = input('openid');
$js_code = input('code');
$data = [
'appid'=>$appid,
'secret'=>$secret,
'js_code'=>$js_code,
'grant_type'=>$grant_type
];
//获取接收结果
$res =httpRequest($url,'POST',$data);
$obj = json_decode($res);
//return $obj->openid;
if($obj->openid == $openid){
return true;
}else{
return false;
}
}
//重置token,还有token_time
public function restToken($openid)
{
$data['token'] = getRandChar(32);//getRandChar(32):获取32位的字符串
$data['token_time'] = time();
$res = db('user')->where('openid',$openid)->update($data);
if($res){
return $data['token'];
}else{
return false;
}
}
//验证token有效性
public function checkToken()
{
$openid = input('openId');
$token = input('token');
$user = db('user')->where(array('openid'=>$openid,'token'=>$token))->find();
if($user){
//如果登录超过1个月,就表示过期了
if((time()-$user['token_time'])>2592000){
return false;
}else{
return true;
}
}else{
return false;
}
}
//获取用户id
public function getUserId($openId){
$userId = db('user')->where('openid',$openId)->value('id');
return $userId;
}
//获取用户头像,名字
public function getPicName($openId)
{
$userPicName = db('user')->where('openid',$openId)->field('username,userpic')->find();
return $userPicName;
}
//获取分类id
public function getCateId($catename)
{
$cateId = db('cate')->where('catename',$catename)->value('id');
return $cateId;
}
}
4.小程序主页点击授权,获取用户头像名称
// pages/me/me.js
// 引入通用请求封装
const util = require('../../utils/util.js');
// 调用app.js里面常量
const app = getApp();
Page({
data: {
login:false,
username:'',
userpic:''
},
onLoad: function () {
},
// getInfo:function(){
// var username = app.globalData.userInfo.username;
// var userpic = app.globalData.userInfo.userpic;
// if (username !== null && userpic !== null) {
// this.setData({ username: username, userpic: userpic,login:true })
// }
// },
//授权登录,只是更新用户的头像名称而已
login: function (e) {
//console.log(e)
var that = this;
wx.login({
success: res => {
if (res.code) {
var url = app.globalData.domain + 'User/get_user';
var params = {
code: res.code,
openid: app.globalData.openid,
username:e.detail.userInfo.nickName,
userpic: e.detail.userInfo.avatarUrl
};
util.wxRequest(url, params, data => {
// 验证成功
if (data.status == 200) {
//登录成功,更改全局变量userinfo和login
app.globalData.userInfo = data.data;
app.globalData.login = true;
//登录成功,更改me.js文件的data的login为true
that.setData({
login:true,
username:data.data.username,
userpic:data.data.userpic
});
} else if (data.status == 400) {
// 用户不存在,注册
that.register();
} else {
// 错误信息显示
app.globalData.login = false;
wx.showToast({
title: data.msg,
icon: none,
duration: 1500
})
}
}, data => { }, data => { });
} else {
console.log('error');
}
}
})
}
})