老莫的笔记本  
  
查看: 1186|回复: 3

微信小程序 session_key 与 open-type

[复制链接]

662

主题

878

帖子

5139

积分

超级版主

Rank: 8Rank: 8

积分
5139
发表于 2020-4-23 17:46:35 | 显示全部楼层 |阅读模式
1.
        open-type  : 写在button 的属性一栏 表示微信开放能力;
               
                具有以下功能:
                值        说明        最低版本
                contact        打开客服会话,如果用户在会话中点击消息卡片后返回小程序,可以从 bindcontact 回调中获得具体信息,具体说明        1.1.0
                share        触发用户转发,使用前建议先阅读使用指引        1.2.0
                getPhoneNumber        获取用户手机号,可以从bindgetphonenumber回调中获取到用户信息,具体说明        1.2.0
                getUserInfo        获取用户信息,可以从bindgetuserinfo回调中获取到用户信息        1.3.0
                launchApp        打开APP,可以通过app-parameter属性设定向APP传的参数具体说明        1.9.5
                openSetting        打开授权设置页        2.0.7
                feedback        打开“意见反馈”页面,用户可提交反馈内容并上传日志,开发者可以登录小程序管理后台后进入左侧菜单“客服反馈”页面获取到反馈内容        2.1.0



2.
        session_key 的使用
               
                2.1  session_key 主要用作加密解密[我只找到了解密] ;
                        相关链接 :https://developers.weixin.qq.com ... E%E6%95%B0%E6%8D%AE
                       
                2.2 使用方法:
                                2.2.1 把示例代码下载 粘贴需要的部分到 项目中 ;
                                2.2.2 把 WXBizDataCrypt /ErrorCode  修改文件名 ,并且修改引用方式 ,带入项目【例如tp5 带入tp5的项目】
                                2.2.3 把demo 的代码 再带入 项目文件中;
                               
                2.3 理解 :
                               
                                一般是这么个逻辑 : 第一次请求的时候,判断用户登录状态,最好判断场景值 ,然后获得 openid 和 session_key , 存起来  
                                                                        然后 再后台 自己再搞个自己的mysession,两个session 没啥关系;
                                                                        mysession 用于自己登录状态的判断;
                                                                        session_key  用于对微信接受api 数据时解密 ;
                                                                       
                                关于判断session_key 是否过期:
                                                                        其实并不是所有请求 都是跟微信互动 ;
                                                                        我觉得要跟微信互动 调用微信的api 才有用
                                                                        wx.qy.checkSession({
                                                                                        success: function(){
                                                                                                //session_key 未过期,并且在本生命周期一直有效
                                                                                        },
                                                                                        fail: function(){
                                                                                                // session_key 已经失效,需要重新执行登录流程
                                                                                                wx.qy.login() //重新登录
                                                                                        }
                                                                        })
               

回复

使用道具 举报

662

主题

878

帖子

5139

积分

超级版主

Rank: 8Rank: 8

积分
5139
 楼主| 发表于 2020-4-23 17:47:35 | 显示全部楼层
贴项目原demo
  1. <?php
  2. namespace app\home\controller;
  3. use think\Controller;
  4. use think\Db;
  5. use think\Request;
  6. use think\Cache;
  7. use think\Config;
  8. use think\Image;   
  9. use app\index\model\Wxcode;
  10. use app\home\controller\WXBizDataCrypt;

  11. // 把接收到微信发来都数据 全部存进数据库
  12. class Wx extends Controller
  13. {
  14.        
  15.         public $appid = 'wx55b463a5f4d11789';

  16.         public $sessionKey = 'rK8/PzQzw2fPdRta4q+7+g==';


  17. /**
  18. *  解密成功  
  19. * 注意1:
  20. *         需要在此之前 去检测 session_key 有没有失效
  21. *  这个 $data  是一个返回值
  22. */
  23.    public function addwxuser()
  24.    {
  25.             // 获取e,data
  26.                 $encryptedData = input('encryptedData') ;
  27.        
  28.                 $iv = input('iv') ;

  29.                 $pc = new WXBizDataCrypt($this->appid, $this->sessionKey);

  30.                 $errCode = $pc->decryptData($encryptedData, $iv, $data );
  31.        
  32.                 if ($errCode == 0) {
  33.                         print($data . "\n");
  34.                 } else {
  35.                         print($errCode . "\n");
  36.                 }
  37.      
  38.    }
  39.   


  40. }
复制代码
回复

使用道具 举报

662

主题

878

帖子

5139

积分

超级版主

Rank: 8Rank: 8

积分
5139
 楼主| 发表于 2020-4-23 17:48:41 | 显示全部楼层
WXBizDataCrypt.php  代码
  1. <?php

  2. /**
  3. * 对微信小程序用户加密数据的解密示例代码.
  4. *
  5. * @copyright Copyright (c) 1998-2014 Tencent Inc.
  6. */
  7. namespace app\home\controller;

  8. // include_once "errorCode.php";
  9. use app\home\controller\ErrorCode;

  10. class WXBizDataCrypt
  11. {
  12.     private $appid;
  13.         private $sessionKey;

  14.         /**
  15.          * 构造函数
  16.          * @param $sessionKey string 用户在小程序登录后获取的会话密钥
  17.          * @param $appid string 小程序的appid
  18.          */
  19.         public function __construct( $appid, $sessionKey)
  20.         {
  21.                 $this->sessionKey = $sessionKey;
  22.                 $this->appid = $appid;
  23.         }


  24.         /**
  25.          * 检验数据的真实性,并且获取解密后的明文.
  26.          * @param $encryptedData string 加密的用户数据
  27.          * @param $iv string 与用户数据一同返回的初始向量
  28.          * @param $data string 解密后的原文
  29.      *
  30.          * @return int 成功0,失败返回对应的错误码
  31.          */
  32.         public function decryptData( $encryptedData, $iv, &$data )
  33.         {
  34.                 if (strlen($this->sessionKey) != 24) {
  35.                         return ErrorCode::$IllegalAesKey;
  36.                 }
  37.                 $aesKey=base64_decode($this->sessionKey);

  38.         
  39.                 if (strlen($iv) != 24) {
  40.                         return ErrorCode::$IllegalIv;
  41.                 }
  42.                 $aesIV=base64_decode($iv);

  43.                 $aesCipher=base64_decode($encryptedData);

  44.                 $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);

  45.                 $dataObj=json_decode( $result );
  46.                 if( $dataObj  == NULL )
  47.                 {
  48.                         return ErrorCode::$IllegalBuffer;
  49.                 }
  50.                 if( $dataObj->watermark->appid != $this->appid )
  51.                 {
  52.                         return ErrorCode::$IllegalBuffer;
  53.                 }
  54.                 $data = $result;
  55.                 return ErrorCode::$OK;
  56.         }

  57. }

复制代码
回复

使用道具 举报

662

主题

878

帖子

5139

积分

超级版主

Rank: 8Rank: 8

积分
5139
 楼主| 发表于 2020-4-23 17:49:09 | 显示全部楼层
ErrorCode.php
  1. <?php
  2. namespace app\home\controller;
  3. /**
  4. * 对微信小程序用户加密数据的返回代码.
  5. * error code 说明.
  6. * <ul>

  7. *    <li>-41001: encodingAesKey 非法</li>
  8. *    <li>-41003: aes 解密失败</li>
  9. *    <li>-41004: 解密后得到的buffer非法</li>
  10. *    <li>-41005: base64加密失败</li>
  11. *    <li>-41016: base64解密失败</li>
  12. * </ul>
  13. */
  14. class ErrorCode
  15. {
  16.         public static $OK = 0;
  17.         public static $IllegalAesKey = -41001;
  18.         public static $IllegalIv = -41002;
  19.         public static $IllegalBuffer = -41003;
  20.         public static $DecodeBase64Error = -41004;
  21. }

  22. ?>
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表