微信小程序获取用户信息及手机号(后端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 = '1234;

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

            }

        }

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342