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

2022-04-29 14:20:35 浏览数 (1)

作者:阿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;
}

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

0 人点赞