热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信小程序登录,服务端解密有几率41003

服务器是将unionId作为唯一id的,需要使用WXBizDataCrypt.decryptData将encryptedData解密出来。不过在调用WXBizDataCrypt.decryptD

服务器是将unionId作为唯一id的,需要使用WXBizDataCrypt.decryptData将encryptedData解密出来。不过在调用WXBizDataCrypt.decryptData的时候总是又会30%的几率解密失败,返回errorCode -41003



服务器端语言:PHP (Laravel框架)

报错为:openssl_decrypt(): IV passed is only 15 bytes long…ects an IV of precisely 16 bytes, padding with 0




补充:每次小程序获取到iv的值中间有空格的,就会出错

1
2
3
成功的iv例子:$iv = "MLbq\/WIGb1YHk8f0GWmzLA=="



出错的iv例子:$iv = "shNiHyqyaVamI Fe\/YHUjw=="

WXBizDataCrypt类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

namespace App\Libs\WeChat;



use App\Libs\WeChat\errorCode;



/**

 * 对微信小程序用户加密数据的解密示例代码.

 *

 * @copyright Copyright (c) 1998-2014 Tencent Inc.

 */



class WXBizDataCrypt

{

    private $appid;

    private $sessionKey;



    public function __construct( $appid, $sessionKey) {

        $this->sessiOnKey= $sessionKey;

        $this->appid = $appid;

    }



    /**

     * 构造函数

     * @param $sessionKey string 用户在小程序登录后获取的会话密钥

     * @param $appid string 小程序的appid

     */

    public function WXBizDataCrypt( $appid, $sessionKey)

    {

        $this->sessiOnKey= $sessionKey;

        $this->appid = $appid;



    }





    /**

     * 检验数据的真实性,并且获取解密后的明文.

     * @param $encryptedData string 加密的用户数据

     * @param $iv string 与用户数据一同返回的初始向量

     * @param $data string 解密后的原文

     *

     * @return int 成功0,失败返回对应的错误码

     */

    public function decryptData( $encryptedData, $iv, &$data )

    {

        if (strlen($this->sessionKey) != 24) {

            return ErrorCode::$IllegalAesKey;

        }

        $aesKey=base64_decode($this->sessionKey);



       

        if (strlen($iv) != 24) {

            return ErrorCode::$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 ErrorCode::$IllegalBuffer;

        }

        if( $dataObj->watermark->appid != $this->appid )

        {

            return ErrorCode::$IllegalBuffer;

        }

        $data = $result;

        return ErrorCode::$OK;

    }



}



   



推荐阅读
author-avatar
更东陌飞絮蒙蒙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有