Bladeren bron

小程序获取设备票据,发送设备消息接口

locky 6 maanden geleden
bovenliggende
commit
2d517e819b

+ 18 - 3
Controller/WeChatMiniProgram/DeviceController.py

@@ -5,7 +5,8 @@ import requests
 from django.views.generic.base import View
 
 from Controller.WeChatMiniProgram.CommonController import CommonObj
-from Object.Enums.WeChatEnum import WeChatMiniProgramAPIEnum
+from Object.Enums.WeChatEnum import WeChatMiniProgramAPIEnum, WeChatMiniProgramConfigEnum
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 
 
@@ -37,10 +38,22 @@ class DeviceView(View):
         @return: res
         """
         uid = request_dict.get('uid', None)
-        model_id = request_dict.get('model_id', None)
-        if not all([uid, model_id]):
+        device_type = request_dict.get('device_type', None)
+        if not all([uid, device_type]):
             return response.json(444)
         try:
+            # 根据设备型号确定model_id
+            model_id = WeChatMiniProgramConfigEnum.ModelIdDict.value['device_type']
+            # 从缓存中获取票据
+            redis_obj = RedisObject()
+            sn_ticket_key = WeChatMiniProgramConfigEnum.SnTicketKey.value
+            sn_ticket = redis_obj.get_data(sn_ticket_key)
+            if sn_ticket:
+                res = {
+                    'sn_ticket': sn_ticket
+                }
+                return response.json(0, res)
+
             access_token = CommonObj.get_access_token()
             url = WeChatMiniProgramAPIEnum.getSnTicketAPI.value.format(access_token)
             data = {
@@ -52,6 +65,8 @@ class DeviceView(View):
             errcode = result.get('errcode')
             assert errcode == 0
             sn_ticket = result['sn_ticket']
+            # 保存到Redis,五分钟有效
+            redis_obj.set_ex_data(key=sn_ticket_key, val=sn_ticket, expire=60*5)
             res = {
                 'sn_ticket': sn_ticket
             }

+ 39 - 0
Controller/WeChatMiniProgram/UserController.py

@@ -37,6 +37,8 @@ class UserView(View):
             return self.get_phone_number(request_dict, response)
         elif operation == 'userLogin':
             return self.user_login(request_dict, response)
+        elif operation == 'sendDeviceMsg':
+            return self.send_device_msg(request_dict, response)
         else:
             user_id = self.check_session_key_and_get_user_id(request)
             if not user_id:
@@ -228,3 +230,40 @@ class UserView(View):
             return response.json(0, res)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def send_device_msg(request_dict, response):
+        """
+        发送设备消息
+        https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/hardware-device/sendHardwareDeviceMessage.html
+        @param request_dict:
+        @param response:
+        @return:
+        """
+        try:
+            access_token = CommonObj.get_access_token()
+            url = WeChatMiniProgramAPIEnum.sendDeviceMsgAPI.value.format(access_token)
+            template_id = ''
+            uid = ''
+            page = ''
+            to_openid_list = []
+            miniprogram_state = 'developer'
+            model_id = ''
+            data = {}
+            lang = 'zh_CN'
+            json = {
+                'template_id': template_id,
+                'sn': uid,
+                'page': page,
+                'to_openid_list': to_openid_list,
+                'miniprogram_state': miniprogram_state,
+                'modelId': model_id,
+                'data': data
+            }
+            r = requests.post(url=url, json=json, timeout=5)
+            result = eval(r.content)
+            errcode = result.get('errcode')
+            assert errcode == 0
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 6 - 1
Object/Enums/WeChatEnum.py

@@ -9,6 +9,10 @@ class WeChatMiniProgramConfigEnum(Enum):
     AppID = 'wx21134afc92f1c08c'
     AppSecret = '4e3758b1f0b2b5514e6f651616ece824'
     AccessTokenKey = 'WeChatMiniProgramAccessToken'
+    SnTicketKey = 'SnTicket'
+    ModelIdDict = {
+        'C520': 'W1ZeridtRlQeo8RIX8vW6g'
+    }
 
 
 @unique
@@ -17,4 +21,5 @@ class WeChatMiniProgramAPIEnum(Enum):
     getPhoneNumberAPI = 'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={}'
     code2SessionAPI = 'https://api.weixin.qq.com/sns/jscode2session'
     checkSessionKeyAPI = 'https://api.weixin.qq.com/wxa/checksession'
-    getSnTicketAPI = 'POST https://api.weixin.qq.com/wxa/getsnticket?access_token={}'
+    getSnTicketAPI = 'https://api.weixin.qq.com/wxa/getsnticket?access_token={}'
+    sendDeviceMsgAPI = 'https://api.weixin.qq.com/cgi-bin/message/device/subscribe/send?access_token={}'