首页 新闻 会员 周边 捐助

微信,重复提交的问题

0
悬赏园豆:50 [已解决问题] 解决于 2016-12-29 15:18

一个二维码

二维码地址为:www.xxxx.com/fw?code=11111111111111

这样一个地址,微信扫一扫,跳转到网址,获取到当前访问人的ip及传入的参数code,插入数据库

 

很简单的一个逻辑,因为要看记录,所以要记录每次的扫描记录(刷新记录也算,允许多次扫)

现在的问题是:扫一次,出现两个ip,插入了两条记录,数据存储方式

id   ip                                 code                 result

1   192.168.1.65                11111111         正确

2    163.535.254.245          11111111         重复

3    ip地址                           2222222          正确

搜索帮助:

https://blog.fishlee.net/2016/07/07/double-request-from-wechat-client-with-ajax/

简单点说就是微信浏览器会把一个请求分发出去1/N个(偶尔,并不是每次都会),就会出现中转服务器的ip地址,插入错误数据

 

 

不严而彧的主页 不严而彧 | 初学一级 | 园豆:22
提问于:2016-12-26 17:14
< >
分享
最佳答案
1

看了你的搜索帮助,里面有人提到换用Get方式,不知道你的功能是不是一定得用Post,如果不是用Get试试看;如果非要用Post,试试抓取浏览器请求的头部,看看中转服务器和发送请求的客户IP是不是在Header上有区别,有的话就是判断那个是客户IP的依据;

另外,不知道是你打错还是啥,第二个IP怎么还能是163.535.254.245,这个535是什么情况?是你打错的话当我没说,不是的话那不就很清楚了吗?

收获园豆:50
letcafe | 菜鸟二级 |园豆:434 | 2016-12-26 18:21

首先感谢你的回答,ip那个我随便打的,不要纠结这个问题

判断请求头我也想到,不过不知具体操作啊

不严而彧 | 园豆:22 (初学一级) | 2016-12-27 09:44
其他回答(5)
0

所以呢你要达到的目的是什么.数据库同一个code只能插入一次吗?

吴瑞祥 | 园豆:29449 (高人七级) | 2016-12-26 17:45

是我描述的不清楚么?

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 09:43

@不严而彧: 是的.你并没有说你的目的.或者说问题.

你只是说了一种情况.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-12-27 09:51

@吴瑞祥: 一条数据可以重复插入,应该是访问一次插入一次,不限制,现在的问题是访问一次插入两次,搜索帮助的链接有说明,也有分析为什么会出现这个问题

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 10:07

@不严而彧: 那你有没有办法区分出不同的访问?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-12-27 13:39

@吴瑞祥: 并没有

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 17:00
0

微信请求去重处理。微信请求不是有一个timestamp字段么。用这个去重。

czd890 | 园豆:14488 (专家六级) | 2016-12-26 19:07

你没理解我的意思

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 10:05

@不严而彧:  看了你提供的搜索帮助:。

你说ajax就ajax嘛。扫描二维码是微信后端服务器通知。问题要说清楚。

微信上表示没有碰到这个问题哎...难道是姿势哪里不对...可以抓一下useragent看看是那几款手机或者版本有这个问题

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2016-12-27 10:22

@calvinK: 如果是我姿势不对,难道我贴出来的搜索帮助那个大神姿势也不对?这个跟ajax没有任何关系,我扫描二维码,就会跳转到当前二维码的url里面,现在跳转到这个url一个触发,会有分发到服务器,多插入一条记录。

不知道是我说的不清楚还是你理解有问题,如果我说的不够清楚,那贴出来的url别人也有描述,如果两个你都没读懂,那我要好好想下到底是谁的问题了

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 16:55

你理解错我我说的意思了。在你修改问题前,没说清楚到你服务器的请求是什么请求。

1.是微信服务器扫二维码通知请求,还是二维码跳转请求,还是二维码所代码的页面的ajax请求。

2.我在开发应用中没碰到发链接里面的double 请求的请看。

3.可以记录一下所有请求的useragent,并统计看看是那几款手机或者版本有这个问题。根据搜索帮助里的说法

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2016-12-27 17:07

如果这个现象不能解决,确实如搜索帮助里说的,可能是某些设备的问题。那你可以统计出来,把这部分特征数据排序掉即可。

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2016-12-27 17:10

@calvinK:我的理解也是获取请求头,如果是分发出来的,我就不插入数据,恩,理论上这样是可行的,我试试

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 17:19

@不严而彧: 现在的微信就是当年的IE6.各种sb

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2016-12-27 17:20
0

微信文档明确说过,为保证消息的送达会出现多次请求。

而每次请求都有prime key:timestamp

CaiYongji | 园豆:1267 (小虾三级) | 2016-12-27 10:07

据我了解和timestamp并没有关系,可能我了解的不够,还望不吝赐教

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 16:57
0

当后台服务器没有即使反应的情况,微信服务器会发送多次请求,如果你要保存某种数据只有一条,你可以第二次做修改,然后标记请求次数,或者你就让数据冗余,这个都要看你的设计了

全力以赴001 | 园豆:629 (小虾三级) | 2016-12-27 16:56

数据存储方式

id   ip                                 code                 result

1   192.168.1.65                11111111         正确

2    163.535.254.245          11111111         重复

3    ip地址                           2222222          正确

 

说明一条数据可以保存多条,现在就是让数据冗余

因为我要记录当前扫的是多少次,所以每次扫之前我都要查询当前这个二维码被扫了多少次,那么问题就来了,因为微信会分发,扫描一次很有可能会记录两条数据,那我第二次扫,就会显示这是第三次扫描了

支持(0) 反对(0) 不严而彧 | 园豆:22 (初学一级) | 2016-12-27 16:59

@不严而彧: 微信是这样的,每次扫描不能确定到底发送了几次请求,但是能确定最大重试次数,

你可以根据这个设计一个一个叫时间的字段,对与同一个ip,在某个时间中,他是有效的数据,你进行修改就可以了。这样可以保证数据最大的准确性了

支持(0) 反对(0) 全力以赴001 | 园豆:629 (小虾三级) | 2016-12-27 17:21
0

判断了请求头,目前还在测试,不知能否最后解决

NameValueCollection nc=Request.ServerVariables;
            var key = nc["HTTP_ACCEPT"];
            if ((!string.IsNullOrEmpty(key)) && (!key.ToUpper().Contains("TEXT/HTML")))

不严而彧 | 园豆:22 (初学一级) | 2016-12-29 15:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册