V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  PHP

如何通过 PHP 删除在微信内置浏览器中用 Javascript 创建的 cookie?

  •  
  •   haiyang416 · 218 天前 · 2027 次点击
    这是一个创建于 218 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个微信商城类的项目,用户浏览页面的时候可以通过点击加号和减号按钮添加和删除商品。
    购物车的数据都是使用 document.cookie 写入 cookies 里面的。
    现在需要通过 PHP 在后端清空购物车的数据,完成的代码在 Chrome 和 Firefox 等浏览器都可以正常工作,唯独微信内置浏览器(安卓版)不管怎么设置 cookie 过期时间都没有任何作用, Google 了一下相关的关键词,也没有找到什么有价值的内容。
    目前已陷入僵局,请问各位有没有遇到类似的问题,最后是怎么解决的?
    第 1 条附言  ·  216 天前
    @Mitt @iot 问题暂时解决了,最后还是把 cookie 的操作放到前端去了。先把页面应该有的商品的编号放到一个 js 数组里,在页面加载完毕之后直接删除所有未在编号数组里的商品。

    感谢帮助分析问题的朋友们。

    另外,并是不是所有商城都需要统计购物车数据和推荐算法的,结帖。
    33 回复  |  直到 2017-04-16 06:08:26 +08:00
        1
    gouchaoer   218 天前 via Android
    x5 的 bug ? x5 还有一些别的 bug 来着。。。
        2
    cxbig   218 天前
    简单来说不能有效操作对方 cookies 的话,放 server 端处理行不行?

    我们的项目比较复杂,都是专有 API 处理添加删除操作,返回更新的的购物车信息。
    各种税、打折等计算都是 server 端完成的。
        3
    haiyang416   218 天前 via Android
    @gouchaoer 搜索结果都说是 x5 的问题,不过我也不太确定。

    @cxbig 这个代码是同事以前写的,数据都放到 cookie 里面,现在这个不是主要需求,全部重写的话时间上来不及,如果实在没办法,也只能先挂起以后再改了。
        4
    yangqi   218 天前
    实在不行就把键值写为空呗
        5
    haiyang416   218 天前 via Android
    @yangqi 也试过,没用。
        6
    shiny   218 天前
    确定 path/domain 之类的都一致?
        7
    yangqi   218 天前
    @haiyang416 随便写的无效的值也不行?那最开始是怎么赋值的
        8
    haiyang416   218 天前 via Android
    @yangqi 都是直接在页面上直接用 document. cookie 操作的,后端目前只是读取 $_COOKIE 获得对应的值。
        9
    haiyang416   218 天前 via Android
    @shiny 嗯,专门看过, domain 和 path 都没错,电脑上的各种浏览器都没有问题。
    唯独微信完全不理会 setcookie 设置的内容。
        10
    lcorange   218 天前
    这样呢,再写个新接口,针对微信是设置 cookie 内容,微信的话就多发几次请求,对整体业务没影响
        11
    guokeke   218 天前 via Android
    返回段 js 代码如何?
        12
    jarlyyn   218 天前
    实在不行把购物车放 session 里呗
        13
    Mitt   218 天前
    实在没辙就临时在前端删 cookie 咯 应该是 BUG 或者 “特性”
        14
    greatonce   218 天前
    document.cookie 是在客户端执行的, php 设置 cookie 是在服务端执行的,

    后端 php 先在服务器上解析运行完,把客户端代码返回给浏览器,在浏览器中执行客户端代码,

    你顺序弄错了, php 怎么也不会处理的了客户端设置的 cookie 。
        15
    Mitt   218 天前
    @greatonce cookie 是可以被服务端返回同名 cookie 覆盖掉的 比如服务器把 cookie 时间设置成以前的时间 就会使 cookie 到期而被删除 而提交时带的那个 cookie 都是带了 session 的 这个一般也是服务端返回来的
        16
    Mitt   218 天前
    @Mitt 纠正一点 不是提交时带的 cookie 脑子不好使了。
        17
    greatonce   218 天前
    @Mitt 当然可以同名

    服务端设置的 cookie 是从 HTTP header 中设置的,

    而浏览器 document.cookie 是在页面的脚本里面设置的,

    浏览器接收到一个 response 的时候会先处理 HTTP header ,(也就是在这里浏览器会根据 response header 设置各种参数,包括 cookie )

    然后解析 DOM 和运行 js 脚本,(其中也包括对 document.cookie 的处理)

    这两个顺序不一样, HTTP header 在先(也就是 php 的服务端在先), js 的 document.cookie 在后,你在服务端的设置覆盖不了客户端的设置,

    至于里面说在其它浏览器里可以做到,可能是浏览器解析的时候没有用你服务端给的过期时间,不同的浏览器版本会有不同的差异


    -----



    解决这个问题,我不知道楼主具体是在用什么样的环境,不知道为什么客户端的购物车为什么要用 cookie 存储商品,为什么不提交到服务端,或者在用第三方的系统,如果你有权限处理客户端,可以用 localStorage
        18
    slixurd   218 天前   ♥ 1
    @greatonce
    客户端保存购物车状态是很正常的实现吧
    否则服务器就是有状态的,既然有状态,要么服务器自己在内存存着,要么通过其他存储来实现,例如数据库 /KV
    当然也有的电商就是保存在服务器的,可以实现各端共享购物车......
        19
    Mitt   218 天前
    @greatonce 你可能理解错了。 他本地操作 cookie 是有条件的 比如 你点击加入购物车以后添加 cookie 并不是访问页面就会加 cookie 所以并不会发生冲突
        20
    cnwtex   218 天前
    ∵ 我相信微信不会蠢到出这种 bug
    ∴ 楼主自己蠢
        21
    greatonce   218 天前
    @Mitt 我没有说 “有冲突” 啊,只是后一个操作会覆盖之前的操作。

    服务端之前设置的 cookie ,在客户端页面上可以被重新设置一个值覆盖掉。
        22
    greatonce   218 天前   ♥ 1
    @slixurd 保存在客户端肯定不是一个好的方案,就算你的应用只支持一个客户端,也不是好的方法,

    就像你说的客户端有很多种,你只在安卓手机的客户端里添加了商品,打开 ios 发现没有这个商品了,

    就算支持一个客户端,那天你的商品下架了,而你客户端里还显示这个商品可以购买,而不提示已经下架,

    当用户支付的时候发现根本买不了,这种用户体验很不好,这种肯定是放到服务端的,所以不清楚是什么需求,为什么这么做。
        23
    Mitt   218 天前 via iPhone
    @greatonce 然而服务器保存只有多端需求才会有 单端本地 cookie 就足够了 至于商品下架 参考淘宝 你存的只是 id 购物车显示的时候服务器返回商品状态就是了
        24
    iot   218 天前   ♥ 1
    我以前本地存储数据时候是有 localStorage 用 localStorage, 没有才用 cookie

    x5 应该支持 localStorage 吧,并且和 cookie 的接口一样 get put remove clear
        25
    Mitt   218 天前   ♥ 1
    @greatonce 我觉得你自己的观点或者表述有点问题 你刚开始说 "php 怎么也不会处理的了客户端设置的 cookie 。" 我回复了可以通过同名 cookie 达到覆盖和删除的效果 而你后面反驳我的观点 我又补充了"客户端添加 cookie 是有条件的: 添加购物车操作才会添加 cookie" 再到后面又说 "服务端之前设置的 cookie ,在客户端页面上可以被重新设置一个值覆盖掉。" 你的观点有点矛盾 或者说你还是没理解我说的 只是纯属在反驳我的观点 希望能看一下刚开始的问题和回答 不要继续歪下去

    ------

    现在就是在客户端不会立即重新覆盖 cookie 的情况下 服务端返回的 cookie 无法完成覆盖和删除的操作 只发生在微信内置浏览器里 所以微信内置浏览器有 BUG 就成了可能性之一 LZ 说这个是以前同事写的 所以现在就是想以“最简单”的方式去解决这个问题 所以提那么多后端解决方案明显不符合简单的概念啊
        26
    Mitt   218 天前
    @haiyang416 可以尝试不要将值设为空 而是设为一个其他值 看看本地有没有改变 cookie 值
        27
    greatonce   218 天前
    @Mitt

    我之前说的

    “你顺序弄错了, php 怎么也不会处理的了客户端设置的 cookie 。”

    我说这句的时候是有前置条件,就是 “顺序弄错了”

    header 返回的 cookie 客户端能不能改掉?

    而你只看后面那句 “ php 怎么也不会处理客户端设置的 cookie ”
        28
    shew2356   218 天前
    域没用对吧!
        29
    Mitt   218 天前
    @greatonce 在我这边看来 我认为你第一句 “你顺序弄错了” 已经否定了 “添加购物车才会添加 cookie ” 这个前置条件 所以 话题终止 吃了文化的亏 (逃
        30
    pubby   218 天前 via Android
    是不是微信的问题,你在页面上同样用 js 删 cookie ,在微信里试试就知道啊
        31
    reus   218 天前
    不放服务器端,怎么做统计?怎么根据浏览记录、加购物车记录做推荐?
        32
    iot   216 天前
        33
    haiyang416   216 天前 via Android
    @Mitt @iot 问题暂时解决了,最后还是把 cookie 的操作放到前端去了。先把页面应该有的商品的编号放到一个 js 数组里,在页面加载完毕之后直接删除所有未在编号数组里的商品。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1598 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 58ms · UTC 06:35 · PVG 14:35 · LAX 22:35 · JFK 01:35
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1