zoukankan      html  css  js  c++  java
  • 【PHP7】微信小程序用户信息encryptedData解密

    微信小程序出来已久,也没时间学习,近期在尝试做一个小程序玩玩,获取用户信息的时候,微信会返回一些数据,包括明文(json格式)的用户基本信息,同时也有一个加密的字段encryptedData,这里面包括了用户基本信息之外还多了一个参数watermark,里面存放的是用户的openid和小程序的appid,但是要得到这些数据就需要后台进行解密,下面我就说一说解密的过程。
    小程序encryptedData
    官方给了一些示例,网上也有根据这些改进的加解密方法,但是在我(菜鸟)看来都不是很清楚明了。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);
    

    至此,本记录结束,有问题欢迎给我提出来哦!

  • 相关阅读:
    OGNL与值栈
    Struts2的数据封装
    Struts2页面配置和访问servlet API
    Struts2入门介绍(二)
    Struts2 入门介绍(一)
    Hibernate批量抓取
    Problem G: STL——整理唱片(list的使用)
    STL详细介绍(更新中~~~)
    Problem E: 数量的类模板
    CF: Long Number
  • 原文地址:https://www.cnblogs.com/lantor/p/7522314.html
Copyright © 2011-2022 走看看