微信小程序获取用户信息及手机号(后端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 设计模式学习 Singleton
Jul 27 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
Jan 17 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
May 27 Javascript
js数组操作方法总结(必看篇)
Nov 22 Javascript
Vue.js实现简单ToDoList 前期准备(一)
Dec 01 Javascript
canvas绘制多边形
Feb 24 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
Jul 31 Javascript
JavaScript实现的数字与字符串转换功能示例
Aug 23 Javascript
加载 vue 远程代码的组件实例详解
Nov 20 Javascript
利用ES6实现单例模式及其应用详解
Dec 09 Javascript
了解JavaScript函数中的默认参数
May 30 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
Jan 04 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 utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
微信支付开发维权通知实例
2016/07/12 PHP
PHP序列化操作方法分析
2016/09/28 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
JavaScript对象反射用法实例
2015/04/17 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
vue 中固定导航栏的实例代码
2019/11/01 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
Python打包可执行文件的方法详解
2016/09/19 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
python版学生管理系统
2018/01/10 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
python实现简单飞行棋
2020/02/06 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
python是怎么被发明的
2020/06/15 Python
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
搬家公司的创业计划书
2014/01/01 职场文书
工作迟到检讨书
2014/02/21 职场文书
初中班主任寄语
2014/04/04 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书