微信小程序出來已久,也沒時間學習,近期在嘗試做一個小程序玩玩,獲取用戶信息的時候,微信會返回一些數據,包括明文(json格式)的用戶基本信息,同時也有一個加密的字段
encryptedData
,這里面包括了用戶基本信息之外還多了一個參數watermark
,里面存放的是用戶的openid和小程序的appid,但是要得到這些數據就需要后台進行解密,下面我就說一說解密的過程。
官方給了一些示例,網上也有根據這些改進的加解密方法,但是在我(菜鳥)看來都不是很清楚明了。php7.1之后的版本mcrypt
擴展已被廢棄,但是小程序官方只給了該版本的示例,對於使用php7.1之后版本的服務器來說就要用別的方法加解密了,最好的方法就是使用openssl
擴展,這也是php官方推薦的方案。
小提示:在使用微信的wx.request
進行POST請求時,服務器用$_POST
可能接收不到數據,我是使用get_file_contents('php://input')
解決的,接收到的是一個json格式字符串,但是也可以使用別的方法,利用設置header(具體方法不再贅述)。
准備工作
之前,我在文章中有講到PHP的AES加解密的方法,今天就是結合該AES類進行操作:
方法①: PHP進行AES/ECB/PKCS7 padding加密的例子(mcrypt)
方法②:PHP進行AES/ECB/PKCS7 padding加密的例子(openssl)
文章中的加密方法對於ECB模式不需要做什么改變,但是微信小程序使用的加密方式是CBC,該方法和ECB的主要表面差別在於CBC需要設置iv
向量,而ECB不需要。
示例代碼
# 將自己的參數進行替換
$str = file_get_contents('https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code');
# 將json字符串轉為數組
$data = json_decode($str, true);
# 這里解密用到的key就是獲得的session_key,然后對其進行base64_decode操作
$key = base64_decode($data['session_key']);
# iv是微信返回給你的向量,同樣進行base64_decode操作
$iv = base64_decode($_GET['iv']);
# 調用aes類,注意解密方法是AES-128-CBC
$aes = Aes::instance($key, 'AES-128-CBC', $iv);
# 對數據進行解密,得到解密后的json字符串
$data = $aes->decrypt($encryptedData);
至此,本記錄結束,有問題歡迎給我提出來哦!