wechat.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. const request = require('request')
  2. const sha1 = require('sha1')
  3. // 创建唯一的不重复的随机字符串
  4. function grentNonceStr() {
  5. return Math.random().toString(36).substr(2, 15)
  6. }
  7. // 获取单签时间戳,精确到秒
  8. function grentTimeStamp() {
  9. return parseInt(Date.now() / 1000) + ''
  10. }
  11. // 创建缓存器
  12. function createCache() {
  13. let cache = {}
  14. let cacheTime = 7000 * 1000
  15. return {
  16. get(key) {
  17. return cache[key]
  18. },
  19. set(key, val) {
  20. cache[key] = val
  21. setTimeout(() => delete cache[key], cacheTime)
  22. }
  23. }
  24. }
  25. // 获取access_token 需要参数 appid secret
  26. const getAccessToken = (() => {
  27. let store = createCache()
  28. function getToken(appid, secret) {
  29. let uri = 'https://api.weixin.qq.com/cgi-bin/token?' +
  30. 'grant_type=client_credential&appid=' + appid +
  31. '&secret=' + secret;
  32. return new Promise((resolve, reject) => {
  33. request(uri, function (error, response, body) {
  34. if (error) {
  35. reject(error)
  36. } else if (response.statusCode === 200) {
  37. body = JSON.parse(body);
  38. resolve(body.access_token)
  39. } else {
  40. reject(error)
  41. }
  42. })
  43. })
  44. }
  45. return async (appid, secret) => {
  46. if (!store.get(appid)) {
  47. let token = await getToken(appid, secret)
  48. store.set(appid, token)
  49. }
  50. return store.get(appid)
  51. }
  52. })();
  53. // 获取ticket 需要参数access_token
  54. const getTicket = (() => {
  55. let store = createCache()
  56. function getTicket(accessToken) {
  57. let uri = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?' +
  58. 'access_token=' + accessToken + '&type=jsapi';
  59. return new Promise((resolve, reject) => {
  60. request(uri, function (error, response, body) {
  61. if (error) {
  62. reject(error)
  63. } else if (response.statusCode === 200) {
  64. let content = JSON.parse(body);
  65. resolve(content.ticket)
  66. } else {
  67. reject(error)
  68. }
  69. })
  70. })
  71. }
  72. return async (accessToken) => {
  73. if (!store.get(accessToken)) {
  74. let ticket = await getTicket(accessToken)
  75. store.set(accessToken, ticket)
  76. }
  77. return store.get(accessToken)
  78. }
  79. })();
  80. // 获取计算签名
  81. function getSignature(ticket, noncestr, timestamp, url) {
  82. console.log(`jsapi_ticket=${ticket}&noncestr=${noncestr}&timestamp=${timestamp}&url=${url}`)
  83. return sha1(`jsapi_ticket=${ticket}&noncestr=${noncestr}&timestamp=${timestamp}&url=${url}`)
  84. }
  85. module.exports = {
  86. getAccessToken,
  87. getTicket,
  88. getSignature,
  89. grentNonceStr,
  90. grentTimeStamp
  91. }