- 调用下单接口,一直报错address error,实在看不出地址哪里有问题
- 期望结果:下单成功
- 调用参数:
{'biz_id': '5941987105',
'cargo': {'count': 2,
'detail_list': [{'count': 2, 'name': '童年小食品发糕'}],
'space_x': 20,
'space_y': 40,
'space_z': 5,
'weight': 0.8},
'delivery_id': 'SF',
'insured': {'insured_value': 0, 'use_insured': 0},
'openid': 'oVkLc4mzzcCQAlnrBBl9banoFMUo',
'order_id': '2018198329849384',
'receiver': {'address': '拱辰街道西洪北街1118号',
'area': '荔城区',
'city': '莆田市',
'country': '中国',
'mobile': '18111111111',
'name': '刘聪',
'province': '福建省'},
'sender': {'address': '学院北路368号名城佳园1号楼1301',
'area': '城厢区',
'city': '莆田市',
'country': '中国',
'name': '曾彬彬',
'province': '福建省',
'tel': '05941110280'},
'service': {'service_name': '顺丰标快', 'service_type': 3},
'shop': {'goods_count': 2,
'goods_name': '童年小食品发糕',
'img_url': 'https://qiniumedia.freelycode.com/vcdn/vt8iqaaq58aa/clientimg/3/project/77c6901d85714dd1b89c4f0c358730fe',
'wxa_path': '/pages/order-detail/order-detail?orderId=1'}}
- 目前返回结果:
{'errmsg': 'delivery logic fail',
'delivery_resultmsg': 'address error',
'errcode': 9300501, 'waybill_data': [],
'delivery_resultcode': 20002}
实在看不出参数有什么问题。另外地址中的name和company如果超过10个字,就会报下面这个错误。对于company公司名称大于10个字的公司,写不到10个字,则名称是错误的,大于10个字,又说参数太长,感觉无解了。
{'errmsg': 'arg size exceed limit hint: [uZBirA05135659]', 'errcode': 9300526}
这个company和name参数,文档上都说长度限制是64个字节,结果11个字就报错了,这是不是一个bug唉?
1、address error,是因为地址信息用的不是UTF8编码。请确认中文都是UTF8编码。
2、company和name长度限制是64字节,而不是64个汉字。
感谢大神抽空回答,不过问题还是没有解决:
1、我对请求中的json字符串整体做了utf-8编码,但是依然返回address error。
2、一个汉字一般是3~4个字节,11个汉字最多就是44个字节,理应没有超过64字节限制的。再者,对于公司名称来说,11个汉字就超出限制了,是否这个限制不太合理?因为公司名称大多数都不止10个字的。
我把sender,receiver参数内容全部改写为英文,依旧address error,这是否可以说明不是编码的问题?另外,这个address error是否太笼统了?错误提示是否可以更加详细一点呢?
线下服务器能请求的吗?为什么我一直报
?
php环境,把所有的数据都变成了utf-8也没有用呢
问题已解决,确实是编码问题,解决方法记录如下,以便其他Pythoner碰到时参考:
1、首先构建请求参数字典,就是像上文中那样的数据结构。假设这个数据结构的变量名为data。
2、然后将字典json化为字符串,但是注意添加参数 ensure_ascii=False。
body
=
json.dumps(data, ensure_ascii
=
False
)
Python中默认JSON字符串都是ascii编码,导致中文会被转化成类似'\u1233'这样的字符串,也就是不再是unicode了,所以后面encode就无效了。
ensure_ascii=False参数使得body保持unicode编码,这样后续的encode才会生效。
3、最后将 body.encode("utf-8") 作为请求体发送给创建订单的接口。