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


Posted in Javascript onSeptember 26, 2017

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

首先在官网下载示例代码, 选php的,

这里有个坑

官方的php文件,编码是UTF-8+的, 所以要把文件改为UTF-8

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

然后是自己的thinkphp接口代码:

<?php 
/** 
 * 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) 
       } 
      } 
     }) 
    } 
   } 
  }) 
 },

如果有报错, 自己调试一下, 看看哪里的变量有问题  查找原因.

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JS小功能(列表页面隔行变色)简单实现
Nov 28 Javascript
jquery实现tr元素的上下移动示例代码
Dec 20 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
Dec 29 Javascript
JS实现控制表格单元格垂直对齐的方法
Mar 30 Javascript
JQuery select(下拉框)操作方法汇总
Apr 15 Javascript
JQuery遍历DOM节点的方法
Jun 11 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
Vue如何从1.0迁移到2.0
Oct 19 Javascript
JS实现获取当前所在周的周六、周日示例分析
May 11 Javascript
Layui tree 下拉菜单树的实例代码
Sep 21 Javascript
微信小程序实现侧边分类栏
Oct 21 Javascript
用Node写一条配置环境的指令
Nov 14 Javascript
微信小程序url与token设置详解
Sep 26 #Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 #Javascript
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 #Javascript
深入理解Vuex 模块化(module)
Sep 26 #Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
Sep 26 #Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
Sep 26 #jQuery
Vue from-validate 表单验证的示例代码
Sep 26 #Javascript
You might like
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
PHP 防恶意刷新实现代码
2010/05/16 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
一些常用的Javascript函数
2006/12/22 Javascript
Gird事件机制初级读本
2007/03/10 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
详解Angular操作cookies方法
2018/06/01 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
JS代码优化的8点建议
2020/02/04 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python实现读取文件最后n行的方法
2017/02/23 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
python中reader的next用法
2018/07/24 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
Python命令行click参数用法解析
2019/12/19 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
人事专员的职责
2014/02/26 职场文书