1. 程式人生 > >PHP微信小程式之獲取並解密使用者資料獲取openId和unionId

PHP微信小程式之獲取並解密使用者資料獲取openId和unionId

前言微信小程式API文件:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html在實際的小程式開發中,往往需要使用者授權登陸並獲取使用者的資料,快速對接使用者系統。openId : 使用者在當前小程式的唯一標識 unionId : 如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程式),可通過unionid來區分使用者的唯一性,因為只要是同一個微信開放平臺帳號下的移動應用、網站應用和公眾帳號(包括小程式),使用者的unionid是唯一的。換句話說,同一使用者,對同一個微信開放平臺下的不同應用,unionId是相同的。詳情登入微信開放平臺(open.weixin.qq.com) 。在微信小程式開發中,unionId等敏感資料則被加密在encryptedData,於是需要以下流程來解密敏感資料,從而獲取unionId等資訊。注:當 withCredentials 為 true 時,要求此前有呼叫過 wx.login 且登入態尚未過期,此時返回的資料會包含 encryptedData, iv 等敏感資訊;當 withCredentials 為 false 時,不要求有登入態,返回的資料不包含 encryptedData, iv 等敏感資訊。流程1、(客戶端)微信小程式客戶端呼叫 wx.login()介面獲取登入憑證(code)//1、呼叫微信登入介面,獲取codewx.login({    success: function (r) {        var code = r.code;//登入憑證        if (code) {            //2、呼叫獲取使用者資訊介面            //...        } else {            console.log('獲取使用者登入態失敗!' + r.errMsg)        }    },    fail: function () {        callback(false)    }})2、(客戶端)微信小程式客戶端呼叫 wx.getUserInfo()介面獲取 使用者基本資訊、encryptedData(使用者敏感資訊加密資料) 和 iv(加密演算法的初始向量 )//1、呼叫微信登入介面,獲取codewx.login({    success: function (r) {        var code = r.code;//登入憑證        if (code) {            //2、呼叫獲取使用者資訊介面            wx.getUserInfo({                success: function (res) {                    console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})                    //3.解密使用者資訊 獲取unionId                    //...                },                fail: function () {                    console.log('獲取使用者資訊失敗')                }            })        } else {            console.log('獲取使用者登入態失敗!' + r.errMsg)        }    },    fail: function () {        callback(false)    }})3、(客戶端)將前面獲取到的 code 、encryptedData、iv傳送到自己的伺服器(開發者伺服器),通過自己的伺服器(開發者伺服器)解密獲取資訊//1、呼叫微信登入介面,獲取codewx.login({    success: function (r) {        var code = r.code;//登入憑證        if (code) {            //2、呼叫獲取使用者資訊介面            wx.getUserInfo({                success: function (res) {                    console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})                    //3.請求自己的伺服器,解密使用者資訊 獲取unionId等加密資訊                    wx.request({                        url: 'https://xxxx.com/wxsp/decodeUserInfo',//自己的服務介面地址                        method: 'post',                        header: {                            'content-type': 'application/x-www-form-urlencoded'                        },                        data: {encryptedData: res.encryptedData, iv: res.iv, code: code},                        success: function (data) {                            //4.解密成功後 獲取自己伺服器返回的結果                            if (data.data.status == 1) {                                var userInfo_ = data.data.userInfo;                                console.log(userInfo_)                            } else {                                console.log('解密失敗')                            }                        },                        fail: function () {                            console.log('系統錯誤')                        }                    })                },                fail: function () {                    console.log('獲取使用者資訊失敗')                }            })        } else {            console.log('獲取使用者登入態失敗!' + r.errMsg)        }    },    fail: function () {         console.log('登陸失敗')    }})4、(服務端 php)自己的伺服器傳送code到微信伺服器獲取openid(使用者唯一標識)和session_key(會話金鑰),最後將encryptedData、iv、session_key通過AES解密獲取到使用者敏感資料/**     * 解密使用者敏感資料     *     * @param encryptedData 明文,加密資料     * @param iv            加密演算法的初始向量     * @param code          使用者允許登入後,回撥內容會帶上 code(有效期五分鐘),開發者需要將 code 傳送到開發者伺服器後臺,使用code 換取 session_key api,將 code 換成 openid 和 session_key     * @return     */include_once "wxBizDataCrypt.php";  function httpGet($url) {    $curl = curl_init();    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);    curl_setopt($curl, CURLOPT_TIMEOUT, 500);    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);    curl_setopt($curl, CURLOPT_URL, $url);    $res = curl_exec($curl);    curl_close($curl);    return $res;  }$code          = $_GET['code'];$iv            = $_GET['iv'];$encryptedData = $_GET['encryptedData'];$appid      = '';//小程式唯一標識   (在微信小程式管理後臺獲取)$appsecret  = '';//小程式的 app secret (在微信小程式管理後臺獲取)$grant_type = "authorization_code"; //授權(必填)$params = "appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=".$grant_type;$url = "https://api.weixin.qq.com/sns/jscode2session?".$params;$res = json_decode(httpGet($url),true);//json_decode不加引數true,轉成的就不是array,而是物件。 下面的的取值會報錯  Fatal error: Cannot use object of type stdClass as array in$sessionKey = $res['session_key'];//取出json裡對應的值$pc = new WXBizDataCrypt($appid, $sessionKey);$errCode = $pc->decryptData($encryptedData, $iv, $data);if ($errCode == 0) {    print($data . "\n");} else {    print($errCode . "\n");}總結    好了,總算完成資料解密了,接下來對接新的或已有的使用者系統都妥妥的。    有一點需要注意的是,要對接已有的使用者系統可能需要用到unionId,如果通過以上方法獲取不到unionId,那麼你就要去檢查一下你的微信開放平臺(https://open.weixin.qq.com)是否有繫結微信小程式咯~    雖然code 有5分鐘的有效期,但是隻能使用一次,小編就這裡翻更鬥了。

每種後臺語言對於AES加密都有相應的介面支援,呼叫即可。

微信官方提供了(PHP,Node,Phython,C++)程式語言的示例程式碼
每種語言型別的介面名字均一致。

呼叫方式可以參照官方提供示例點選下載示例程式碼

本文只對PHP版的做了註釋,其他語言類似

注意:

看本文前,需要理解AES-128-CBC及psck#7資料填充方式

正文開始

1: demo.php(AES使用程式碼)

  1. <?php
  2. //載入解密處理類
  3. include_once "wxBizDataCrypt.php";
  4. //1:wx後臺得到
  5. $appid ='wx4f4bc4dec97d474b';
  6. //2:[客戶端]傳送到伺服器js_code(伺服器用js_code換取sessionKey)
  7. $sessionKey ='tiihtNczf5v6AKRyjwEUhQ==';
  8. //3:[客戶端]傳送到伺服器(客戶端getUserInfo()獲取)
  9. $encryptedData="CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
  10. QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
  11. 9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
  12. 3hVbJSRgv+4lGOETKUQz6OYStslQ142d
  13. NCuabNPGBzlooOmB231qMM85d2/fV6Ch
  14. evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
  15. /1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
  16. u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
  17. /Hz7saL8xz+W//FRAUid1OksQaQx4CMs
  18. 8LOddcQhULW4ucetDf96JcR3g0gfRK4P
  19. C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
  20. 6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
  21. /8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
  22. lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
  23. oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
  24. 20f0a04COwfneQAGGwd5oa+T8yO5hzuy
  25. Db/XcxxmK01EpqOyuxINew==";
  26. //4:[客戶端]傳送到伺服器(客戶端getUserInfo()獲取)
  27. $iv ='r7BXXKkLb8qrSNn05n0qiA==';
  28. //用appid、sessionKey初始化“解密處理類
  29. $pc =newWXBizDataCrypt($appid, $sessionKey);
  30. //執行解密,正確返回$data,錯誤返回$errCode
  31. $errCode = $pc->decryptData($encryptedData, $iv, $data );
  32. if($errCode ==0){//0表示正常
  33. print($data ."
  34. ");
  35. }else{
  36. print($errCode ."
  37. ");
  38. }

2:wxBizDataCrypt.php(解密處理)

  1. <?php
  2. /**
  3. * 對微信小程式使用者加密資料的解密示例程式碼.
  4. *
  5. * @copyright Copyright (c) 1998-2014 Tencent Inc.
  6. */
  7. //pkcs#7填充方法類
  8. include_once "pkcs7Encoder.php";
  9. //錯誤程式碼定義
  10. include_once "errorCode.php";
  11. //解密處理類
  12. classWXBizDataCrypt
  13. {
  14. private $appid;
  15. private $sessionKey;
  16. 相關推薦

    PHP程式獲取解密使用者資料獲取openIdunionId

    前言微信小程式API文件:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html在實際的小程式開發中,往往需要使用者授權登陸並獲取使用者的資料,快速對接使用者系統。openId : 使用者在當前小程式的唯一標識

    程式動態新增、刪除指定內容(view)獲取input值

    這次遇到個問題: 1. 動態的新增指定的view內容。。嗯。。很簡單。。wx:for就搞定 2. 動態新增的內容中有input,最終獲取值的時候,要獲取到所有input的值並且是一個數組。。嗯。。 3. 動態刪除指定的已經新增的view內容。。 思路: 1. wx:for 迴圈view,新

    程式快取——不同頁面傳遞資料

    1. 新增快取 單個金鑰允許儲存的最大資料長度為1MB,所有資料儲存上限為10MB。 // 儲存資訊到storage // 非同步儲存 set() { wx.setStorage({ key: 'user', data: 'cck', succe

    程式聯盟:程式獲取解密使用者資料獲取openIdunionId

    前言在實際的小程式開發中,往往需要使用者授權登陸並獲取使用者的資料,快速對接使用者系統。openId : 使用者在當前小程式的唯一標識 unionId : 如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程式),可通過unionid來區分使用者的唯一性,因為只要是同一

    JAVA程式獲取解密使用者資料獲取openIdunionId

    前言在實際的小程式開發中,往往需要使用者授權登陸並獲取使用者的資料,快速對接使用者系統。openId : 使用者在當前小程式的唯一標識unionId : 如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程式),可通過unionid來區分使用者的唯一性,因為只要是同一個微信開放平臺帳號下的移動應用、網站

    11.程式canvas生成圖片儲存到手機

    在小程式中,會有這樣一種需求,儲存某一個頁面並將其分享到朋友圈。一般的做法是:將這個頁面用canvas繪製出來,通過wx.canvasToTempFilePath,把當前畫布指定區域的內容匯出生成指定大小的圖片。然後再通過wx.saveImageToPhotosAlbum,儲存圖片到系統相簿。由

    程式獲取後臺動態資料Gird表格佈局display:grid

    在工作中常用的就是flex佈局和grid佈局了,因為本人對grid佈局不是很熟練,這次主要是想模擬獲取後臺的動態資料來動態的設定表格佈局,算是一個簡單的嘗試,畢竟之前沒有用過。分享一下。 (一)實現效果 跟我上一篇文章微信小程式之獲取後臺動態資料表格佈局dis

    程式使用者登入(獲取使用者資訊,openid,unionld) java後臺版

    參考文章:https://blog.csdn.net/guochanof/article/details/80189935;感謝作者給的思路與大部分問題解決辦法由於微信官方api的更改,wx.getuserinfo()方法無法在無授權的情況下直接使用,參考文中作者是直接可以拉

    程式獲取使用者資訊介面優化調整

    突然收到這個訊息的我是懵逼的,因為這意味著我要改需求! 新的處理方式就是 我的做法是做一個緩衝載入頁,然後通過wx.getUserInfo獲取使用者資訊,如果已經授權過了,那麼是可以獲取資訊的

    程式獲取驗證碼js

    在微信小程式中怎樣實現獲取驗證碼的倒計時功能,倒計時的原理是一樣的,就是某些地方需要注意。 第一步結構:結構 <view class='get-code' wx:if="{{!isShow}}" bindtap='getCode'>獲取驗證碼</view> &

    程式PHP後端伺服器資料庫的連線處理

          弄個小程式真是腦殼疼,好不容易把前端弄好,把伺服器佈置好,但是如何連線後臺伺服器和資料庫實現資料互動呢?網上搜到的部落格教程真是夠亂的,對於我這種後端技術小白一點都不友好!我摸索的好幾天,終於前端能讀取到伺服器的 mysql 資料庫,所以來這記錄下一些過程和坑,說

    程式獲取百度天氣

    能夠獲取天氣的開放平臺有很多,比如高德地圖、百度地圖、YY天氣等,這裡我們主要講述一下呼叫百度API實時獲取天氣的方式。 獲取金鑰之後,點選左側的“配置環境”, 根據其指引下載得到 bmap-xw.js 檔案,並放在小程式專案中(新建libs資料夾,與pages資

    程式PHP伺服器搭建

        在去年的時候,參加過學校的一個創業活動,在團隊決定做一個關於圖書的微信小程式以後,我負責做微信小程式的後臺程式,因為初次接觸,決定選用較為簡單的PHP作為後臺語言,實現了微信小程式的一些基本功能,例如對微信前段來的圖片文字進行儲存,或者接收到前端傳來的關鍵字對伺服器裡

    程式物流狀態時間軸

    一個月左右沒更新部落格了,最近有點懶了哈(工作上真的忙),很多工作上學習到的東西都沒有及時分享出來,有點愧疚,不過自己最近一直在收集資料和學習一些新技術,最主要是想要構建自己的前端技術體系和自定義一個前端規範文件,哈哈哈。說重點啦,微信小程式裡面開發的商城模組還挺多的,剛好寫了一個物流狀態的時間軸,簡單分享一

    程式登陸 —— 程式教程系列(20)

    簡介: 微信登陸,在新建一個微信小程式Hello World專案的時候,就可以看到專案中出現了我們的微信頭像,其實這個Hello World專案,就有一個簡化版的微信登陸。只不過是,還沒有寫入到咱們自家的後臺中而已。 新建一個Hello World專案,找到a

    程式swiper限制迴圈滑動

    最近接的一個單子是使用swiper來達到頁面之間完美滑動的效果的。也就三個頁面首頁、內容頁、尾頁。 但是客戶要求首頁不能滑到尾頁,尾頁不能滑到首頁。 在官方文件中沒有找到方法,因此只能繞彎路了。  wxml頁面程式碼:重點在於 current='{{show_index}}'

    程式介面互動反饋

    互動反饋就是在使用者觸發某事件之後,給使用者一個反饋資訊。 在小程式中是通過以下幾種方式實現的: 1.wx.showToast()方法 showToast: function (postscollected, postcollected) {

    程式側邊欄滑動實現(附完整原始碼)

    目錄 一、效果圖 二、原理解析 三、原始碼 四、專案下載 同類文章推薦: 更多幹貨關注公眾號: 一、效果圖 講什麼都不如直接上效果圖好,所以我們先來看下實現效果如何。 通過滑動螢幕,或者點選左上角的圖示按鈕,都能實現側邊欄的劃出效果。   &nb

    Android 分享程式圖片優化

          小菜上週接入了微信分享小程式的入口,基本功能實現都沒問題,有需要的朋友可以瞭解一下 Android 分享微信小程式失敗二三事,雖然功能都正常,但整體測試發現圖片展示效果不佳。於是小菜整理了一個簡單的小方法處理一下圖片!  

    程式踩坑textarea 元件的 bug

    微信小程式公測也有段時間了,但是裡面的坑踩了一個又一個,心也是夠累的。本文說說關於 textarea 元件的 bug。(注:本文提及的 bug,至少在 2016-12-1日還存在) 上一篇:微信小程式之踩坑之旅一,wx.request 和 wx.uploadFile 測試時使用到: