package com.jfinal.weixin.iot.api; import java.util.List; import com.jfinal.kit.Kv; import com.jfinal.weixin.sdk.api.AccessTokenApi; import com.jfinal.weixin.sdk.api.ApiResult; import com.jfinal.weixin.sdk.utils.HttpUtils; import com.jfinal.weixin.sdk.utils.JsonUtils; /** * 设备相关 API *

* http://iot.weixin.qq.com/wiki/new/index.html?page=3-4-3 * 下的API为设备相关API, 测试号可以调用,正式服务号需要申请权限后才能调用。 *

*/ public class DeviceApi { private static final String TransMsgUrl = "https://api.weixin.qq.com/device/transmsg?access_token=ACCESS_TOKEN"; private static final String AuthorizeUrl = "https://api.weixin.qq.com/device/authorize_device?access_token=ACCESS_TOKEN"; private static final String CreateQrcode = "https://api.weixin.qq.com/device/create_qrcode?access_token=ACCESS_TOKEN"; private static final String CreateQrcodeNew ="https://api.weixin.qq.com/device/getqrcode?access_token=ACCESS_TOKEN&product_id=PRODUCT_ID"; private static final String GetStatUrl = "https://api.weixin.qq.com/device/get_stat?access_token=ACCESS_TOKEN&device_id=DEVICE_ID"; private static final String VerifyQrcodeUrl = "https://api.weixin.qq.com/device/verify_qrcode?access_token=ACCESS_TOKEN"; private static final String GetOpenidUrl = "https://api.weixin.qq.com/device/get_openid?access_token=ACCESS_TOKEN&device_type=DEVICE_TYPE&device_id=DEVICE_ID"; private static final String bindUrl ="https://api.weixin.qq.com/device/bind?access_token=ACCESS_TOKEN"; private static final String unbindUrl ="https://api.weixin.qq.com/device/unbind?access_token=ACCESS_TOKEN"; private static final String compelbindUrl ="https://api.weixin.qq.com/device/compel_bind?access_token=ACCESS_TOKEN"; /** * 向设备推送消息 * * @param deviceType 设备类型,目前为“公众账号原始ID” * @param deviceID 设备ID * @param openID 微信用户账号的openid * @param content 消息内容,BASE64编码 * @return {ApiResult} */ public ApiResult transMsg(String deviceType, String deviceID, String openID, String content) { Kv data = Kv.by("device_type", deviceType); data.set("device_id", deviceID); data.set("open_id", openID); data.set("content", content); String url = TransMsgUrl.replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.post(url, JsonUtils.toJson(data))); } /** * 根据设备id获取二维码生成串 * @param deviceIds 设备id集合 * @return {ApiResult} */ public ApiResult createQrcode(List deviceIds) { Kv data = Kv.by("device_num", deviceIds.size()); data.set("device_id_list", deviceIds); String url = CreateQrcode.replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.post(url, JsonUtils.toJson(data))); } /** * 根据product_id获取设备id和二维码生成串 * @param productId 产品Id * @return {ApiResult} */ public ApiResult createQrcodeNew(String productId) { String url = CreateQrcodeNew.replace("ACCESS_TOKEN",AccessTokenApi.getAccessTokenStr()).replace("PRODUCT_ID", productId); return new ApiResult(HttpUtils.get(url)); } /** * 绑定 * @param tikect 二维码生成串 * @param deviceid 设备id * @param openid 微信用户账号的openid * @return {ApiResult} */ public ApiResult bind(String tikect, String deviceid, String openid) { Kv data = Kv.by("ticket", tikect); data.set("device_id", deviceid); data.set("openid", openid); String url = bindUrl.replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.post(url, JsonUtils.toJson(data))); } /** * 强制绑定 * @param deviceid 设备id * @param openid 微信用户账号的openid * @return {ApiResult} */ public ApiResult compelBind(String deviceid, String openid) { Kv data = Kv.by("device_id", deviceid); data.set("openid", openid); String url = compelbindUrl.replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.post(url, JsonUtils.toJson(data))); } /** * 解绑 * @param tikect 二维码生成串 * @param deviceid 设备id * @param openid 微信用户账号的openid * @return {ApiResult} */ public ApiResult unbind(String tikect, String deviceid, String openid) { Kv data = Kv.by("ticket", tikect); data.set("device_id", deviceid); data.set("openid", openid); String url = unbindUrl.replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.post(url, JsonUtils.toJson(data))); } /** * 批量授权/更新设备属性 *

* 授权后设备才能进行绑定操作 * * @param devices * 设备属性列表 * @param isCreate * 是否首次授权: true 首次授权; false 更新设备属性 * @param productId 商品id * @return {ApiResult} */ public ApiResult authorize(List devices, boolean isCreate, String productId) { Kv data = Kv.by("device_num", String.valueOf(devices.size())); data.set("op_type", isCreate ? "0" : "1");// 请求操作的类型 0:设备授权(缺省值为0) 1:设备更新(更新已授权设备的各属性值) data.set("product_id", productId); data.set("device_list", devices); String url = AuthorizeUrl.replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); System.out.println(JsonUtils.toJson(data)); return new ApiResult(HttpUtils.post(url, JsonUtils.toJson(data))); } /** * 设备状态查询 * * @param deviceId 设备Id * *

* status 0:未授权 1:已经授权(尚未被用户绑定) 2:已经被用户绑定 * {"errcode":0,"errmsg":"ok","status":1,"status_info":"authorized"} *

* @return {ApiResult} */ public ApiResult getStat(String deviceId) { String url = GetStatUrl.replace("DEVICE_ID", deviceId) .replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.get(url)); } /** * 验证二维码 获取二维码对应设备属性 * * @param ticket * 二维码生成串 * @return {ApiResult} */ public ApiResult verifyQrcode(String ticket) { Kv data = Kv.by("ticket", ticket); String url = VerifyQrcodeUrl.replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.post(url, JsonUtils.toJson(data))); } /** * 根据设备类型和设备id查询绑定的openid * @param deviceType 设备类型,目前为“公众账号原始ID” * @param deviceId 设备ID * @return {ApiResult} */ public ApiResult getOpenId(String deviceType, String deviceId) { String url = GetOpenidUrl.replace("DEVICE_TYPE", deviceType) .replace("DEVICE_ID", deviceId) .replace("ACCESS_TOKEN", AccessTokenApi.getAccessTokenStr()); return new ApiResult(HttpUtils.get(url)); } }