Хранилище пользовательских данных на переднем плане апплета WeChat (на заднем плане Laravel)

PHP Апплет WeChat Laravel

После двух дней возни я с перерывами прошел процесс получения пользовательских данных в фоновом режиме этого апплета WeChat.

Затем запишите урожай за последние несколько дней.

Прежде всего, мы можем увидеть официальную документацию апплета WeChat.wx.login

api-login.jpg

Благодаря этой картинке мы знаем, что интерфейс должен передать код серверу, а сервер получает код и объединяет appid и appsecret для запроса службы интерфейса WeChat и получения openid и session_key.

Глядя на документацию, мы можем четко знать

Чтобы получить пользовательские данные в фоновом режиме, переднему плану необходимо передать код в дополнение к коду.ivа такжеencryptedData

iv и зашифрованные данные

Получите эти два в фоновом режиме и объедините полученный session_key, взяв код запроса на расшифровку данных пользователя, включая аватар, никнейм, город и т. д.

Итак, как получить этот iv и зашифрованные данные на переднем плане?

Легко пройтиwx.getUserInfo

wx.getUserInfo({
  success: function(res) {
    var  iv= res.iv
    var .encryptedData=res.encryptedData
  }
})

Затем передайте код iv и зашифрованные данные на фон поста через запрос

wx.login({
      success: function (res) {
        console.log(res.code)
        if (res.code) {
          wx.getUserInfo({
            withCredentials: true,
            success: function (res_user) {
              wx.request({
                //后台接口地址
                url: '你后台的接口的地址',
                data: {
                  code: res.code,                             // code  必须给  
                  encryptedData: res_user.encryptedData,      //密文串  必须给
                  iv: res_user.iv                             //加密初始量 必给
                },
                method: 'GET',
                header: {
                  'content-type': 'application/json'
                },
                success: function (res) {
                  wx.setStorageSync('openId', res.data.openId);      //拿到openid  存入session
                }
              })
            }

Итак, за кулисамиLaravel 5.4часть

Во-первых, мы определяем интерфейс (в первый раз, когда я определяю маршрут в web.php, он будет ограничен требованием публикации токена, поэтому я могу рассмотреть возможность его написания в api.php)

После этого переходим к контроллеру
Перед этим установите пакет guzzlehttp/guzzle для отправки запросов в сервис интерфейса WeChat.
прямая установкаcomposer require guzzlehttp/guzzle

Как использовать также очень просто, не нужно ничего устанавливать непосредственно на контроллерuse GuzzleHttp\Client;

Затем создайте таблицу allusers, чтобы поместить пользователя openid nickName и т. д.

затем пройтиphp artisan make:model AllusersСоздатьEloquent ORMМодель

и определите имя таблицы и первичный ключ в модели

  class Alluser extends Model
{
    protected $table = 'allusers';
    //public $timestamps = false;   //这个是看你是否要向表中传建立时间和更新数据时间
    protected $primaryKey='openid';
}

потом
Качаем официальный WeChatРасшифрованный документ версии PHP, и внедрить его в многоразовый контроллер для использования

Разархивируйте, чтобы получить файл PHP. Создайте файл Common под приложением и поместите его в файл PHP.


Общая структура

Затем перейдите в «карту классов» «автозагрузки» в composer.json: добавьте «app/Common/PHP/»

следующим образом

"autoload": {
        "classmap": [
            "database",
            "app/Common/PHP/"
        ],

Затем выполните в каталогеcomposer dumpautoloadты сможешь

Наконец, мы можем написать код для получения openid и session_key, шифрования и дешифрования, а также хранения данных под нашим контроллером.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;
use GuzzleHttp\Client;
use App\Model\Alluser;



class apiController extends Controller
{

    // 获取微信用户信息
    public function getcode(Request $request)
    {

        $code = $request->get('code');
        $encryptedData = $request->get('encryptedData');
        $iv = $request->get('iv');
        $appid = "你的appid";
        $secret = "你的secret";



        $client = new \GuzzleHttp\Client();
        $res = $client->request('GET', 'https://api.weixin.qq.com/sns/jscode2session', [
            'query' => ['appid' =>$appid,
                'secret' => $secret,
                'js_code' => $code,
                'grant_type' => 'authorization_code']
        ]);
        $body = json_decode($res->getBody());
        $openid = $body->openid;
        $session_key = $body->session_key;


        $userifo = new \WXBizDataCrypt($appid, $session_key);

        $errCode = $userifo->decryptData($encryptedData, $iv, $data);


        $info = json_decode($data);    
        $nickName = $info->nickName;
        $avatarUrl = $info->avatarUrl;
        $province = $info->province;
        $city = $info->city;

        $alluser = new Alluser();
        if (!$alluser->find($openid))
        {
            $alluser->openid = $openid;
            $alluser->session_key = $session_key;
            $alluser->nickName = $nickName;
            $alluser->avatarUrl = $avatarUrl;
            $alluser->province = $province;
            $alluser->city = $city;
            $alluser->save();
        }



        if ($errCode == 0) {
            return ($data);
        } else {
            return ($errCode);
        }



    }
}


Наконец, апплет WeChat компилирует и запрашивает 200 данных, и их можно нормально хранить! !

Инвентарь.png