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

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

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

这里有个坑

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

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

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

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,$sessionKey,$appid)
{
//Loader::import('Wxxcx\WXBizDataCrypt',EXTEND_PATH);
$pc = new WXBizDataCrypt($appid,$sessionKey);
$data = null;
$errCode = $pc->decryptData($encryptedData,$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封装函数:

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; }

然后是小程序的代码:

{ 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) 
   } 
  } 
 }) 
} 

}
})
},

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

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

相关文章

(1)创建数据表: CREATE TABLE IF NOT EXISTS `think_form` ...
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的...
(1)创建模版:/App/Home/View/Form/edit.html   <FORM m...
自定义配置文件user.php: <?php return array(    \'se...
在一些成熟的CMS系统中,后台一般都包含一个配置中心(如织梦...
废话不多说先上图预览下,即本博客的分页; 这个分页类是在...