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

2017-04-13 21:40:51 +08:00
 haiyang416
一个微信商城类的项目,用户浏览页面的时候可以通过点击加号和减号按钮添加和删除商品。
购物车的数据都是使用 document.cookie 写入 cookies 里面的。
现在需要通过 PHP 在后端清空购物车的数据,完成的代码在 Chrome 和 Firefox 等浏览器都可以正常工作,唯独微信内置浏览器(安卓版)不管怎么设置 cookie 过期时间都没有任何作用, Google 了一下相关的关键词,也没有找到什么有价值的内容。
目前已陷入僵局,请问各位有没有遇到类似的问题,最后是怎么解决的?
5149 次点击
所在节点    PHP
33 条回复
gouchaoer
2017-04-13 21:48:28 +08:00
x5 的 bug ? x5 还有一些别的 bug 来着。。。
cxbig
2017-04-13 21:54:47 +08:00
简单来说不能有效操作对方 cookies 的话,放 server 端处理行不行?

我们的项目比较复杂,都是专有 API 处理添加删除操作,返回更新的的购物车信息。
各种税、打折等计算都是 server 端完成的。
haiyang416
2017-04-13 22:02:30 +08:00
@gouchaoer 搜索结果都说是 x5 的问题,不过我也不太确定。

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

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

你顺序弄错了, php 怎么也不会处理的了客户端设置的 cookie 。
Mitt
2017-04-14 00:29:19 +08:00
@greatonce cookie 是可以被服务端返回同名 cookie 覆盖掉的 比如服务器把 cookie 时间设置成以前的时间 就会使 cookie 到期而被删除 而提交时带的那个 cookie 都是带了 session 的 这个一般也是服务端返回来的
Mitt
2017-04-14 00:31:54 +08:00
@Mitt 纠正一点 不是提交时带的 cookie 脑子不好使了。
greatonce
2017-04-14 01:10:18 +08:00
@Mitt 当然可以同名

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

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

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

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

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

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


-----



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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/354709

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX