├── .gitignore ├── README.md ├── app.js ├── env.js ├── package.json ├── public ├── javascripts │ └── demo.js └── stylesheets │ └── style.css └── views └── index.jade /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .idea/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simple jsapi demo 2 | 3 | ## awesome project 4 | 5 | ### Getting started 6 | 1. set up your own corp id and corp secret in env.js 7 | 2. public/javascript/demo.js rocks! 8 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by liqiao on 8/10/15. 3 | */ 4 | 5 | var co = require('co'); 6 | var app = require('koa')(); 7 | var route = require('koa-route'); 8 | var logger = require('koa-logger'); 9 | var serve = require('koa-static'); 10 | var jade = require("koa-jade"); 11 | 12 | var https = require("https"); 13 | var querystring = require('querystring'); 14 | var url = require('url'); 15 | var crypto = require('crypto'); 16 | 17 | 18 | const OAPI_HOST = 'https://oapi.dingtalk.com'; 19 | const corpId = require('./env').corpId; 20 | const secret = require('./env').secret; 21 | 22 | 23 | app.use(logger()); 24 | 25 | app.use(serve('public')); 26 | 27 | app.use(jade.middleware({ 28 | viewPath: __dirname + '/views', 29 | })); 30 | 31 | app.use(route.get('/', function *(next) { 32 | var nonceStr = 'abcdefg'; 33 | var timeStamp = new Date().getTime(); 34 | var signedUrl = decodeURIComponent(this.href); 35 | 36 | function g() { 37 | return co(function *() { 38 | var accessToken = (yield invoke('/gettoken', {corpid: corpId, corpsecret: secret}))['access_token']; 39 | var ticket = (yield invoke('/get_jsapi_ticket', {type: 'jsapi', access_token: accessToken}))['ticket']; 40 | var signature = sign({ 41 | nonceStr: nonceStr, 42 | timeStamp: timeStamp, 43 | url: signedUrl, 44 | ticket: ticket 45 | }); 46 | return { 47 | signature: signature, 48 | nonceStr: nonceStr, 49 | timeStamp: timeStamp, 50 | corpId: corpId 51 | }; 52 | }).catch(function(err) { 53 | console.log(err); 54 | }); 55 | } 56 | 57 | this.render('index', { 58 | title: 'Here we go...', 59 | config: JSON.stringify(yield g()), 60 | }, true); 61 | })); 62 | 63 | app.listen(3001); 64 | 65 | 66 | function invoke(path, params) { 67 | return function(cb) { 68 | https.get(OAPI_HOST + path + '?' + querystring.stringify(params), function(res) { 69 | if (res.statusCode === 200) { 70 | var body = ''; 71 | res.on('data', function (data) { 72 | body += data; 73 | }).on('end', function () { 74 | var result = JSON.parse(body); 75 | if (result && 0 === result.errcode) { 76 | cb(null, result); 77 | } 78 | else { 79 | cb(result); 80 | } 81 | }); 82 | } 83 | else { 84 | cb(new Error(response.statusCode)); 85 | } 86 | }).on('error', function(e) { 87 | cb(e); 88 | }); 89 | } 90 | } 91 | 92 | function sign(params) { 93 | var origUrl = params.url; 94 | var origUrlObj = url.parse(origUrl); 95 | delete origUrlObj['hash']; 96 | var newUrl = url.format(origUrlObj); 97 | var plain = 'jsapi_ticket=' + params.ticket + 98 | '&noncestr=' + params.nonceStr + 99 | '×tamp=' + params.timeStamp + 100 | '&url=' + newUrl; 101 | 102 | console.log(plain); 103 | var sha1 = crypto.createHash('sha1'); 104 | sha1.update(plain, 'utf8'); 105 | var signature = sha1.digest('hex'); 106 | console.log('signature: ' + signature); 107 | return signature; 108 | } 109 | -------------------------------------------------------------------------------- /env.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by liqiao on 8/10/15. 3 | */ 4 | 5 | module.exports = { 6 | corpId: '', 7 | secret: '' 8 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsapi-demo", 3 | "version": "0.0.1", 4 | "private": true, 5 | "dependencies": { 6 | "koa": "~0.21.0", 7 | "koa-route": "~2.4.2", 8 | "koa-static": "~1.4.9", 9 | "koa-logger": "~1.3.0", 10 | "koa-jade": "1.1.0" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /public/javascripts/demo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by liqiao on 8/10/15. 3 | */ 4 | 5 | /** 6 | * _config comes from server-side template. see views/index.jade 7 | */ 8 | dd.config({ 9 | agentId: '', 10 | corpId: _config.corpId, 11 | timeStamp: _config.timeStamp, 12 | nonceStr: _config.nonceStr, 13 | signature: _config.signature, 14 | jsApiList: ['device.notification.confirm', 15 | 'device.notification.alert', 16 | 'device.notification.prompt', 17 | 'biz.chat.chooseConversation', 18 | 'biz.ding.post'] 19 | }); 20 | 21 | dd.ready(function() { 22 | alert('dd ready'); 23 | 24 | document.addEventListener('pause', function() { 25 | alert('pause'); 26 | }); 27 | 28 | document.addEventListener('resume', function() { 29 | alert('resume'); 30 | }); 31 | 32 | var head = document.querySelector('h1'); 33 | head.innerHTML = head.innerHTML + ' It rocks!'; 34 | 35 | dd.device.notification.alert({ 36 | message: 'dd.device.notification.alert', 37 | title: 'This is title', 38 | buttonName: 'button', 39 | onSuccess: function(data) { 40 | alert('win: ' + JSON.stringify(data)); 41 | }, 42 | onFail: function(err) { 43 | alert('fail: ' + JSON.stringify(err)); 44 | } 45 | }); 46 | }); 47 | 48 | dd.error(function(err) { 49 | alert('dd error: ' + JSON.stringify(err)); 50 | }); 51 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | 10 | .log-i { 11 | color: green; 12 | } 13 | 14 | .log-e { 15 | color: red; 16 | } 17 | 18 | .tag { 19 | display: inline-block; 20 | width: 170px; 21 | } 22 | 23 | .api { 24 | display: inline-block; 25 | width: 300px; 26 | } 27 | 28 | .hidden { 29 | display: none; 30 | } -------------------------------------------------------------------------------- /views/index.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= 'jsapi demo' 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | script(type="text/javascript") var _config = !{config}; 7 | script(type='text/javascript', src='http://g.alicdn.com/ilw/ding/0.3.8/scripts/dingtalk.js') 8 | script(type='text/javascript', src='/javascripts/demo.js') 9 | body 10 | h1= title --------------------------------------------------------------------------------