美文网首页
【nodejs】网易云信短信接入&融云IM-token获

【nodejs】网易云信短信接入&融云IM-token获

作者: 懒先森 | 来源:发表于2017-03-04 10:52 被阅读1594次

网易云信短信接口签名生成方法

短信接入文档

1.配置

在网易云信管理中心->应用管理->自己的应用里查看appkey和appsecret

Paste_Image.png
'sms':{
        appSecret:"xxxxxxxxxxxxx",
        appKey:"xxxxxxxxxxxxxx"
    }

2.生成签名

需要三样东西来生成签名

  • 密钥 appSecret
  • 随机字符串 nonce
  • 时间戳 CurTime
//生成随机字符串 借用微信的
const createNonceStr = function () {
    return Math.random().toString(36).substr(2, 15);
};
// 生成时间戳 秒值 借用微信的
const createTimestamp = function () {
    return parseInt(new Date().getTime() / 1000) + "";
};
//进行SHA1哈希计算,转化成16进制字符 这里用的库为jshashes
const generateSHA1SignatureByHex = (appSecret, nonce, timestamp) => {
    const sha1Str = appSecret + nonce + timestamp;
    const SHA1 = new Hashes.SHA1().hex(sha1Str)
    return SHA1;
}

可以不局限于这些生成方法 只要是满足位数条件都可以 比如生成随机字符串 可以用chance库也很不错,SHA1也有不少库digitalbazaar/forgeh2non/jshashes

3.拼请求参数

//可以写个业务方法包裹一下 或者直接在拼装header的方法散写也可以
const generateSignatureForCode = () => {
    const appSecret = Config.sms.appSecret;
    const Nonce = createNonceStr();
    const CurTime = createTimestamp();
    const SHA1 = Util.generateSHA1SignatureByHex(appSecret,Nonce,CurTime)
    return {
        Nonce:Nonce,
        CurTime:CurTime,
        SHA1:SHA1
    };
}
// 拼装请求头
const getRequestSmsHeaders = function () {

    const appkey = Config.sms.appKey;
    const SHA1 = Util.generateSignatureForCode({
        appsecret: Config.sms.appSecret,
    })
    return {
        'Content-Type': "application/x-www-form-urlencoded;charset=utf-8",
        'AppKey': appKey, //开发者平台分配的appkey 别写错了
        'Nonce': Nonce,
        'CurTime': CurTime,
        'CheckSum': SHA1
    }
}

4.发送请求

// 这里使用的request库 当然其他的随意
const requestService = function (options) {
    return new Promise(function (resolve, reject) {
        request(options, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                var info = JSON.parse(body);
                resolve(info)
            } else {
                reject(error);
            }
        });
    })
}

//返回值
出错情况最多的:
{ code: 414, msg: 'checksum' } 
文档里解释这是签名参数出错 但不是签名算法的问题 检查一下appKey appSecret的属性拼写
成功:
{ code: 200, msg: '1410', obj: '2846' }
obj为验证码
Paste_Image.png

融云IM-TOKEN方法

如法炮制,把请求头改成符合他条件的就好
文档 融云文档真是比网易的强太多

const getRequestHeaders = function () {

    const appkey = Config.im.appKey;
    const appSecret = Config.im.appSecret;
    const Nonce = Util.createNonceStr();
    const Timestamp = Util.createTimestamp();
    const SHA1HEX = Util.generateSHA1SignatureByHex(appSecret, Nonce, Timestamp);
    return {
        'Content-Type': "application/x-www-form-urlencoded;charset=utf-8",
        'App-Key': appkey, //开发者平台分配的appkey
        'Nonce': Nonce,
        'Timestamp': Timestamp,
        'Signature': SHA1HEX
    }
}
const request = require('request')
const Hashes = require('jshashes')
const SmsCode = require("../util/codes")
const Config = require("../config/")
const Util = require("../util/")
const CommonModel = require("../model/common")


const generateSignatureForCode = () => {
    const appSecret = Config.sms.appSecret;
    const Nonce = Util.createNonceStr();
    const CurTime = Util.createTimestamp();
    const SHA1 = Util.generateSHA1SignatureByHex(appSecret, Nonce, CurTime)
    return {
        Nonce: Nonce,
        CurTime: CurTime,
        SHA1: SHA1
    };
}

const getRequestSmsHeaders = function () {

    const appKey = Config.sms.appKey;
    const SignatureInfo = generateSignatureForCode()
    return {
        'Content-Type': "application/x-www-form-urlencoded;charset=utf-8",
        'AppKey': appKey, //开发者平台分配的appkey
        'Nonce': SignatureInfo.Nonce,
        'CurTime': SignatureInfo.CurTime,
        'CheckSum': SignatureInfo.SHA1
    }
}


const sendcode = async function (query) {
    let mobile = query.mobile;
    if ("register" == query.type||"bind"==query.type) {
        let _result = await CommonModel.findOne("auth", {
            where: {
                indentity_type: "1", //密码注册
                indentifier: mobile
            }
        });

        let _checkMobileResult = await CommonModel.findOne("user", {
            where: {
                mobile: mobile
            }
        });
        if (!!_result || !!_checkMobileResult) {
            return {
                status: false,
                code: -1,
                msg: "手机号已经被绑定或注册~"
            };
        }
    }


    let _resBody = {};
    let _reqUrl = "https://api.netease.im/sms/sendcode.action";
    let _reqHeaders = getRequestSmsHeaders();
    let options = {
        url: _reqUrl,
        method: "POST",
        headers: _reqHeaders,
        form: {
            templateid: 3041014,
            mobile: mobile
        }
    };
    let _res = await Util.requestService(options);
    switch (_res.code) {
        case 200:
            _resBody = {
                status: true,
                code: 0,
                msg: "发送成功",
                data: {
                    code: _res.obj,
                }
            }
            break;
        case 404:
            _resBody = {
                status: false,
                code: 100400,
                msg: "验证码过期"
            }
            break;
        case 414:
            _resBody = {
                status: false,
                code: 100414,
                msg: "缺少参数"
            }
            break;
        case 416:
            _resBody = {
                status: false,
                code: 100416,
                msg: "您发的太快啦"
            }
            break;
        case 500:
            _resBody = {
                status: false,
                code: 100500,
                msg: "短信收发服务故障"
            }
            break;
        case 413:
            _resBody = {
                status: false,
                code: 100413,
                msg: "短信验证失败"
            }
            break;
        default:
            _resBody = {
                status: false,
                code: -1,
                msg: SmsCode[_res.code] || "未知错误"
            }
            break;
    }


    return _resBody;
}

const verifycode = async function (query) {
    let mobile = query.mobile;
    let code = query.code;
    let _resBody = {};

    let _reqUrl = "https://api.netease.im/sms/verifycode.action";
    let _reqHeaders = getRequestSmsHeaders();
    let options = {
        url: _reqUrl,
        method: "POST",
        headers: _reqHeaders,
        form: {
            mobile: mobile,
            code: code
        }
    };
    let _res = await Util.requestService(options);
    switch (_res.code) {
        case 200:
            _resBody = {
                status: true,
                code: 0,
                msg: "校验成功"
            }
            break;
        case 404:
            _resBody = {
                status: false,
                code: 100400,
                msg: "验证码过期"
            }
            break;
        case 414:
            _resBody = {
                status: false,
                code: 100414,
                msg: "缺少参数"
            }
            break;
        case 416:
            _resBody = {
                status: false,
                code: 100416,
                msg: "您发的太快啦"
            }
            break;
        case 500:
            _resBody = {
                status: false,
                code: 100500,
                msg: "短信收发服务故障"
            }
            break;
        case 413:
            _resBody = {
                status: false,
                code: 100413,
                msg: "短信验证失败"
            }
            break;
        default:
            _resBody = {
                status: false,
                code: -1,
                msg: SmsCode[_res.code] || "未知错误"
            }
            break;
    }
    return _resBody;
}

const actionMap = {
    sendcode: sendcode,
    verifycode: verifycode
}


const handleAction = async(ctx, next) => {
    let req = ctx.request.fields || ctx.request.query;
    let action = req.action;

    let _resBody = await actionMap[action].call(ctx, req);

    ctx.body = _resBody;
    return next()
}


module.exports = {
    handleAction,
    sendcode,
    verifycode
}

相关文章

  • 【nodejs】网易云信短信接入&融云IM-token获

    网易云信短信接口签名生成方法 短信接入文档 1.配置 在网易云信管理中心->应用管理->自己的应用里查看appke...

  • 网易云短信android接入

    想要在安卓中使用HttpClient.jar包,记得不要用外部jar包,安卓自己有,如果用外部的话会产生错误。 想...

  • 网易云信Demo接入红包详细流程--iOS

    网易云信金融魔方红包接入文档v2.0 一、文档说明 基于网易云信的IM,接入金融魔方IM红包SDK实现App快速集...

  • 主流互联网第三方服务商

    即时通讯 「融云」 「环信」 「网易云信」 推送 「极光推送」、「阿里云」、「个推」、「腾讯云」 支付 「微信支...

  • iOS IM即时通讯-[融云] [网易云信]简单集成聊天界面

    前言 IM即时通讯. 对于iOS开发, 融云, 环信, 网易云信, 都是还不错的选择. 作者今天就以 融云, 网...

  • 接入融云

    一,在融云开发者控制台创建应用 保存app key,app secrect。 二, 导入sdk 三,初始化 在 ....

  • IM平台

    国内的平台:云通信-腾讯云云信-网易环信融云LeanCloud 中国的阿里百川.云旺阿里悟空极光IMIMSDK云巴...

  • 服务接入设计

    融云即时通讯服务接入可以反推设计微信开发者认证服务接入反推设计

  • 即时通讯

    第一种方式,使用第三方IM服务, 比如: 网易云信、环信、融云、LeanCloud、阿里云、腾讯云、阿里悟空、极光...

  • 第三方即时通信IM服务对比分析

    首发于fxm5547的博客 本次调研网易云信、环信、融云、leancloud和腾讯云通信。阿里的云旺因应用场景及基...

网友评论

      本文标题:【nodejs】网易云信短信接入&融云IM-token获

      本文链接:https://www.haomeiwen.com/subject/supdgttx.html