
具体伪代码如下:
/**
* 我把这一步封装成一个函数,以后再调用那些需要登录后才有权限访问的后台服务时.
* 可以使用使用这个函数操作,基本逻辑,还可以进行扩展
* @url : 开发者服务器登录服务接口 可设置默认值
* @key : 存入本地缓存的第三方自定义登录session的键值
* @callback : 需要用到登录服务的回调函数(或函数集合)
*/
function Login(key,url,callback){
// 首先使用wx.login获取登录凭证code并发送给开发者服务器
wx.login({
success: function(res) {
if (res.code) {
//发送code给开发者服务器以获取session_key和openid
wx.request({
url:url,
data: {
code: res.code
},
//发送至开发者服务器成功
success: function(res) {
//开发者服务器获得session_key和openid成功并返回了
//第三方自定义session或者解密数据等json格式数据res给客户端
if(res.has3rdSession){
//登录成功,将第三方session存入本地缓存
console.log("登录成功")
wx.setStorageSync(key,res.3rdSession)
//设置登录标识为true
this.setData{
flag:true
}
//进行后续回调处理
callback(res)
....
}
else{
//没有返回第三方自定义session,登录失败
console.log("登录失败")
....
}
}
})
} else {
//没有获取到登录凭证code,登录失败
console.log('登录失败!' + res.errMsg)
....
}
}
})
}
/**
- 我把这一步封装成一个函数,以后再调用那些需要登录后才有权限访问的后台服务时.
- 可以使用使用这个函数操作,基本逻辑,还可以进行扩展
- @url : 开发者服务器服务接口
- @key : 自己定义的session存储在本地缓存中的键名
- @callback : 需要用到登录服务的回调函数(或函数集合)
- @others : 其他需要用到的数据等参数
*/
function doRequestWithSession(key,url,callback,others)
{
try {
var value = wx.getStorageSync(key)
if (value) {
// 存在自定义登录session,非首次登录
// 查询 用户密钥session_key是否过期
wx.checkSession({
success: function(){
//session_key 未过期,并且在本生命周期一直有效
//向开发者服务器发送自定义session查询用户信息
wx.request({
url: url,
data: value, //本地缓存的自定义Session值 可以加上其他需要的数据others等
success: function(res) {
if(res.hasSession){
//查询成功,开发者服务器上有我们自定义的session
//根据返回结果进行对应的操作,先判断session是否过期
//如果我们自定义的session已经过期
if(res.expired){
console.log("session过期,重新登录")
//设置登录标识为false
this.setData{
flag:false
}
wx.login() //重新登录 或者 返回错误码
....
}
else{
//没有过期,返回的结果则可以是用户的相关信息
//进行相关操作 登录成功
console.log("欢迎回来")
callback(res)
....
}
}
else
{
//开发者服务器上没有我们自定义的session,重新登录
console.log("无此session,重新登录")
//设置登录标识为false
this.setData{
flag:false
}
wx.login() //重新登录 或者 返回错误码
....
}
}
})
},
fail: function(){
// session_key 已经失效,需要重新执行登录流程
//设置登录标识为false
this.setData{
flag:false
}
wx.login() //重新登录 或者 返回错误码
....
}
})
}
else{
//本地缓存中没有自定义的session登录态信息,则进行首次登录或者后续处理
//设置登录标识为false
this.setData{
flag:false
}
wx.login() //登录 或者 返回错误码
....
}
} catch (e) {
// 异常处理
....
}
}
<?php
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;
}
}
$appid = 'wx4f4bc4dec97d474b';
$sessionKey = 'tiihtNczf5v6AKRyjwEUhQ==';
$encryptedData="CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
3hVbJSRgv+4lGOETKUQz6OYStslQ142d
NCuabNPGBzlooOmB231qMM85d2/fV6Ch
evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
/Hz7saL8xz+W//FRAUid1OksQaQx4CMs
8LOddcQhULW4ucetDf96JcR3g0gfRK4P
C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
20f0a04COwfneQAGGwd5oa+T8yO5hzuy
Db/XcxxmK01EpqOyuxINew==";
$iv = 'r7BXXKkLb8qrSNn05n0qiA==';
$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
?>