微信小程序获取用户信息及手机号(后端TP5.0)


Posted in Javascript onSeptember 12, 2019

本文实例为大家分享了微信小程序获取用户信息及手机号的具体代码,供大家参考,具体内容如下

wxml页面

<view wx:if="{{config.tipsshow1}}" class='dialog-container'>
 <view class='dialog-mask'></view>
 <view class='dialog-info'>
 <view class='dialog-title'>login prompt</view>
 <view class='dialog-content'>To provide better service, click "allow" in the prompt box later!</view>
 <view class='dialog-footer'>
  <button class='dialog-btn' open-type="getUserInfo" bindgetuserinfo="getUserInfo">I see.</button>
 </view>
 </view>
</view>

<view wx:if="{{config.tipsshow2}}" class='dialog-container'>
 <view class='dialog-mask'></view>
 <view class='dialog-info'>
 <view class='dialog-title'>login prompt</view>
 <view class='dialog-content'>To provide better service, click "allow" in the prompt box later!</view>
 <view class='dialog-footer'>
  <button class='dialog-btn' open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">To authorize.</button>
 </view>
 </view>
</view>

wxss页面

.dialog-mask{
 position: fixed;
 z-index: 1000;
 top: 0;
 right: 0;
 left: 0;
 bottom: 0;
 background: rgba(0, 0, 0, 0.3);
}
.dialog-info{
 position: fixed;
 z-index: 5000;
 width: 80%;
 max-width: 600rpx;
 top: 50%;
 left: 50%;
 -webkit-transform: translate(-50%, -50%);
 transform: translate(-50%, -50%);
 background-color: #FFFFFF;
 text-align: center;
 border-radius: 3px;
 overflow: hidden;
}
.dialog-title{
 font-size: 36rpx;
 padding: 30rpx 30rpx 10rpx;
}
.dialog-content{
 padding: 10rpx 30rpx 20rpx;
 min-height: 80rpx;
 font-size: 32rpx;
 line-height: 1.3;
 word-wrap: break-word;
 word-break: break-all;
 color: #999999;
}
.dialog-footer{
 display: flex;
 align-items: center;
 position: relative;
 line-height: 90rpx;
 font-size: 34rpx;
}
.dialog-btn{
 display: block;
 -webkit-flex: 1;
 flex: 1;
 position: relative;
 color: #3CC51F;
}

js页面

data: {
 userName: '',
 pwd: '',
 getUserInfoFail: '',
 userInfo: [],
 hasUserInfo: '',
 phone: '',
 config: {
  tipsshow1: true,
  tipsshow2: false
 }
 },


 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function(options) {
 var that = this;
 //用户是否授权过手机号
 wx.getStorage({
  key: 'phone',
  success: function (res) {
  that.setData({
   config: {
   tipsshow1: false,
   tipsshow2: false
   },
  })
  }
 })

 //是否授权过用户信息
 wx.getSetting({
  success: function(res) {
  if (res.authSetting['scope.userInfo']) {
   // 已经授权,可以直接调用 getUserInfo 获取头像昵称
   wx.getUserInfo({
   success: function(res) {
    that.setData({
    userInfo: res.userInfo,
    config: {
     tipsshow1: false,
    },
    })
   }
   })
  }
  }
 })

 },

 getPhoneNumber: function(e) {
 if (e.detail.errMsg == "getPhoneNumber:fail user deny") return;
 //用户允许授权
 wx.showLoading()
 var self = this
 //1. 调用登录接口获取临时登录code
 wx.login({
  success: res => {
  console.log(res, 555)
  if (res.code) {
   //2. 访问登录凭证校验接口获取session_key、openid
   wx.request({
   url: "xxxxxxx/index/author/login",
   data: {
    'js_code': res.code,
   },
   method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
   header: {
    'content-type': 'application/json'
   }, // 设置请求的 header
   success: function(data) {
    console.log(data, data)
    if (data.statusCode == 200) {
    //3. 解密
    wx.request({
     url: 'xxxxxx/index/author/number',
     data: {
     'appid': data.data.appid,
     'sessionKey': data.data.session_key,
     'encryptedData': e.detail.encryptedData,
     'iv': e.detail.iv,
     },
     method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
     header: {
     'content-type': 'application/json'
     }, // 设置请求的 header
     success: function(data2) {
     wx.hideLoading()
     console.log(data2.data.phoneNumber)
     if (data2.statusCode == 200 && data2.data.phoneNumber) {
      self.setData({
      phone: data2.data.phoneNumber,
      config: {
       tipsshow1: false,
       tipsshow2: false,
      },
      })
      wx.setStorageSync('phone', data2.data.phoneNumber);
      if (self.data.userInfo != '') {
      wx.request({
       url: 'xxxx/index/author/regist',
       data: {
       username: self.data.userInfo.nickName,
       sex: self.data.userInfo.gender,
       phone: self.data.phone,
       pwd: 123456,
       avatarimg: self.data.userInfo.avatarUrl
       },
       success: function(data) {
        console.log(data.data,56565)
        if (data.data != null) {
        wx.showToast({
         title: '登录中...',
         icon: 'loading',
         duration: 2000
        })
        wx.navigateTo({
         url: '../managementList/managementList'//管理页面
        })
        }
       }
      });
      }
      console.log(self.data, 526336)
     }
     },
     fail: function(err) {
     console.log(err);
     }
    })
    }
   },
   fail: function(err) {
    console.log(err);
   }
   })
  }
  }
 })
 },

 getUserInfo: function(e) {
 var that = this;
 console.log(e.detail.userInfo, "getuserinfo")
 if (e.detail.userInfo) {
  that.setData({
  userInfo: e.detail.userInfo,
  config: {
   tipsshow1: false,
   tipsshow2: true,
  },
  })
  console.log(that.data.userInfo);
 } else {
  console.log("获取信息失败")
 }
 },

PHP后端

<?php

namespace app\index\controller;

use think\Controller;
use app\admin\model\UserRecharge;
use think\Db;


class Author extends Controller
{

 /**
  * 发送HTTP请求方法
  * @param string $url 请求URL
  * @param array $params 请求参数
  * @param string $method 请求方法GET/POST
  * @return array $data 响应数据
  */
 function httpCurl($url, $params, $method = 'POST', $header = array(), $multi = false){
  date_default_timezone_set('PRC');
  $opts = array(
   CURLOPT_TIMEOUT  => 30,
   CURLOPT_RETURNTRANSFER => 1,
   CURLOPT_SSL_VERIFYPEER => false,
   CURLOPT_SSL_VERIFYHOST => false,
   CURLOPT_HTTPHEADER  => $header,
   CURLOPT_COOKIESESSION => true,
   CURLOPT_FOLLOWLOCATION => 1,
   CURLOPT_COOKIE   =>session_name().'='.session_id(),
  );
  /* 根据请求类型设置特定参数 */
  switch(strtoupper($method)){
   case 'GET':
    // $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
    // 链接后拼接参数 & 非?
    $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
    break;
   case 'POST':
    //判断是否传输文件
    $params = $multi ? $params : http_build_query($params);
    $opts[CURLOPT_URL] = $url;
    $opts[CURLOPT_POST] = 1;
    $opts[CURLOPT_POSTFIELDS] = $params;
    break;
   default:
    throw new Exception('不支持的请求方式!');
  }
  /* 初始化并执行curl请求 */
  $ch = curl_init();
  curl_setopt_array($ch, $opts);
  $data = curl_exec($ch);
  $error = curl_error($ch);
  curl_close($ch);
  if($error) throw new Exception('请求发生错误:' . $error);
  return $data;
 }
 /**
  * 微信信息解密
  * @param string $appid 小程序id
  * @param string $sessionKey 小程序密钥
  * @param string $encryptedData 在小程序中获取的encryptedData
  * @param string $iv 在小程序中获取的iv
  * @return array 解密后的数组
  */
 function decryptData( $appid , $sessionKey, $encryptedData, $iv ){
  $OK = 0;
  $IllegalAesKey = -41001;
  $IllegalIv = -41002;
  $IllegalBuffer = -41003;
  $DecodeBase64Error = -41004;
  if (strlen($sessionKey) != 24) {
   return $IllegalAesKey;
  }
  $aesKey=base64_decode($sessionKey);

  if (strlen($iv) != 24) {
   return $IllegalIv;
  }
  $aesIV=base64_decode($iv);

  $aesCipher=base64_decode($encryptedData);

  $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
  $dataObj=json_decode( $result );
  if( $dataObj == NULL )
  {
   return $IllegalBuffer;
  }
  if( $dataObj->watermark->appid != $appid )
  {
   return $DecodeBase64Error;
  }
  $data = json_decode($result,true);
  return $result;
 }

 /**
  * 请求过程中因为编码原因+号变成了空格
  * 需要用下面的方法转换回来
  */
 function define_str_replace($data)
 {
  return str_replace(' ','+',$data);
 }


 //获取手机号
 public function number($appid , $sessionKey, $encryptedData, $iv)
 {
  include_once (ROOT_PATH."./public/author/wxBizDataCrypt.php"); //引入 wxBizDataCrypt.php 文件
  $appid = $appid;
  $sessionKey = $sessionKey;
  $encryptedData= $encryptedData;
  $iv = $iv;
  $data = '';

  $pc = new \WXBizDataCrypt($appid, $sessionKey); //注意使用\进行转义
  $errCode = $pc->decryptData($encryptedData, $iv, $data );
  if ($errCode == 0) {
   print($data . "\n");
  } else {
   print($errCode . "\n");
  }
 }

 //微信登录
 public function login(){
  $get = input('get.');
  $param['appid'] = 'xxxxxxxxxx'; //小程序id
  $param['secret'] = 'xxxxxxxxxx'; //小程序密钥
  $param['js_code'] = $this->define_str_replace($get['js_code']);
  $param['grant_type'] = 'authorization_code';
  $http_key = $this->httpCurl('https://api.weixin.qq.com/sns/jscode2session', $param, 'GET');
  $session_key = json_decode($http_key,true);//获取openid和session_key
  //print_r(http_build_query($param));
  if (!empty($session_key['session_key'])) {
   $data['appid'] = $param['appid'];
   $data['session_key'] = $session_key['session_key'];
   return json($data);
  }else{
   echo '获取session_key失败!';
  }
 }

 //用户注册
 public function regist($username = "",$sex = "", $phone = "",$password = "",$avatarimg = "")
 {
  if ($phone){
   //判断该用户是否已经注册
   $userdata = Db::name('user')->where('phone',$phone)->find();
   if ($userdata){
    return json_encode(2);
   }

   //整合数组
   $salt = '1122';
   $password = Md5(Md5($password) . $salt);
   $data = [
    'name' => $username,
    'sex' => $sex,
    'phone' => $phone,
    'password' => $password,
    'avatarimg' => $avatarimg,
    'logtime' => date("Y-m-d H:i:s"),
    'addTime' => date("Y-m-d H:i:s")
   ];
   //注册新用户
   $userid = db('user')->insertGetId($data);
   if ($userid){
    return json_decode(1);
   }else{
    return json_encode(0);
   }
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript倒计时功能实现代码
Jun 07 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
Aug 10 Javascript
Javascript打印局部页面实例
Jun 21 Javascript
基于jQuery实现选项卡效果
Jan 04 Javascript
JavaScript事件方法(实例讲解)
Jun 27 Javascript
JS实现倒序输出的几种常用方法示例
Apr 13 Javascript
深入理解javascript prototype的相关知识
Sep 19 Javascript
js实现图片实时时钟
Jan 15 Javascript
django简单的前后端分离的数据传输实例 axios
May 18 Javascript
vue 递归组件的简单使用示例
Jan 14 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
JS计算斐波拉切代码实例
Sep 12 #Javascript
VUE项目初建和常见问题总结
Sep 12 #Javascript
TypeScript中使用getElementXXX()的示例代码
Sep 12 #Javascript
深入浅析vue中cross-env的使用
Sep 12 #Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 #Javascript
layer弹出层显示在top顶层的方法
Sep 11 #Javascript
layer.js之回调销毁对话框的例子
Sep 11 #Javascript
You might like
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
javascript web页面刷新的方法收集
2009/07/02 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python多进程控制学习小结
2018/10/31 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
UNIX文件系统分类
2014/11/11 面试题
英语演讲稿范文
2014/01/03 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL