1. 程式人生 > >thinkphp5微信小程式登入解密

thinkphp5微信小程式登入解密

==用到的方法==

1.傳送HTTP請求方法,用於獲取code。

/**
 * 傳送HTTP請求方法
 * @param  string $url    請求URL
 * @param  array  $params 請求引數
 * @param  string $method 請求方法GET/POST
 * @return array  $data   響應資料
 */
function httpCurl($url, $params, $method = 'POST', $header = array(), $multi = false){
    date_default_timezone_set('PRC'
); $opts = array( CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPHEADER => $header, CURLOPT_COOKIESESSION => true, CURLOPT_FOLLOWLOCATION => 1
, CURLOPT_COOKIE =>session_name().'='.session_id(), ); /* 根據請求型別設定特定引數 */ switch(strtoupper($method)){ case 'GET': // $opts[CURLOPT_URL] = $url . '?' . http_build_query($params); // 連結後拼接引數 & 非? $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; }

2.微信資訊解密

/**
 * 微信資訊解密
 * @param  string  $appid  小程式id
 * @param  string  $sessionKey 小程式金鑰
 * @param  string  $encryptedData 在小程式中獲取的encryptedData
 * @param  string  $iv 在小程式中獲取的iv
 * @return array 解密後的陣列
 */
function decryptData( $appid , $sessionKey, $encryptedData, $iv ){
    $OK = 0;
    $IllegalAesKey = -41001;
    $IllegalIv = -41002;
    $IllegalBuffer = -41003;
    $DecodeBase64Error = -41004;

    if (strlen($sessionKey) != 24) {
        return $IllegalAesKey;
    }
    $aesKey=base64_decode($sessionKey);

    if (strlen($iv) != 24) {
        return $IllegalIv;
    }
    $aesIV=base64_decode($iv);

    $aesCipher=base64_decode($encryptedData);

    $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
    $dataObj=json_decode( $result );
    if( $dataObj  == NULL )
    {
        return $IllegalBuffer;
    }
    if( $dataObj->watermark->appid != $appid )
    {
        return $DecodeBase64Error;
    }
    $data = json_decode($result,true);

    return $data;
}

3.請求過程中因為編碼原因+號變成了空格,需要用下面的方法轉換回來

/**
 * 請求過程中因為編碼原因+號變成了空格
 * 需要用下面的方法轉換回來
 */
function define_str_replace($data)
{
    return str_replace(' ','+',$data);
}

==控制器==

    public function weixinlogin()
    {
        $get = input('get.');
        //獲取session_key
        $params['appid']= '小程式ID';
        $params['secret']= '小程式金鑰';
        $params['js_code']= define_str_replace($get['code']);
        $params['grant_type']= 'authorization_code';
        $http_key = httpCurl('https://api.weixin.qq.com/sns/jscode2session', $params, 'GET');
        $session_key = json_decode($http_key,true);
        if(!empty($session_key['session_key'])){
            $appid = $params['appid'];
            $encryptedData= urldecode($get['encryptedData']);
            $iv = define_str_replace($get['iv']);
            $errCode = decryptData($appid,$session_key['session_key'],$encryptedData,$iv);
            dump($errCode); //列印獲取的資料
        }else{
            echo '獲取session_key失敗!';
        }
    }

==小程式JS==

    onLaunch: function() {
      wx.login({//login流程
      success: function (res) {//登入成功
        if (res.code) {
          var code = res.code;
          wx.getUserInfo({//getUserInfo流程
            success: function (res2) {//獲取userinfo成功
            var encryptedData = encodeURIComponent(res2.encryptedData);//一定要把加密串轉成URI編碼
              var iv = res2.iv;
              //請求自己的伺服器
             Login(code,encryptedData,iv);
            }
          })
        } else {
          console.log('獲取使用者登入態失敗!' + res.errMsg)
        }
      }
    });
    function  Login(code,encryptedData,iv){
              //建立一個dialog
              wx.showToast({
                title: '正在登入...',
                icon: 'loading',
                duration: 10000
              });
              //請求伺服器
              wx.request({
                url: '你的伺服器API介面',
                data: {
                  code:code,
                  encryptedData:encryptedData,
                  iv:iv
                },
                method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
                header: {
                  'content-type': 'application/json'
                }, // 設定請求的 header
                success: function (res) {
                  // success
                  wx.hideToast();
                  console.log('伺服器返回'+res.data);

                },
                fail: function () {
                  // fail
                  // wx.hideToast();
                },
                complete: function () {
                  // complete
                }
              })
      }
}

相關推薦

thinkphp5程式登入解密

==用到的方法== 1.傳送HTTP請求方法,用於獲取code。 /** * 傳送HTTP請求方法 * @param string $url 請求URL * @param array

程式登入&授權&獲取使用者資訊(thinkphp5後臺)

後臺用到的公共方法(寫入common.php檔案的) 1.傳送HTTP請求方法,用於獲取code。 /** * 傳送HTTP請求方法 * @param string $url 請求URL * @param array $params 請求引數 * @p

程式登入狀態java後臺解密

一、登入流程圖 二、微信小程式端 doLogin:function(callback = () =>{}){ let that = this; wx.login({ success:function(loginRes){ if(l

程式登入資料解密以及狀態維持

說明:本文沒有找到原文地址  學習過小程式的朋友應該知道,在小程式中是不支援cookie的,藉助小程式中的快取我們也可以儲存一些資訊,但是對於一些比較重要的資訊,我們需要通過登入狀態維持來儲存,同時,為了安全起見,使用者的敏感資訊,也是需要加密在網路上傳輸的。 前臺,service。封裝了ht

程式登入授權

wxml檔案內容 <view class="container"> <view class="userinfo"> <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInf

程式登入-openid和unionid

本文轉自https://www.cnblogs.com/yaoyuqian/p/8203792.html   我們一般都是先獲取到微信的 unionid,然後再通過 unionid 去登入自己的網站,就可以關聯到使用者在自己網站上的 user_id,但是在小程式登入中,有時候可以獲取到

解決程式登入與釋出的一些問題

解決微信小程式的問題 圖片在電腦上顯示但在手機上卻無法顯示的問題 要使用的是本地圖片,不想把圖片上傳到網路再通過https的方式解決,解決方法如下: 1.image src中的圖片地址對英文字母大小寫敏感,必須確認大小寫對得上; 2.圖片大小問題。本地圖片要小於10KB才能順利在真機上顯示。 為什麼

程式--登入流程梳理

前言 微信小程式凡是需要記錄使用者資訊都需要登入,但是也有幾種不同的登入方式,但是在小程式部分的登入流程是一樣的。之前就朦朦朧朧地用之前專案的邏輯改改直接用了,這個新專案要用就又結合官方文件重新梳理了下,並記錄一下,好記性不如爛筆頭嘛,哈哈。 幾種登入流程設計 利用OpenId 建立新使用者 這種方式

基於Shiro,JWT實現程式登入完整例子

小程式官方流程圖如下,官方地址 : developers.weixin.qq.com/miniprogram… : 如果此圖理解不清楚的地方,也可參看我的部落格 : www.cnblogs.com/ealenxie/p/… 本文是對接微信小程式自定義登入的一個完整例子實現 ,技術棧為 :

程式登入Java後臺介面(詳解,附示例程式碼)

首先看一下官方文件 我們先對官方給的時序圖進行簡單的分析 1.當小程式呼叫wx.login()時,會獲得一個code(臨時登入憑證),然後我們需要用wx.request()將code傳送到自己的伺服器. 2.在伺服器的介面中,呼叫登入憑證校檢介面,將appid(

程式登入(Java伺服器)

1, 首先前端會呼叫授權介面這個不用管, 呼叫授權介面以後, 會拿到微信使用者的頭像, 名稱, 前端的朋友請往這邊走, 微信小程式登入流程, 你可能走錯片場了,  我們討論的是後臺的登入 2, 我只需要知道, 當前端呼叫微信的授權介面以後, 有一個很重要的引數, 那就是co

程式 登入 獲取授權登入

很簡潔的版本了吧,記憶力奇差,先存起來忘記了自己再點開看 <template> <view class="container"> // 這裡面的東西不要漏 <button type="primary" open-type="g

Thinkphp5程式獲取使用者資訊介面呼叫筆記

首先在官網下載示例程式碼, 選php的, 這裡有個坑  官方的php檔案,編碼是UTF-8+的, 所以要把檔案改為UTF-8 然後在Thinkphp5 extend資料夾下建立Wxxcx名稱空間,把官方的幾個類檔案放進去(這裡要注意資料夾名, 名稱空間名, 類名的, 大小

程式 登入併成功跳轉

//app.js App({ onLaunch: function () { // 展示本地儲存能力 var logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorage

Java實現程式登入 獲取使用者資訊

小程式比公眾號授權登入 更加簡單 其實沒什麼是後臺需要處理的 前端傳過來一個code 我們儲存以下通過code獲取過來的openid就可以 其他的使用者資訊 前端小程式那邊可以獲取。首先既然是小程式登入 你要有一個你自己的小程式還是要拿到你自己的appid和appSecret

程式登入註冊demo+java伺服器(一)

一.開發平臺和前期準備1.前端工具:微信web開發者工具打web開發者工具,新建小程式專案,目錄和名稱自己隨意填,AppID點選體驗:小程式小程式開啟後,點選右上方的詳情,專案設定,勾選不校驗xxxxx2.後臺開發工具:eclipseeclipse要求是java ee版的,並

django-程式登入

小程式登入邏輯前端通過呼叫wx.login()獲取code, 將code和使用者基本資訊傳送到後端,後端通過request.get向微信伺服器傳送get請求獲取使用者openid和session_key,手動新增jwt-token,利用jwt自動校驗使用者是否登入   小程式前端觸發login事

程式登入元件封裝 —— 完成已登入狀態才能繼續的操作

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 此元件是專案中用到的,專案結束了,分享給大家,希望能對大家有所幫助 這裡只討論怎樣解決需要已

程式登入那些事

最近團隊在開發一款小程式,都是新手,一邊看文件,一邊開發。在開發中會遇到各種問題,今天把小程式登入這塊的流程整理下,做個記錄。 小程式的登入跟平時自己APP這種登入驗證還不太一樣,多了一個角色,那就是微信伺服器。 根據微信官方提供的登入流程時序圖可以清楚的瞭解小程式登入需要多少個步驟,下

程式後臺解密使用者資料

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.n