前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Thinkphp5实现小程序授权获取手机号码

Thinkphp5实现小程序授权获取手机号码

作者头像
程序猿的栖息地
发布2022-04-29 14:20:35
1.2K0
发布2022-04-29 14:20:35
举报
文章被收录于专栏:程序猿的栖息地

作者:阿dai哥

教程分享

TUTORIAL TO SHARE

使用Thinkphp框架开发接口,小程序授权获取微信用户绑定的手机号码,全网最简单的方式。

分享效果说明

SHARE THE BODY

1、授权登录提示

2、小程序授权后返回的手机号码

小程序代码

THE IMPLEMENTATION CODE

wxml代码如下:

代码语言:javascript
复制
<button class='pop_btn' plain="true" open-type='getPhoneNumber' bindgetphonenumber="getPhoneNumber">获取用户手机号</button>

js码如下:

代码语言:javascript
复制
getPhoneNumber(e) {
  var ivObj = e.detail.iv
  var telObj = e.detail.encryptedData
  var that = this;
  wx.login({
    success: res => {
      console.log('code转换', res.code); //用code传给服务器调换session_key
      wx.request({
        url: 'http://www.xxx.cc/wechat/demo/index', //接口地址
        data: {
          code: res.code,
          encryptedData: telObj,
          iv: ivObj
        },
        header: {
          'content-type': 'application/json' // 默认值
        },
        success: function(res) {
          console.log(res.data.data)
        }
      })
      //-----------------是否授权,授权通过进入主页面,授权拒绝则停留在登陆界面
      if (e.detail.errMsg == 'getPhoneNumber:fail user deny') { //用户点击拒绝
        console.log('用户点击拒绝')
      } else { //授权通过执行跳转
        console.log('授权通过执行跳转')
      }
    }
  });
}

Thinkphp代码

THE IMPLEMENTATION CODE

首先写一个方法根据code获取用户的openId和session_key,下面这个方法是最简单也是最有效的。

代码语言:javascript
复制
/**
 * 根据code 获取用户的openid
 * return array
 */
public function get_openid($code)
   {
       $apiurl = 'https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code';
       header("Content-type:text/html;charset=utf-8;");
       $appid = $this->AppID;
       $secret = $this->AppSecret;
       $url = str_replace("JSCODE",$code,str_replace("APPID",$appid,str_replace("SECRET",$secret,$apiurl)));
       $res = json_decode(file_get_contents($url), true);
       return $res;
   }

现在正式要进入主题啦,写一个用户点击授权请求的方法。方法也是非常简单的。

代码语言:javascript
复制
 /**
    * 授权.
    * @return int 成功0,失败返回对应的错误码
    */
public function index()
{
   $param = $this->request->param();
   $crop = $this->get_openid($param['code']); //返回session_key 与 openid
   $errCode = $this->decryptData($this->AppID, $crop['session_key'], $param['encryptedData'], $param['iv'], $data );
       if ($errCode == 0) {
           return success($data, '获取手机成功');
       } else {
           $ress['code'] = 301;
           $ress['data'] = $errCode;
           return error('获取手机成功', $ress);
       }
}

最后这个方法也是非常的关键,这个decryptData 方法的作用就是把加密的信息解密出明文,在这里我想说一下,小程序开发手册有一个非常大的坑,下载demo的代码认真看了之后发现发现代码有问题,可能官方也是吃错了药,上传了一个有问题的demo代码。我这个方法是优化后的代码直接就可以使用。

代码语言:javascript
复制
/**
 * 检验数据的真实性,并且获取解密后的明文.
 * @param $encryptedData string 加密的用户数据
 * @param $iv string 与用户数据一同返回的初始向量
 * @param $data string 解密后的原文
 *
 * @return int 成功0,失败返回对应的错误码
 */
private function decryptData( $appid,$sessionKey,$encryptedData, $iv, &$data )
{
    if (strlen($sessionKey) != 24) {
        return -41001;
    }
    $aesKey=base64_decode($sessionKey);
    if (strlen($iv) != 24) {
        return -41002;
    }
    $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 -41003;
    }
    if( $dataObj->watermark->appid != $appid )
    {
        return -41004;
    }
    $data = $dataObj;
    return 0;
}

很多人看不懂这个方法,不用担心,我已经封装好了,直接拿过去就可以用了。到了这里就完成了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿的栖息地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档