微信小程序前臺(tái)的用戶數(shù)據(jù)入庫(kù)(后臺(tái)Laravel)

搗鼓了兩天 斷斷續(xù)續(xù)把這個(gè)微信小程序后臺(tái)獲取用戶數(shù)據(jù)流程給打通了

接下來(lái)就把這幾天收獲的記錄一下。

首先 我們可以看到微信小程序官方 文檔 wx.login

api-login.jpg

通過(guò)此圖 我們知道 前臺(tái)要傳 一個(gè) code給后臺(tái),后臺(tái)拿到code 并結(jié)合appid和appsecret請(qǐng)求微信接口服務(wù),拿到openid和session_key

查閱文檔 我們可以清楚知道

后臺(tái)要獲得用戶數(shù)據(jù) 就需要前臺(tái)除了傳code 還需要傳 ivencryptedData

iv和encryptedData

后臺(tái)拿到這兩個(gè) 并結(jié)合拿code去請(qǐng)求得到的session_key便可以解密獲得用戶數(shù)據(jù) 包括頭像 昵稱 城市 等

那么這個(gè)iv和encryptedData前臺(tái)怎么獲得呢

很簡(jiǎn)單 通過(guò)wx.getUserInfo

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

然后通過(guò)request 將code iv 和encryptedData 給post后臺(tái)過(guò)去

wx.login({
      success: function (res) {
        console.log(res.code)
        if (res.code) {
          wx.getUserInfo({
            withCredentials: true,
            success: function (res_user) {
              wx.request({
                //后臺(tái)接口地址
                url: '你后臺(tái)的接口的地址',
                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
                }
              })
            }

于是來(lái)到后臺(tái)Laravel 5.4部分

首先我們定義接口 (我第一次是再web.php定義路由 會(huì)受到要求post傳token的限制,于是可以考慮寫(xiě)在api.php里面)

之后轉(zhuǎn)到控制器
這之前先安裝 guzzlehttp/guzzle 包用于向微信接口服務(wù)發(fā)送請(qǐng)求
安裝方式直接 composer require guzzlehttp/guzzle

如何使用也很簡(jiǎn)單 不需要設(shè)置什么 直接再控制器 use GuzzleHttp\Client;

之后建立 一個(gè)allusers表 放用戶 openid nickName 等

然后通過(guò) php artisan make:model Allusers 建立一個(gè)Eloquent ORM模型

并在模型中定義表名和主鍵

  class Alluser extends Model
{
    protected $table = 'allusers';
    //public $timestamps = false;   //這個(gè)是看你是否要向表中傳建立時(shí)間和更新數(shù)據(jù)時(shí)間
    protected $primaryKey='openid';
}

然后
我們下載微信官方的PHP版解密文檔 ,并將其引入可再控制器使用

解壓拿到一個(gè)PHP文件 在app下建立Common放入PHP文件


Common結(jié)構(gòu)

然后來(lái)到composer.json下 的 "autoload" 的"classmap": 里面加入 "app/Common/PHP/"

如下

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

然后在目錄下執(zhí)行 composer dumpautoload 便可以

最后我們便可以在我們的控制器下書(shū)寫(xiě)拿到openid和session_key的代碼和加解密以及數(shù)據(jù)入庫(kù)

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



    }
}


最后 微信小程序編譯 請(qǐng)求200 數(shù)據(jù)便可以正常入庫(kù)??!

入庫(kù).png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容