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 相关文章推荐
Code:findPosX 和 findPosY
Dec 20 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
Mar 23 Javascript
Extjs入门之动态加载树代码
Apr 09 Javascript
最佳JS代码编写的14条技巧
Jan 09 Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 Javascript
jquery查找父元素、子元素(个人经验总结)
Apr 09 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
Sep 17 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
Sep 25 Javascript
JS检测数组类型的方法小结
Mar 14 Javascript
详解angularJS自定义指令间的相互交互
Jul 05 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 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 curl post 时出现的问题解决
2014/01/30 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
js传值 判断
2006/10/26 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
详解Python进程间通信之命名管道
2017/08/28 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
公司总经理岗位职责
2014/03/15 职场文书
座谈会主持词
2014/03/20 职场文书
委托书范本
2014/04/02 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
国庆节活动总结
2014/08/26 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
公司保密管理制度
2015/08/04 职场文书
小组组名及励志口号
2015/12/24 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript