wxa.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import, unicode_literals
  3. from optionaldict import optionaldict
  4. from library.wechatpy.client.api.base import BaseWeChatAPI
  5. class WeChatWxa(BaseWeChatAPI):
  6. API_BASE_URL = 'https://api.weixin.qq.com/'
  7. def create_qrcode(self, path, width=430):
  8. """
  9. 创建小程序二维码(接口C:适用于需要的码数量较少的业务场景)
  10. 详情请参考
  11. https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html
  12. """
  13. return self._post(
  14. 'cgi-bin/wxaapp/createwxaqrcode',
  15. data={
  16. 'path': path,
  17. 'width': width
  18. }
  19. )
  20. def get_wxa_code(self,
  21. path,
  22. width=430,
  23. auto_color=False,
  24. line_color={"r": "0", "g": "0", "b": "0"},
  25. is_hyaline=False):
  26. """
  27. 创建小程序码(接口A: 适用于需要的码数量较少的业务场景)
  28. 详情请参考
  29. https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html
  30. """
  31. return self._post(
  32. 'wxa/getwxacode',
  33. data={
  34. 'path': path,
  35. 'width': width,
  36. 'auto_color': auto_color,
  37. 'line_color': line_color,
  38. 'is_hyaline': is_hyaline,
  39. }
  40. )
  41. def get_wxa_code_unlimited(self,
  42. scene,
  43. width=430,
  44. auto_color=False,
  45. line_color={"r": "0", "g": "0", "b": "0"},
  46. page=None,
  47. is_hyaline=False):
  48. """
  49. 创建小程序码(接口B:适用于需要的码数量极多,或仅临时使用的业务场景)
  50. 详情请参考
  51. https://mp.weixin.qq.com/debug/wxadoc/dev/api/qrcode.html
  52. """
  53. return self._post(
  54. 'wxa/getwxacodeunlimit',
  55. data=optionaldict(
  56. scene=scene,
  57. page=page,
  58. width=width,
  59. auto_color=auto_color,
  60. line_color=line_color,
  61. is_hyaline=is_hyaline,
  62. )
  63. )
  64. def send_template_message(self, user_id, template_id, data, form_id, page=None, color=None, emphasis_keyword=None):
  65. """
  66. 发送模板消息
  67. 详情请参考
  68. https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html
  69. """
  70. tpl_data = optionaldict(
  71. touser=user_id,
  72. template_id=template_id,
  73. page=page,
  74. form_id=form_id,
  75. data=data,
  76. color=color,
  77. emphasis_keyword=emphasis_keyword,
  78. )
  79. return self._post(
  80. 'cgi-bin/message/wxopen/template/send',
  81. data=tpl_data
  82. )
  83. def modify_domain(self, action, request_domain=(), wsrequest_domain=(), upload_domain=(), download_domain=()):
  84. """
  85. 修改小程序服务器授权域名
  86. 详情请参考
  87. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489138143_WPbOO
  88. :param action: 增删改查的操作类型,仅支持 'add', 'delete', 'set', 'get'
  89. :param request_domain: request 合法域名
  90. :param wsrequest_domain: socket 合法域名
  91. :param upload_domain: upload file 合法域名
  92. :param download_domain: download file 合法域名
  93. """
  94. return self._post(
  95. 'wxa/modify_domain',
  96. data={
  97. 'action': action,
  98. 'requestdomain': request_domain,
  99. 'wsrequestdomain': wsrequest_domain,
  100. 'uploaddomain': upload_domain,
  101. 'downloaddomain': download_domain,
  102. }
  103. )
  104. def bind_tester(self, wechat_id):
  105. """
  106. 绑定微信用户成为小程序体验者
  107. 详情请参考
  108. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140588_nVUgx
  109. :param wechat_id: 微信号
  110. """
  111. return self._post(
  112. 'wxa/bind_tester',
  113. data={
  114. 'wechatid': wechat_id,
  115. }
  116. )
  117. def unbind_tester(self, wechat_id):
  118. """
  119. 解除绑定小程序的体验者
  120. 详情请参考
  121. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140588_nVUgx
  122. :param wechat_id: 微信号
  123. """
  124. return self._post(
  125. 'wxa/unbind_tester',
  126. data={
  127. 'wechatid': wechat_id,
  128. }
  129. )
  130. def commit(self, template_id, ext_json, version, description):
  131. """
  132. 为授权的小程序账号上传小程序代码
  133. 详情请参考
  134. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  135. :param template_id: 代码库中的代码模板 ID
  136. :param ext_json: 第三方自定义的配置
  137. :param version: 代码版本号,开发者可自定义
  138. :param description: 代码描述,开发者可自定义
  139. """
  140. return self._post(
  141. 'wxa/commit',
  142. data={
  143. 'template_id': template_id,
  144. 'ext_json': ext_json,
  145. 'user_version': version,
  146. 'user_desc': description,
  147. },
  148. )
  149. def get_qrcode(self):
  150. """
  151. 获取体验小程序的体验二维码
  152. 返回 Response 类型,header 中带有 Content-Type 与 Content-disposition 类型
  153. 详情请参考
  154. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  155. :rtype: requests.Response
  156. """
  157. return self._get('wxa/get_qrcode')
  158. def get_category(self):
  159. """
  160. 获取授权小程序账号的可选类目
  161. 详情请参考
  162. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  163. :rtype: list[dict]
  164. """
  165. return self._get(
  166. 'wxa/get_category',
  167. result_processor=lambda x: x['category_list'],
  168. )
  169. def get_page(self):
  170. """
  171. 获取小程序的第三方提交代码的页面配置
  172. 详情请参考
  173. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  174. :rtype: list
  175. """
  176. return self._get(
  177. 'wxa/get_page',
  178. result_processor=lambda x: x['page_list'],
  179. )
  180. def submit_audit(self, item_list):
  181. """
  182. 将第三方提交的代码包提交审核
  183. 详情请参考
  184. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  185. :param item_list: 提交审核项的一个列表(至少填写1项,至多填写5项)
  186. :type item_list: list[dict]
  187. :return: 审核编号
  188. :rtype: int
  189. """
  190. return self._post(
  191. 'wxa/submit_audit',
  192. data={
  193. 'item_list': item_list,
  194. },
  195. result_processor=lambda x: x['auditid'],
  196. )
  197. def get_audit_status(self, auditid):
  198. """
  199. 查询某个指定版本的审核状态
  200. 详情请参考
  201. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  202. :param auditid: 审核编号
  203. :type auditid: int
  204. :return: 一个包含 status, reason 的 dict。status 0为审核成功,1为审核失败,2为审核中。
  205. """
  206. return self._post(
  207. 'wxa/get_auditstatus',
  208. data={
  209. 'auditid': auditid,
  210. },
  211. )
  212. def get_latest_audit_status(self):
  213. """
  214. 查询最近一次提交的审核状态
  215. 详情请参考
  216. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  217. :return: 一个包含 status, reason, auditid 的 dict。status 0为审核成功,1为审核失败,2为审核中。
  218. """
  219. return self._get(
  220. 'wxa/get_latest_auditstatus'
  221. )
  222. def release(self):
  223. """
  224. 发布已通过审核的小程序
  225. 详情请参考
  226. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  227. """
  228. return self._post(
  229. 'wxa/release',
  230. data={},
  231. )
  232. def change_visit_status(self, close=False):
  233. """
  234. 修改小程序线上代码的可见状态
  235. 详情请参考
  236. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1489140610_Uavc4
  237. :param close: close 为 True 时会关闭小程序线上代码的可见状态。
  238. :type close: bool
  239. """
  240. return self._post(
  241. 'wxa/change_visitstatus',
  242. data={
  243. 'action': 'close' if close else 'open',
  244. },
  245. )
  246. def list_library_templates(self, offset=0, count=20):
  247. """
  248. 获取小程序模板库里,所有模板的ID与标题
  249. 详情请参考
  250. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1500465446_j4CgR
  251. :param offset: 用于分页,表示起始量,最小值为0
  252. :type offset: int
  253. :param count: 用于分页,表示拉取数量,最大值为20
  254. :type count: int
  255. :return: 带有 total_count 与 list 的数据
  256. :rtype: dict
  257. """
  258. return self._post(
  259. 'cgi-bin/wxopen/template/library/list',
  260. data={
  261. 'offset': offset,
  262. 'count': count,
  263. },
  264. )
  265. def get_library_template(self, template_short_id):
  266. """
  267. 获取小程序模板库里,某个模板的详细信息
  268. 详情请参考
  269. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1500465446_j4CgR
  270. :param template_short_id: 模板标题ID
  271. :rtype: dict
  272. """
  273. return self._post(
  274. 'cgi-bin/wxopen/template/library/get',
  275. data={
  276. 'id': template_short_id,
  277. },
  278. )
  279. def list_templates(self, offset=0, count=20):
  280. """
  281. 获取本账号内所有模板
  282. 详情请参考
  283. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1500465446_j4CgR
  284. :param offset: 用于分页,表示起始量,最小值为0
  285. :type offset: int
  286. :param count: 用于分页,表示拉取数量,最大值为20
  287. :type count: int
  288. :return: 模板列表
  289. :rtype: list[dict]
  290. """
  291. return self._post(
  292. 'cgi-bin/wxopen/template/list',
  293. data={
  294. 'offset': offset,
  295. 'count': count,
  296. },
  297. result_processor=lambda x: x['list'],
  298. )
  299. def add_template(self, template_short_id, keyword_id_list):
  300. """
  301. 组合模板,并将其添加至账号下的模板列表里
  302. 详情请参考
  303. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1500465446_j4CgR
  304. :param template_short_id: 模板标题ID
  305. :param keyword_id_list: 按照顺序排列的模板关键词列表,最多10个
  306. :type keyword_id_list: list[int]
  307. :return: 模板ID
  308. """
  309. return self._post(
  310. 'cgi-bin/wxopen/template/add',
  311. data={
  312. 'id': template_short_id,
  313. 'keyword_id_list': keyword_id_list,
  314. },
  315. result_processor=lambda x: x['template_id'],
  316. )
  317. def del_template(self, template_id):
  318. """
  319. 删除本账号内某个模板
  320. 详情请参考
  321. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1500465446_j4CgR
  322. :param template_id: 模板ID
  323. """
  324. return self._post(
  325. 'cgi-bin/wxopen/template/del',
  326. data={
  327. 'template_id': template_id,
  328. },
  329. )
  330. def create_open(self, appid):
  331. """
  332. 创建开放平台账号,并绑定公众号/小程序
  333. 详情请参考
  334. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1498704199_1bcax
  335. :param appid: 授权公众号或小程序的 appid
  336. :return: 开放平台的 appid
  337. """
  338. return self._post(
  339. 'cgi-bin/open/create',
  340. data={
  341. 'appid': appid,
  342. },
  343. result_processor=lambda x: x['open_appid'],
  344. )
  345. def get_open(self, appid):
  346. """
  347. 获取公众号/小程序所绑定的开放平台账号
  348. 详情请参考
  349. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1498704199_1bcax
  350. :param appid: 授权公众号或小程序的 appid
  351. :return: 开放平台的 appid
  352. """
  353. return self._post(
  354. 'cgi-bin/open/get',
  355. data={
  356. 'appid': appid,
  357. },
  358. result_processor=lambda x: x['open_appid'],
  359. )
  360. def bind_open(self, appid, open_appid):
  361. """
  362. 将公众号/小程序绑定到开放平台帐号下
  363. 详情请参考
  364. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1498704199_1bcax
  365. :param appid: 授权公众号或小程序的 appid
  366. :param open_appid: 开放平台帐号 appid
  367. """
  368. return self._post(
  369. 'cgi-bin/open/bind',
  370. data={
  371. 'appid': appid,
  372. 'open_appid': open_appid,
  373. }
  374. )
  375. def unbind_open(self, appid, open_appid):
  376. """
  377. 将公众号/小程序绑定到开放平台帐号下
  378. 详情请参考
  379. https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=open1498704199_1bcax
  380. :param appid: 授权公众号或小程序的 appid
  381. :param open_appid: 开放平台帐号 appid
  382. """
  383. return self._post(
  384. 'cgi-bin/open/unbind',
  385. data={
  386. 'appid': appid,
  387. 'open_appid': open_appid,
  388. }
  389. )
  390. def code_to_session(self, js_code):
  391. """
  392. 登录凭证校验。通过 wx.login() 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见 小程序登录
  393. 详情请参考
  394. https://developers.weixin.qq.com/miniprogram/dev/api/code2Session.html
  395. :param js_code:
  396. :return:
  397. """
  398. return self._get(
  399. 'sns/jscode2session',
  400. params={
  401. 'appid': self.appid,
  402. 'secret': self.secret,
  403. 'js_code': js_code,
  404. 'grant_type': 'authorization_code'
  405. }
  406. )