Centos7

CentOS7安装Python3的方法CentOS7搭建L2TP服务端一键脚本CentOS7使用CertBot工具获取LetSencrypt泛域名HTTPS证书

Git

GIT删除仓库的历史提交记录脚本示例GIT进行代码量统计和贡献统计

HTTP

HTTP关于HEADER的详细解释HTTP协议对URI长度POST数据长度及COOKIE长度限制说明HTTP关于Code状态码的详细解释

JavaScript

JavaScript下的RSA对称加密DEMOJavaScript解析并遍历Excel示例代码JavaScript调用语音合成Speech Synthesis API使用ElementUI配合API数据快速渲染合并表格

Linux

Linux 信号说明列表说明Linux利用CronTab定时执行ThinkPHP命令行模式

MySQL

MySQL字符串截取MySQL腾讯云数据库导出备份到本地服务器导入MySQL设计与使用规范MySQL在5.7及以上版本中的ONLY_FULL_GROUP_BY问题处理方案

Nginx

Nginx反向代理NodeJS实现WSS协议Nginx反向代理中的Host参数传递遇到的坑Nginx配置HTTPS与HTTP2.0Nginx负载均衡的lnmp环境初始化脚本Nginx图片递归代理服务器DEMO

NodeJS

NodeJS一些冷门但实用的npm包NodeJS使用Request模块实现CURLNodeJS使用express模块无法收到phpCurl的值NodeJS使用jimp和qrcode-reader识别解析二维码NodeJS实现UDP数据报套接字通讯NodeJS实现Websocket聊天室NodeJS实现串口通讯简单例程NodeJS实现微信协议登录NodeJS实现超级方便的Git自动发布WebhookNodeJS控制台简单表格打印NodeJS转码amr到mp3NWJS配置文件

Other

C#串口通信扫码枪数据读取支付宝Schema协议列表默克尔树基础算法示例博客的升级历程

PHP

PHP下RSA对称加密超长字符串分段加密DEMOPHP下phpMyAdmin数据字典美化代码PHP下的RSA对称加解密-根证书自签与签发子证书PHP使用root权限执行系统命令和切换到www用户PHP使用独占文件指针实现阻塞少量并发PHP多进程同时处理任务示例DEMO代码PHP大文件视频上传WebUploaderPHP实现Web方式发起一个超时任务的处理请求PHP实现二叉查找树的简单代码实现PHP实现微博登录简单代码PHP微信JSSDK开发DEMOPHP的坑XML转JSONPHP简单实现QQ登录代码PHP获取URL HTTP_HOST和SERVER_NAMEPHP获取上周、本周、上月、本月、本季度、上季度时间方法PHP获取真实IP之IP代理-IP伪造-真实IPPHP解密微信小程序手机号简单DEMOPHP高精度计算常用代码

Python

Python3使用Pool进程池实现多进程并发Python3使用jieba分词并生成WordCloud词云图Python3使用request进行CURL操作Python3实现WebhookPython3使用Selenium进行自动化测试手册

Wechat

微信公众号php环境无法获取POST值微信公众号网页跳转避免出现导航栏的小技巧
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过来了?"])
    }
}

完毕!

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