前言
wxpusher 的偶然发现,官方使用java开发作为sdk基础,在此之上,刚入手nodeJS 一个月,借此开发wxpusher-sdk-node。
正文
官方java -sdk 主要封装http请求和请求构造,所以在此之上模仿java sdk 进行独立开发。
java WxPusher源码
package com.zjiecode.wxpusher.client;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.zjiecode.wxpusher.client.bean.CreateQrcodeReq;
import com.zjiecode.wxpusher.client.bean.CreateQrcodeResp;
import com.zjiecode.wxpusher.client.bean.Message;
import com.zjiecode.wxpusher.client.bean.MessageResult;
import com.zjiecode.wxpusher.client.bean.Page;
import com.zjiecode.wxpusher.client.bean.Result;
import com.zjiecode.wxpusher.client.bean.ResultCode;
import com.zjiecode.wxpusher.client.bean.WxUser;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 说明:WxPusher的客户端
* 作者:zjiecode
* 时间:2019-05-03
*/
public final class WxPusher {
private WxPusher() {
}
/**
* 发送消息
*/
public static Result<List<MessageResult>> send(Message message) {
Result result = verify(message);
if (result != null) {
return result;
}
Result sendResult = HttpUtils.post(message, "/api/send/message");
if (sendResult.isSuccess()) {
//转换,方便调用
Object data = sendResult.getData();
String s = JSONObject.toJSONString(data);
List<MessageResult> messageResults = JSONObject.parseObject(s, new TypeReference<List<MessageResult>>() {
});
sendResult.setData(messageResults);
}
return sendResult;
}
/**
* 查询消息发送状态
*/
public static Result queryMessageStatus(Long messageId) {
if (messageId == null || messageId <= 0) {
return new Result(ResultCode.BIZ_FAIL, "messageId为空");
}
return HttpUtils.get(String.format("/api/send/query/%s", messageId));
}
/**
* 创建带参数的app临时二维码
*/
public static Result<CreateQrcodeResp> createAppTempQrcode(CreateQrcodeReq createQrcodeReq) {
Result result = HttpUtils.post(createQrcodeReq, "/api/fun/create/qrcode");
if (result.getData() != null) {
String jsonString = JSONObject.toJSONString(result.getData());
CreateQrcodeResp createQrcodeResp = JSONObject.parseObject(jsonString, CreateQrcodeResp.class);
result.setData(createQrcodeResp);
}
return result;
}
/**
* 查询关注你App的微信用户
*
* @param appToken 应用token
* @param page 页码
* @param pageSize 分页大小
* @return 查询的数据
*/
public static Result<Page<WxUser>> queryWxUser(String appToken, Integer page, Integer pageSize) {
return queryWxUser(appToken, page, pageSize, null);
}
/**
* 查询关注你App的微信用户
*
* @param appToken 应用token
* @param uid 根据UID过滤用户
* @return 查询的数据
*/
public static Result<Page<WxUser>> queryWxUser(String appToken, String uid) {
return queryWxUser(appToken, 1, 1, uid);
}
/**
* 查询关注你App的微信用户
*
* @param appToken 应用token
* @param page 页码
* @param pageSize 分页大小
* @param uid 根据UID过滤用户
* @return 查询的数据
*/
public static Result<Page<WxUser>> queryWxUser(String appToken, Integer page, Integer pageSize, String uid) {
if (appToken == null || appToken.isEmpty()) {
return new Result(ResultCode.BIZ_FAIL, "appToken不能为空");
}
if (page == null || page <= 0) {
return new Result(ResultCode.BIZ_FAIL, "page不合法");
}
if (page == null || page <= 0) {
return new Result(ResultCode.BIZ_FAIL, "pageSize不合法");
}
Map<String, Object> params = new HashMap<>();
params.put("appToken", appToken);
params.put("page", page);
params.put("pageSize", pageSize);
if (uid != null && !uid.isEmpty()) {
params.put("uid", uid);
}
Result result = HttpUtils.get(params, "/api/fun/wxuser");
if (result.getData() != null) {
String jsonString = JSONObject.toJSONString(result.getData());
Page pageData = JSONObject.parseObject(jsonString, new TypeReference<Page<WxUser>>() {
});
result.setData(pageData);
}
return result;
}
/**
* 验证消息合法性,客户端验证比较宽松,主要在服务端进行校验
*/
private static Result verify(Message message) {
if (message == null) {
return new Result(ResultCode.BIZ_FAIL, "消息不能为空");
}
if (message.getAppToken() == null || message.getAppToken().length() <= 0) {
return new Result(ResultCode.BIZ_FAIL, "appToken不能为空");
}
if (message.getContent() == null || message.getContent().length() <= 0) {
return new Result(ResultCode.BIZ_FAIL, "content内容不能为空");
}
return null;
}
}
nodeJS WxPusher源码
const Result = require('./bean/result/Result');
const ResultCode = require('./bean/result/ResultCode');
const HttpUtil = require('./HttpUtil');
/**
* @author ycx
* @description
*/
class WxPusher {
/**
* 发送消息
* @param message {Message}
* @return {Promise<Result>}
*/
static send(message) {
return new Promise(resolve => {
let result = this.verify(message);
if (null !== result) {
resolve(result);
return;
}
HttpUtil.post(message, '/api/send/message', (res) => {
resolve(res);
});
});
}
/**
* 查询消息状态
* @param messageId {number} 消息id
* @return {Promise<Result>}
*/
static queryMessageStatus(messageId) {
return new Promise(resolve => {
if (undefined === messageId || null === messageId || 0 >= messageId) {
resolve(new Result(ResultCode.BIZ_FAIL, "messageId为空"));
return;
}
HttpUtil.get(null, '/api/send/query/' + messageId, (res) => {
resolve(res);
});
});
}
/**
* 创建带参数的app临时二维码
* @param createQrcodeReq {CreateQrcodeReq} qr参数
* @return {Promise<Result<CreateQrcodeResp>>}
*/
static createAppTempQrcode(createQrcodeReq) {
return new Promise(resolve => {
//
HttpUtil.post(createQrcodeReq, '/api/fun/create/qrcode', (res) => {
resolve(res)
});
});
}
/**
* 查询关注你App的微信用户
* @param appToken {string} 应用token
* @param uid {string} 根据UID过滤用户
* @param page {number} 页码
* @param pageSize {number} 页面大小
* @return {Promise<Result<Page<WxUser>>>}
*/
static queryWxUser(appToken, uid, page, pageSize) {
return new Promise(resolve => {
if (undefined === appToken || 0 === appToken.length) {
resolve(new Result(ResultCode.BIZ_FAIL, "appToken不能为空"));
return;
}
if (undefined === page || 0 >= page) {
resolve(new Result(ResultCode.BIZ_FAIL, "page不合法"));
return;
}
if (undefined === pageSize || 0 >= pageSize) {
resolve(new Result(ResultCode.BIZ_FAIL, "pageSize不合法"));
return;
}
//
let dataJson = {
'appToken': appToken,
'page': page,
'pageSize': pageSize,
}
if (undefined !== uid) {
dataJson.uid = uid;
}
HttpUtil.get(dataJson, '/api/fun/wxuser', (res) => {
resolve(res)
})
});
}
/**
*
* 校验数据合法性
* @param message {Message}
* @return {Result | null}
*/
static verify(message) {
if (null === message || undefined === message) {
return new Result(ResultCode.BIZ_FAIL, '消息不能为空');
}
if (null === message.appToken || undefined === message.appToken) {
return new Result(ResultCode.BIZ_FAIL, 'appToken不能为空');
}
if (null === message.content || undefined === message.content) {
return new Result(ResultCode.BIZ_FAIL, 'content不能为空');
}
return null;
}
}
module.exports = WxPusher
结语
ES6语法写出来的code 和JAVA非常相似 ,这大概就是面向对象语言都是一家吧!
一种面向对象语言需要向开发者提供四种基本能力:
- 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
- 聚集 - 把一个对象存储在另一个对象内的能力
- 继承 - 由另一个类(或多个类)得来类的属性和方法的能力
- 多态 - 编写能以多种方法运行的函数或方法的能力