PHP解密微信小程序手机号简单DEMO

//第一步 调用一遍wx.login获取Code
var that = this;
wx.login({
    success: function (ret) {
        //获取微信登陆后的code
        that.data.code = ret.code;
        wx.request({
            url: app.config.apiUrl + "/api/wechatlogin?code=" + ret.code,
            success: function (result) {
                //获得服务端返回的session_key和openid
                that.data.openid = result.data.openid;
                that.data.session_key = result.data.session_key;
            }
        })
    }
})
<?php
//第二步 调用微信API获取Session_key和OPENID openid在这里没啥用。
//我这里是TP5框架
public function wechatLogin(){
    $appid = '';//小程序APPID
    $appkey = '';//小程序的APPKEY
    if(input("?code")){
        $code = input("code");
        $ret = curlGet("https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$appkey."&js_code=".$code."&grant_type=authorization_code");
        try{
            $ret = json_decode($ret);
            if(property_exists($ret,'session_key')){
                $session_key = $ret->session_key;
                $openid = $ret->openid;
                return json(["code"=>0,"session_key"=>$session_key,"openid"=>$openid]);
            }else{
                return json(["code"=>1,"msg"=>"获取session_key失败"]);
            }
        }catch(\Exception $e){
            return json(["code"=>1,"msg"=>"微信返回数据异常"]);
        }
    }else{
        return json(["code"=>1,"msg"=>"你应该传code给我。"]);
    }
}
//第三步 获取微信加密后的手机号数据
//这里是微信button触发的事件 组件获取手机号的按钮
var that = this;
var postData = res.detail;
postData.code = that.data.code;
postData.session_key = that.data.session_key;
postData.openid = that.data.openid;
console.log(postData);
if (res.detail.errMsg != "getPhoneNumber:ok") {
    wx.showModal({
        title: '登录失败',
        content: '请允许获取你的手机号,否则无法为你登录',
        showCancel: false
    });
} else {
    wx.showLoading({
        title: '微信登录中',
    });
    //先检查会话是否过期,如果过期,重走第一步
    wx.checkSession({
        success(ret) {
            //会话有效 开始请求PHP解密手机号数据
            wx.request({
                url: app.config.apiUrl + "/api/getWechatPhone",
                method: "POST",
                data: postData,
                success: function (result) {
                    wx.hideLoading()
                    switch (result.data.code) {
                        case 0:
                            //手机号解密成功 并且查到了相关的用户信息
                            wx.setStorageSync('userInfo', result.data.data);
                            wx.showToast({
                                title: "登录成功"
                            });
                            break;
                        default:
                            //登录失败
                            wx.showModal({
                                title: '登录失败',
                                content: result.data.msg,
                                showCancel: false,
                            })
                    }
                }
            });
        },
        fail: function () {
            //会话过期 需要重新获得code 第一步
            wx.showModal({
                title: '登录失败',
                content: '微信授权手机号登录失败,请重试!',
            })
        }
    });
}
<?php 
//第四步 解密第三步POST的数据 得到手机号 走自己的业务流程
//我这里是TP5框架

public function getWechatPhone(){
    $appid = '';//小程序APPID
    $appkey = '';//小程序的APPKEY
    //判断POST的数据中是否包含code/iv(向量)/encryptedData(原始加密数据)/session_key(会话key)/openid
    if(input("?code") && input("?iv") && input("?encryptedData") && input("?session_key") && input("?openid")){
        $code = input("code");
        $iv = input("iv");
        $encryptedData = input("encryptedData");
        $session_key = input("session_key");
        $openid = input("openid");
        try{
            $isOk =true;
            $aesKey=base64_decode($session_key);
            if (strlen($iv) != 24) {
                //非合法解密向量
                $isOk =false;
            }
            $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 )
            {
                //解密数据异常
                $isOk =false;
            }
            if( $dataObj->watermark->appid != $appid )
            {
                //这个就没啥用了 解密成功就行 管他是不是自己的 这是微信demo的 我没改。
                $isOk =false;
            }
            if($isOk){
                $phone = $dataObj->phoneNumber;//得到手机号
                $user_info = ;//手机号查询用户是否注册
                if (empty($user_info)) {
                    return json(["code"=>1,"msg"=>"你还没有注册,请先注册后登录"]);
                }else{
                    $access_token=md5($User_Info['id'].mt_rand().microtime(true)).get_uuid().get_random().get_random();
                    //更新用户的身份令牌 生成access_token 
                    
                    return json(["code"=>0,"access_token"=>$access_token,"user_info"=>$user_info]);
                    
                }
            }else{
                return json(["code"=>1,"msg"=>"解密出了问题"]);
            }
        }catch(\Exception $e){
            return json(["code"=>1,"msg"=>"解密出了问题"])
        }
    }else{
        return json(["code"=>1,"msg"=>"是不是所有的参数都POST过来了?"])
    }
}

完毕!

到此,解密手机号,用手机号登录就完成了