ThinkPHP5-微信小程序获取用户授权登录信息

因为最近在用TP5开发小程序,所以就上网搜索了一下TP框架对应的微信小程序获取授权信息的依赖,但是结果不太理想,于是就借鉴了laravel的iwanli/wxxcx依赖,自己手动写了一个TP5的获取信息接口,下面分享一下具体的实现流程。
1.梳理
首先要知道的是,小程序开发中,微信小程序授权时后台会获取的参数。
encryptedData code iv
这三个参数是通过小程序前端发送到后台的。encryptedData是加密后的用户信息; code是登录凭证码;iv是偏移向量,也是在解密是要用到的。
之后需要去微信小程序官方文档里面下载解密sdk,https://developers.weixin.qq.com/miniprogr.... 下载完毕之后,解压并放入TP5项目的extend文件夹里面。这样准备工作就完毕了。
2.实现流程
首先在控制器中引用,以本人代码为例。

       //引用解密组件
       use wxxcx\wxBizDataCrypt;

       //获取微信用户信息
      public function sendCode()
      {
  //获取seeion_key
  $appid = 'wx4f4bc4dec97d474b';
$appsecret = '#################';
//获取前台发送的code
$code = input('get.code');
//用code 获取 session_key
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$appsecret.'&js_code='.$code.'&grant_type=authorization_code';
$arr = $this -> vegt($url);
$arr = json_decode($arr,true);
$session_key = $arr['session_key'];
//获取前台发送的 encryptedData 和 iv
$encryptedData = $_GET['encryptedData'];
$iv = $_GET['iv'];
  //解密用户信息
  if(empty($session_key) || empty($encryptedData) || empty($iv)){
  echo "信息不全";
  }
  //进行解密
  $userinfo=$this->getUserInfo($encryptedData,$iv,$session_key,$appid);
  //创建新数组 获取微信用户信息
  $data = json_decode($userinfo,true);
  session('myinfo',$data);
  $save['openid'] = $data['openId'];
  $save['uname'] = $data['nickName'];
  $save['unex'] = $data['gender'];
  $save['address'] = $data['city'];
  $save['avatarUrl'] = $data['avatarUrl'];
  $save['time'] = time();
  $map['openid'] = $data['openId'];

  $msg = "获取成功";
  //返回用户信息
  return $this->ApiSuccess($save, $msg);
  }

  //获取session_key
public function vegt($url){
  $info = curl_init();
  curl_setopt($info,CURLOPT_RETURNTRANSFER,true);
  curl_setopt($info,CURLOPT_HEADER,0);
  curl_setopt($info,CURLOPT_NOBODY,0);
  curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($info,CURLOPT_URL,$url);
  $output= curl_exec($info);
  curl_close($info);
  return $output;
}

 //信息解密
 public function getUserInfo($encryptedData, $iv,$session_key,$APPID){
 //进行解密
  $pc = new WXBizDataCrypt($APPID, $session_key);
  $decodeData = "";
  $errCode = $pc->decryptData($encryptedData, $iv, $decodeData);
//判断解密是否成功
  if ($errCode !=0 ) {
  return [
  'code' => 10001,
  'message' => 'encryptedData 解密失败'
  ];
  }
  //返回解密数据
  return $decodeData;
}

以上就是TP5获取微信小程序授权用户信息的实现流程。。

lanffff
讨论数量: 3
bing8u

你这代码质量太low……
解决方案:用composer 安装 GuzzleHttp\Client;
不管什么框架,写的思路、实现过程都差不多,是编写代码渣不渣的问题。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use GuzzleHttp\Client;
use Illuminate\Http\Request;

class MiniAppController extends Controller
{
    public function login(Request $request)
    {
        $data = $request->validate(['js_code' => 'required']);

        $response = (new Client)->get('https://api.weixin.qq.com/sns/jscode2session', [
            'query' => [
                'appid' => config('pay.wechat.miniapp_id'),
                'secret' => config('pay.wechat.miniapp_key'),
                'js_code' => data_get($data, 'js_code'),
                'grant_type' => 'authorization_code',
            ]
        ]);

        return json_decode((string)$response->getBody(), true);
    }

    public function token()
    {
        $response = (new Client)->get('https://api.weixin.qq.com/cgi-bin/token', [
            'query' => [
                'appid' => config('pay.wechat.miniapp_id'),
                'secret' => config('pay.wechat.miniapp_key'),
                'grant_type' => 'client_credential',
            ]
        ]);

        return json_decode((string)$response->getBody(), true);
    }
}
2周前 评论
lanffff: 感谢指导 2周前
1135782926

不是有一个叫easywechat的东西吗?

2周前 评论
bing8u

@1135782926 easywechat 是挺全面的,但用不到公众号开发那些的,仅几个方法就可以完成的,何必要引入呢

1周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!