前言

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非常相似 ,这大概就是面向对象语言都是一家吧!

一种面向对象语言需要向开发者提供四种基本能力:

  1. 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
  2. 聚集 - 把一个对象存储在另一个对象内的能力
  3. 继承 - 由另一个类(或多个类)得来类的属性和方法的能力
  4. 多态 - 编写能以多种方法运行的函数或方法的能力