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获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
JavaScript window.document的属性、方法和事件小结
Oct 24 Javascript
js获取某月的最后一天日期的简单实例
Jun 22 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
JS实现动态增加和删除li标签行的实例代码
Oct 16 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
Jan 02 jQuery
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 Javascript
小程序实现抽奖动画
Apr 16 Javascript
JS实现的贪吃蛇游戏完整实例
Jan 18 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
详解jQuery如何实现模糊搜索
May 10 jQuery
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
Sep 25 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 addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php网站地图生成类示例
2014/01/13 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
django的model操作汇整详解
2019/07/26 Python
python3.7调试的实例方法
2020/07/21 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
物业总经理岗位职责
2014/02/28 职场文书
求职自荐信的格式
2014/04/07 职场文书
旅游节目策划方案
2014/05/26 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
离婚协议书格式
2015/01/26 职场文书
亲戚关系证明
2015/06/24 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL
详解MySQL的内连接和外连接
2023/05/08 MySQL