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 相关文章推荐
Jquery 表单验证类介绍与实例
Jun 09 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
Dec 04 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
Dec 17 Javascript
JS验证图片格式和大小并预览的简单实例
Oct 11 Javascript
JS实现touch 点击滑动轮播实例代码
Jan 19 Javascript
Bootstrap页面缩小变形的快速解决办法
Feb 03 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
JS作用域链详解
Jun 26 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
vue 纯js监听滚动条到底部的实例讲解
Sep 03 Javascript
Node.js assert断言原理与用法分析
Jan 04 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
php自动注册登录验证机制实现代码
2011/12/20 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python 返回汉字的汉语拼音
2009/02/27 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
python实现多线程网页下载器
2018/04/15 Python
python读取xlsx的方法
2018/12/25 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
python flask中动态URL规则详解
2019/11/22 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
德国团购网站:Groupon德国
2018/03/13 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
国庆节慰问信
2015/02/15 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
nginx七层负载均衡配置详解
2022/07/15 Servers