经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python公司内项目对接钉钉审批流程的实现
来源:jb51  时间:2021/8/9 13:56:48  对本文有异议

最近把组内的一个项目对接钉钉审批接口,通过python3.6。

钉钉官方文档

废话不多说了,上代码:

  1. import requests
  2. import json
  3. import time
  4. from dingtalk.crypto import DingTalkCrypto
  5.  
  6. from django.conf import settings
  7. # settings.BASE_DIR
  8.  
  9.  
  10. class Crypto(object):
  11. def __init__(self, token):
  12. # 随便填的字符串
  13. self.token = token
  14. # 自己生成的43位随机字符串
  15. self.aes_key = settings.DINGDING.get("DINGTALK_AES_TOKEN")
  16. # 钉钉企业ID
  17. self.corp_id = settings.DINGDING.get("CorpId") #
  18. print("corp_id:", self.corp_id)
  19. self.nonce = settings.DINGDING.get("nonce")
  20. self.crypto = DingTalkCrypto(
  21. token=self.nonce,
  22. encoding_aes_key=self.aes_key,
  23. corpid_or_suitekey=self.corp_id
  24. )
  25.  
  26. def encrypt_success(self):
  27. # 返回加密success
  28. result = self.crypto.encrypt_message(
  29. msg="success",
  30. nonce=self.nonce,
  31. timestamp=int(time.time()*1000)
  32. )
  33. return result
  34.  
  35.  
  36. class DING(object):
  37. def __init__(self, approve_process):
  38. self.AgentId = settings.DINGDING.get("AgentId")
  39. self.AppKey = settings.DINGDING.get("AppKey")
  40. self.AppSecret = settings.DINGDING.get("AppSecret")
  41. self.dingding_url = settings.DINGDING.get("URL")
  42. self.process_code = settings.DINGDING.get("APPROVE_PROCESS").get(approve_process)['process_code']
  43. self.aes_key = settings.DINGDING.get("DINGTALK_AES_TOKEN")
  44. self.nonce = settings.DINGDING.get("nonce")
  45.  
  46. def get_token(self):
  47. '''
  48. 获取钉钉的token
  49. :return: 钉钉token
  50. '''
  51. url = self.dingding_url + '/gettoken?appkey={}&appsecret={}'.format(self.AppKey, self.AppSecret)
  52. req = requests.get(url)
  53. req = json.loads(req.text)
  54. return req['access_token']
  55.  
  56. # def createCallbackDd():
  57. # '''
  58. # 注册钉钉回调函数
  59. # :return:
  60. # '''
  61. # url = 'https://oapi.dingtalk.com/call_back/register_call_back?access_token=' + self.getToken()
  62. # data = {
  63. # "call_back_tag": ["bpms_task_change", "bpms_instance_change"], #这两个回调种类是审批的
  64. # "token": TOKEN, #自定义的字符串
  65. # "aes_key": AES_KEY, #自定义的43位字符串,密钥
  66. # "url": URL #回调地址
  67. # }
  68. # requests.post(url, data=json.dumps(data))
  69. # return ('OK')
  70.  
  71. def create_process(self, originator_user_id, dept_id, form_component_value_vo, approvers, cc_list, has_cc=0):
  72. '''
  73. 创建钉钉审批
  74. approvers为list 元素为钉钉userid cc_list同理
  75. '''
  76. url = self.dingding_url + '/topapi/processinstance/create?access_token=' + self.get_token()
  77. print("form_component_value_vo:", form_component_value_vo)
  78. if has_cc == 0:
  79. data = {
  80. 'agent_id': self.AgentId,
  81. 'process_code': self.process_code, #工单id
  82. 'originator_user_id': originator_user_id,
  83. 'dept_id': dept_id, #创建人的钉钉部门id
  84. 'form_component_values': str(form_component_value_vo), #钉钉后台配置的需要填写的字段,
  85. 'approvers': approvers,
  86. 'cc_list': cc_list,
  87. 'cc_position': 'START_FINISH' # 发起和完成时与抄送
  88. }
  89. else:
  90. data = {
  91. 'agent_id': self.AgentId,
  92. 'process_code': self.process_code, #工单id
  93. 'originator_user_id': originator_user_id, #创建人的钉钉userid
  94. 'dept_id': dept_id, #创建人的钉钉部门id
  95. 'form_component_values': str(form_component_value_vo), #钉钉后台配置的需要填写的字段,
  96. 'approvers': approvers,
  97. }
  98. print("dingding_utils:", data)
  99. response = requests.post(url, data=data)
  100. return response.json()
  101.  
  102. def get_status(self, process_instance_id):
  103. url = self.dingding_url + '/topapi/processinstance/get?access_token=' + self.get_token()
  104. data = {
  105. "process_instance_id": process_instance_id
  106. }
  107. response = requests.post(url, data=data)
  108. return response.json()
  109.  
  110. def register_callback(self, call_back_url):
  111. # 注册回调
  112. url = self.dingding_url + '/call_back/register_call_back?access_token=' + self.get_token()
  113. print("self.get_token():", self.get_token())
  114. data = {
  115. "call_back_tag": ['bpms_task_change', 'bpms_instance_change'],
  116. "token": self.nonce,
  117. "aes_key": self.aes_key,
  118. "url": call_back_url,
  119. }
  120. response = requests.post(url, data=json.dumps(data))
  121. return response.json()
  122.  
  123. def get_callback(self):
  124. url = self.dingding_url + '/call_back/get_call_back?access_token=' + self.get_token()
  125. req = requests.get(url)
  126. req = json.loads(req.text)
  127. return req
  128.  
  129. def create_process_approver_v2(self, originator_user_id, dept_id, form_component_value_vo, approvers, cc_list):
  130. '''
  131. 创建钉钉审批
  132. '''
  133. url = self.dingding_url + '/topapi/processinstance/create?access_token=' + self.get_token()
  134. data = {
  135. 'agent_id': self.AgentId,
  136. 'process_code': self.process_code,
  137. 'originator_user_id': originator_user_id,
  138. 'dept_id': dept_id,
  139. 'form_component_values': str(form_component_value_vo),
  140. 'approvers_v2': json.dumps(approvers)
  141. }
  142. if cc_list:
  143. data['cc_list'] = cc_list
  144. data['cc_position'] = 'FINISH'
  145.  
  146. response = requests.post(url, data=data)
  147. return response.json()
  148.  
  149. def create_process_approver_v2_test(self, originator_user_id, dept_id, form_component_value_vo):
  150. '''
  151. 创建钉钉审批
  152. '''
  153. url = self.dingding_url + '/topapi/processinstance/create?access_token=' + self.get_token()
  154. data = {
  155. 'agent_id': self.AgentId,
  156. 'process_code': self.process_code,
  157. 'originator_user_id': originator_user_id,
  158. 'dept_id': dept_id,
  159. 'form_component_values': str(form_component_value_vo),
  160. 'approvers_v2': json.dumps([
  161. {
  162. "task_action_type": "NONE",
  163. "user_ids": ["dingding_id"], # 单独审批人
  164. },
  165. {
  166. "task_action_type": "OR",
  167. "user_ids": ["dingding_id1", "dingding_id2"], # 或签
  168. },
  169. {
  170. "task_action_type": "AND",
  171. "user_ids": ["dingding_id1", "dingding_id2"], # 会签
  172. }
  173. ])
  174. }
  175.  
  176. response = requests.post(url, data=data)
  177. return response.json()
  178.  
  179.  
  180. if __name__ == "__main__":
  181.  
  182. import django, os, sys
  183. sys.path.append('xxxxxx') # 项目路径
  184. os.environ['DJANGO_SETTINGS_MODULE'] = 'xx.settings'
  185. # print("settings.DINGDING", settings.DINGDING)
  186. ding = DING("create_xx")
  187. # print(ding.get_token())
  188. # info = [{'name': '单行输入框','value': 'testixxxxxxxx'}]
  189. # # print(ding.create_process('11', 11, info))
  190. a = [
  191. {'name': "输入框1", 'value': "value1"},
  192. {'name': "输入框2", 'value': "value2"},
  193. ]
  194. # print(ding.create_process_test('11', 11, a))
  195. # print(ding.create_process_approver_v2_test('11', 11, a))
  196. # print(ding.create_process_test2())
  197. # print(ding.get_status('xxx'))
  198. print(ding.get_status('xx'))
  199.  
  200. # # 验证 回调
  201. # a = ding.get_token()
  202. # print(a)
  203. # c = Crypto(a)
  204. # print(c.encrypt_success())
  205.  
  206. # 注册回调
  207. # print(ding.register_callback("http://xxxx.vaiwan.com/xxx"))
  208. # print(ding.get_callback())

说明:

  1 Crypto类用于对接钉钉回调用的。一个公司只有一个corpId,并且一个corpid只能注册一个回调地址。我司有公共组注册好了回调。只要接入公司内的回调即可。所以我实际没有使用到Crypto。

  2  在钉钉管理后台中创建应用后会有这三个东西:AgentId、AppKey,AppSecret  。在创建钉钉审批流程,可以从审批流程浏览器中获取到APPROVE_PROCESS。别忘啦给这个流程审批接口权限。这些官方文档有说。

  3  配置setting变量:

  1. DINGDING = {
  2. "AgentId": 123,
  3. "AppKey": "xx",
  4. "AppSecret": "xx",
  5. "URL": "https://oapi.dingtalk.com",
  6. "APPROVE_PROCESS": { # process_code
  7. "create_xx": {
  8. "process_code": "abc", # 审批流程的id
  9. },
  10. "DINGTALK_AES_TOKEN": "abc",
  11. "nonce": "abc",
  12. "CorpId": "abc",
  13. }

 4 接口形式创建的审批流程,与钉钉管理后台创建的流程有一些不同:

    1 不能在不同的审批环节设置不同的抄送人

    2 不能审批流程前后有相同的人,不能自动显示成 “自动同意”(管理后台设置成去重后,但是接口指定审批人场景,不支持)

 5 其他如:审批内容、或签,会签代码里都有示例。

到此这篇关于python公司内项目对接钉钉审批流程的实现的文章就介绍到这了,更多相关python对接钉钉审批内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号