Thinkphp5微信小程序获取用户信息接口的实例详解

网友投稿 764 2022-09-02

Thinkphp5微信小程序获取用户信息接口的实例详解

Thinkphp5微信小程序获取用户信息接口的实例详解

首先在官网-示例代码, 选php的,这里有个坑,官方的php文件,编码是UTF-8+的, 所以要把文件改为UTF-8。

然后在Thinkphp5 extend文件夹下建立Wxxcx命名空间,把官方的几个类文件放进去(这里要注意文件夹名, 命名空间名, 类名的, 大小写,一定要一样,官方的文件名和类名大小写不一样)然后是自己的thinkphp接口代码:

 * Created by PhpStorm. 

 * User: leeoo 

 * Date: 2017/9/14 0014 

 * Time: 10:43 

 */ namespace app\api\controller\v1;  use think\Loader;  use think\Request;  use Workerman\Protocols\Http;  use Wxxcx\WXBizDataCrypt;  use first\second\Foo;  class Index 

  public function index($id) 

  { 

    return json(['msg' => $id]); 

  } 

  public function dologin() 

  { 

    $code = Request::instance()->param('code'); 

    $encryptedData = Request::instance()->param('encryptedData'); 

    $iv = Request::instance()->param('iv'); 

    $appid = "你的小程序appid"; 

    $secret = "你的小程序secret"; 

    //appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code      $param = array( 

      'appid' => $appid, 

      'secret' => $secret, 

      'js_code' => $code, 

      'grant_type' => 'authorization_code'     ); 

  //http函数为封装的请求函数      $res = http("https://api.weixin.qq.com/sns/jscode2session", $param, 'post'); 

    $arr = json_decode($res, true); 

    $result = $this->wxdecode($encryptedData, $iv, $arr['session_key'], $appid); 

    //return json($result);      if ($result) { 

      return json(['code' => 1]); 

    } else { 

      return json(['code' => -1]); 

    } 

  } 

  public function wxdecode($encryptedData, $iv, $sessionKey, $appid) 

  { 

    //Loader::import('Wxxcx\WXBizDataCrypt', EXTEND_PATH);      $pc = new WXBizDataCrypt($appid, $sessionKey); 

    $data = null; 

    $errCode = $pc->decryptData($encryptedData, $iv, $data); 

    //echo $data;      //return json(['data'=>$data]);      $data = json_decode($data); 

    if ($errCode == 0) { 

      //print($data . "\n");        //dump($data);        return $data; 

    } else { 

      //print($errCode . "\n");        //dump($errCode);        return $errCode; 

    } 

  } 

}

http封装函数:

/** 

 * 发送HTTP请求方法 

 * @param string $url  请求URL 

 * @param array $params 请求参数 

 * @param string $method 请求方法GET/POST 

 * @return array $data  响应数据 

 */ function http($url, $params, $method = 'GET', $header = array(), $multi = false){ 

  $opts = array( 

    CURLOPT_TIMEOUT    => 30, 

    CURLOPT_RETURNTRANSFER => 1, 

    CURLOPT_SSL_VERIFYPEER => false, 

    CURLOPT_SSL_VERIFYHOST => false, 

    CURLOPT_HTTPHEADER   => $header 

  ); 

  /* 根据请求类型设置特定参数 */   switch(strtoupper($method)){ 

    case 'GET': 

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

}

然后是小程序的代码:

// 获取用户信息    wx.getSetting({ 

   success: res => { 

    if (res.authSetting['scope.userInfo']) { 

     // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框       wx.getUserInfo({ 

      success: res => { 

       console.log(res); 

       var encryptedData = res.encryptedData 

       var iv = res.iv 

       wx.request({ 

        url: "https://你的服务器地址/dologin",//dologin是访问后端的方法          method: "post", 

        data: { 

         code: code, 

         encryptedData: encryptedData, 

         iv: iv 

        }, 

        success: function (ret) { 

         console.log(ret); 

        } 

       }) 

       // 可以将 res 发送给后台解码出 unionId         this.globalData.userInfo = res.userInfo 

       // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回         // 所以此处加入 callback 以防止这种情况         if (this.userInfoReadyCallback) { 

        this.userInfoReadyCallback(res) 

       } 

      } 

     }) 

    } 

   } 

  }) 

 },

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【云原生&微服务>SCG网关篇十一】Spring Cloud Gateway解决跨域问题
下一篇:创建模块,以及加载模块,单次加载,覆盖export
相关文章

 发表评论

暂时没有评论,来抢沙发吧~