场景:据后台描述,wx.login取得的code要去换取session_key,来解密encryptedData,但是偶发解密不出来的情况,
问题: 现在必须要用button的open-type,所以必然是会出现先调用getUserInfo再调用wx.login的情况,所以code与iv和encryptedData到底是否需要匹配,即是否必须要先调用wx.login取得code保存起来再等到getUserInfo按钮点击.希望能给出一个解决方案
框架类型 | 问题类型 | API/组件名称 | 终端类型 | 操作系统 | 微信版本 | 基础库版本 |
---|---|---|---|---|---|---|
小程序 | Bug | wx.login getUserInfo | 客户端 | iOS | 6.7.0 | 2.0.9 |
1 个回答
wx.login和getUserInfo没有必然联系。
wx.login是根据获取code来换取用户的open id等信息,不包含user info。
而要获取user info,腾讯现在已经修改接口,必须用button的方式
button这个问题就不要强调了,那解密的时候后台获得的session_key是要用来解密encryptedData的,sessition_key是用code去换的,如果没有联系的话要怎么解密,还是说sessiton_key只是一个特殊处理过的数据相同的数据
没错,是先要调用wx.login,你解密不出来是你代码有问题。
/**
* error code 说明.
* <ul>
* <li>-41001: encodingAesKey 非法</li>
* <li>-41003: aes 解密失败</li>
* <li>-41004: 解密后得到的buffer非法</li>
* <li>-41005: base64加密失败</li>
* <li>-41016: base64解密失败</li>
* </ul>
*/
class
ErrorCode
{
public
static
$OK
= 0;
public
static
$IllegalAesKey
= -41001;
public
static
$IllegalIv
= -41002;
public
static
$IllegalBuffer
= -41003;
public
static
$DecodeBase64Error
= -41004;
}
/**
* 对微信小程序用户加密数据的解密示例代码.
*
* @copyright Copyright (c) 1998-2014 Tencent Inc.
*/
class
WXBizDataCrypt
{
private
$appid
;
private
$sessionKey
;
/**
* 构造函数
* @param $sessionKey string 用户在小程序登录后获取的会话密钥
* @param $appid string 小程序的appid
*/
public
function
__construct(
$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
;
}
}
我们这边解密是没有问题的,那个,不知道你是不是做小程序前端的啊,你是怎么维护小程序的登录态的呢,方便的话可以给个联系方式么
你可以参考腾讯官方出的一个项目。
https://github.com/tencentyun/wafer-client-demo/tree/master/vendor/qcloud-weapp-client-sdk
在需要登录状态的时候,只要设置request的属性login:true即可