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

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);
            }
        }
    }
}

wxBizDataCrypt.php 文件下载地址:https://pan.baidu.com/s/1YwvXnrbQikRhmLPyV71WMw
提取码为yzhl

或者扫描下方二维码
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Emma'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值