微信小程序之会话处理

发布时间:2019-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了微信小程序之会话处理脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

WechatAppSessionBundle 是一个用于处理微信小程序的 Symfony Bundle,实现思路参照了腾讯云官方-微信小程序端解决方案中的 会话管理场景,即这个 Bundle 是其 PHP(Symfony) 版本的一种实现。(只是不知道国内有多少使用 Symfony 的童鞋?)

微信的定位并不是 HTML5,这里很多人都有误解。在一些实现上,并不能想当然地用 HTML5 的思路来思考。比如,微信的请求接口 wx.request 并不支持 cookie 传递,所以会话层不能使用传统的 Session 方式。 ——腾讯云官方的微信小程序云端解决方案

该 Bundle 包含的功能:

  • 针对特定的控制器获取微信用户信息并校验合法性

  • 将用户信息缓存到 redis

  • 将用户信息设置到 Symfony/component/HttpFoundation/Request 对象中

安装和配置

第一步:使用 composer 安装 Bundle

composer require wechat-app/session-bundle

第二步:启用 Bundle

@H_304_54@<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new SensioBundleBuzzBundleSensioBuzzBundle(),
        new SncRedisBundleSncRedisBundle(),
        new WechatAppSessionBundleWechatAppSessionBundle(),
        // ...
    );
}

第三步:配置依赖 Bundle

相关依赖的深入配置,请参考其对应的文档。

@H_406_97@第四步:配置
# app/config/config.yML
snc_redis:
    clients:
        default:
            type: PRedis
            alias: default
            dsn: "redis://passwd@localhost"

wechat_app_session:
    app_id:     "wx66666"   # 小程序的app id
    app_secret: "wx*****"   # 小程序的app secret
    key_prefix: "wx-user:"  # Redis中,用户信息的key前缀

第五步:使用

在安装和配置完成之后,Bundle 的功能马上就可以投入使用了,该 Bundle 只会对实现了 WechatApp/SessionBundle/Controller/SessionAuthController 接口的控制器生效,对其他不是用于处理小程序请求的接口不会有影响。

处理流程请参照腾讯云提供的@L_512_8@。

下面举个例子:

// src/DemoBundle/Controller/DemoController.php
namespace DemoBundleController;

use AppBundleControllerBaseController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyComponentHttpFoundationRequest;
use WechatAppSessionBundleControllerSessionAuthController;

/**
 * @Route("/demo")
 */
class DemoController extends Controller implements SessionAuthController
{
    /**
     * @Route("/test")
     */
    public function testAction(Request $request) 
    {
        // 从 Request 的 header 的属性中获取当前请求的微信用户信息
        $wxUser = $request->attributes->get('wx_user');
        return $this->json($wxUser);
    }
}

访问上面 action 对应的路由,将返回一个包含用户信息 json,大致是:

{
  "nickName": "MJ",
  "gender": 1,
  "language": "zh_CN",
  "city": "Zhuhai",
  "province": "Guangdong",
  "country": "CN",
  "avatarUrl": "头像URL",
  "openId": "owVxxxxxxxxxxx"
}

此时登入到 Redis 中:

keys *
1) "wx-user:session:xxxxxxxxxxx"
2) "wx-user:code:owVxxxxxxxxxxx"
  • wx-user:code:*** 维护用户 openid 对应的 session

  • wx-user:session:*** 保存着对应于前者的用户信息

以上两个 key 都设置了过期时间,目前定为7200秒。

以上是后端接口部分的使用,小程序端的部分相对来说比较简单

  • 在首次获取用户信息的时候,需要调用 wx.LOGinwx.getUserInfo 接口,把获取到的 coderawDatasignature 一同设置到 wx.request 接口的 header 中,设置时,有特定的名称,分别是 X-WX-CodeX-WX-RawDataX-WX-signature

  • 接口返回非200的 HTTP 状态码时,请查看接口返回的提示信息,若请求成功,则会返回你自己编写的接口所返回的信息

该 Bundle 暂时没有提供小程序端的部分,小程序端的实现可以参考上面的说明去自行实现,或借鉴腾讯云官方提供的一个实现方式,记住,是借鉴而不是照搬,因为这个 Bundle 并非是为了搭配腾讯云提供的实现方案的,另外要注意的是,其小程序端的实现方式只实现了 wx.request 接口的包装,而关于文件上传、WebSocket 的实现都还没有包装,使用时还是需要考虑自己完善其他请求的包装。

脚本宝典总结

以上是脚本宝典为你收集整理的微信小程序之会话处理全部内容,希望文章能够帮你解决微信小程序之会话处理所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。