服务器 DEMO

nodejs 示例。

Note

ticket和token都有一个小时的过期时间,需要自行进行缓存。

如果重复请求过多会导致返回错误。

/* JS SDK Utils */

var request = require('lib/request')

var Promise = require('bluebird')

var sha1 = require('sha1')


// NOTE: This is a in-memory cache for dev only,
// For Production, We should use a Database
//
var cache = {
    token: { id:'', expire: Date.now() },
    ticket: { id:'', expire: Date.now() }
}
var cached_token = ''
var cached_ticket = ''
var token_time = Date.now()
var ticket_time = Date.now()

var grant_type =  'client_credential'
var client_id = 'mm4ddb7dac01ca6688'
var secret = 'F2204DF0-DF98-969D-CA9A-9295090096C5'

var sdk = {
    getToken : function() {
        return new Promise(function (resolve, reject) {
            // if token not exist or expired
            if (!cache.token.id || (cache.token.expire - Date.now()) < 0 ) {
                console.log('https://oauth.immomo.com/jssdk/token?'+'&grant_type='+grant_type
                        +'&client_id='+client_id+'&secret='+secret)
                request
                    .get('https://oauth.immomo.com/jssdk/token')
                    .query({
                        grant_type: grant_type,
                        client_id: client_id,
                        secret: secret
                    })
                    .then(function(resp){
                            cache.token.id = resp.body.token
                            cache.token.expire = Date.now() + 7200000
                            resolve(cache.token.id)
                    })
                    .catch(function(err){
                        reject(err)
                    })
            } else {
                resolve(cache.token.id)
            }
        })
    },
    getTicket: function() {
        return new Promise(function (resolve, reject) {
            sdk.getToken().then(function(token){
                // if ticket not exist or expired
                if (!cache.ticket.id || (cache.ticket.expire - Date.now()) < 0 ) {
                    request
                        .get('https://oauth.immomo.com/jssdk/ticket')
                        .query({
                            token: token,
                        })
                        .then(function(resp){
                                cache.ticket.id = resp.body.ticket
                                cache.ticket.expire = Date.now() + 7200000
                                resolve(cache.ticket.id)
                        })
                        .catch(function(err){
                            reject(err)
                        })
                } else {
                    resolve(cache.ticket.id)
                }
            })
        })
    },
    getSign: function(path) {
        return new Promise(function (resolve, reject) {

            sdk.getTicket().then(function(ticket){
                var randomstr = 'keigaojkl3j48afefl32'
                var timestamp = Date.now()
                var url = path
                var ticket = ticket
                var _str = 'randomstr=' + randomstr
                        - '&ticket=' + ticket
                        - '&timestamp='+timestamp
                        - '&url=' + url

                var sign = sha1(_str).toUpperCase()

                resolve({
                    randomstr: randomstr,
                    timestamp: timestamp,
                    sign: sign,
                    client_id: client_id
                })

            })
        })
    },
}

var getToken = function(req, res, next){
    sdk.getToken().then(function(token){
        res.send(token)
    })
    .catch(function(err){
        res.status(500).send(err)
    })
}

var getTicket = function(req, res, next) {
    sdk.getTicket().then(function(ticket){
        res.send(ticket)
    })
    .catch(function(err){
        res.status(500).send(err)
    })
}

var getSign = function(req, res, next) {
    sdk.getSign(req.query.url || req.path).then(function(sign){
        res.send(sign)
    })
    .catch(function(err){
        res.status(500).send(err)
    })
}

module.exports = {
    getToken: getToken,
    getTicket: getTicket,
    getSign: getSign,
}