微信小程序获取用户信息及手机号(后端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 相关文章推荐
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
Sep 02 Javascript
js验证真实姓名与身份证号是否匹配
Oct 13 Javascript
浅谈javascript 函数表达式和函数声明的区别
Jan 05 Javascript
浅谈javascript的call()、apply()、bind()的用法
Feb 21 Javascript
js闭包引起的事件注册问题介绍
Mar 29 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
Jul 01 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 Javascript
详解 vue better-scroll滚动插件排坑
Feb 08 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
Mar 13 Javascript
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
劣质的PHP代码简化
2010/02/08 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
成教自我鉴定
2013/10/27 职场文书
环境科学专业个人求职信
2013/12/15 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
教研处工作方案
2014/05/26 职场文书
日语专业求职信
2014/07/04 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
导游词之山东八大关
2019/12/18 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS