最近搞了一下微信的企业号接口, 遇到一些坑, 记录一下.主要是 Python 的,还有微信的强迫症

2016-05-28 23:21:19 +08:00
 ipconfiger
企业号的接口如果是用 GET 请求的都好办, 如果是 POST 请求的就坑了爹了, 首先用 requests 去 post json 格式的 body 的时候, 用 data 参数传进去字典由它自己 dumps 出来的 json, 属性用的单引号, 不知微信出于什么原因, 不识别单引号的 json 数据, 囧. 然后的问题是 Python 的, 用 json.dumps 出来的确实是双引号了, 但是只要内容里有\\u54c8\\u54c8 这样子的内容, 就会立即报错, 说不支持这样子的字符串, 但是无论是 json.dumps 还是 simplejson.dumps, 还是 ujson, 都是完全一个德性.
比如:
In [6]: import json
In [7]: d=dict(key="哈哈")
In [8]: json.dumps(d)
Out[8]: '{"key": "\\u54c8\\u54c8"}'

In [9]: d=dict(key=u"哈哈")
In [10]: json.dumps(d)
Out[10]: '{"key": "\\u54c8\\u54c8"}'

In [11]: d=dict(key=u"哈哈".encode('utf8'))
In [12]: json.dumps(d)
Out[12]: '{"key": "\\u54c8\\u54c8"}'

坊间传闻微信内部全是C++开发后台, 就这个情况看到还真是这样子的
3813 次点击
所在节点    分享发现
7 条回复
just4test
2016-05-29 10:25:36 +08:00
编码指定为 Unicode 可不可以解决中文转义的问题?
jerry
2016-05-29 14:58:48 +08:00
json.dumps 添加参数 ensure_ascii=False 解决中文转义, JSON 语法本身就要需求双引号吧
dofine
2016-05-29 15:16:09 +08:00
ensure_ascii=False 呀
ipconfiger
2016-05-29 18:03:45 +08:00
@dofine
@jerry
后来想起这茬了, but, 单引号的问题, requests.post 里确实输出的单引号, 不知道是不是有参数可以解决
wzxjohn
2016-05-29 23:27:51 +08:00
@ipconfiger Json 的规范要求的是不允许用单引号的哦。。。这个锅确实不是微信的。。。
ipconfiger
2016-05-30 00:21:19 +08:00
@wzxjohn 那么就是 flask 的锅咯, 讨论谁的锅意义不大, 记录下来只是方便后面踩坑的人更容易出坑而已
xuzequn
2017-06-07 11:06:52 +08:00
现在使用 ensure_ascii=False 后,请求的返回会报错,'ascii' codec can't encode characters in position 22-25: ordinal not in range(128), 改成 ensure_ascii=True,就正确了能通过微信企业号发送中文消息了。

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

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

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

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

© 2021 V2EX