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 keypress,keyup,onpropertychange键盘事件
Jun 25 Javascript
js给onclick赋值传参数的两种方法
Nov 25 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
May 26 Javascript
Vue.js每天必学之指令系统与自定义指令
Sep 07 Javascript
js 打开新页面在屏幕中间的实现方法
Nov 02 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
Jan 17 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
详解vue-loader在项目中是如何配置的
Jun 04 Javascript
详解SPA中前端路由基本原理与实现方式
Sep 12 Javascript
微信小程序实现留言板
Oct 31 Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
PHP的PSR规范中文版
2013/09/28 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
python中lambda()的用法
2017/11/16 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
汽车专业人才自我鉴定范文
2013/12/29 职场文书
问卷调查计划书
2014/01/10 职场文书
关于逃课的检讨书
2014/01/23 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
文案策划岗位职责
2015/02/11 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python