index.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. 'use strict';
  2. const {
  3. PlatformType,
  4. ErrorCodeType
  5. } = require('./consts.js')
  6. const {
  7. AppConfig
  8. } = require('./config.js')
  9. const {
  10. Storage,
  11. Factory
  12. } = require('./storage.js')
  13. const {
  14. BridgeError
  15. } = require('./bridge-error.js')
  16. const {
  17. WeixinServer
  18. } = require('./weixin-server.js')
  19. const appConfig = new AppConfig()
  20. class AccessToken extends Storage {
  21. constructor() {
  22. super('access-token', ['dcloudAppid', 'platform'])
  23. }
  24. async fallback(parameters) {
  25. const oauthConfig = appConfig.get(parameters.dcloudAppid, parameters.platform)
  26. let methodName
  27. if (parameters.platform === PlatformType.WEIXIN_MP) {
  28. methodName = 'GetMPAccessTokenData'
  29. } else if (parameters.platform === PlatformType.WEIXIN_H5) {
  30. methodName = 'GetH5AccessTokenData'
  31. } else {
  32. throw new BridgeError(ErrorCodeType.SYSTEM_ERROR, "platform invalid")
  33. }
  34. const responseData = await WeixinServer[methodName](oauthConfig)
  35. const duration = responseData.expires_in || (60 * 60 * 2)
  36. delete responseData.expires_in
  37. return {
  38. value: responseData,
  39. duration
  40. }
  41. }
  42. }
  43. class UserAccessToken extends Storage {
  44. constructor() {
  45. super('user-access-token', ['dcloudAppid', 'platform', 'openid'])
  46. }
  47. }
  48. class SessionKey extends Storage {
  49. constructor() {
  50. super('session-key', ['dcloudAppid', 'platform', 'openid'])
  51. }
  52. }
  53. class Encryptkey extends Storage {
  54. constructor() {
  55. super('encrypt-key', ['dcloudAppid', 'platform', 'openid'])
  56. }
  57. getKeyString(key) {
  58. return `${super.getKeyString(key)}-${key.version}`
  59. }
  60. getExpiresIn(value) {
  61. if (value <= 0) {
  62. return 60
  63. }
  64. return value
  65. }
  66. async fallback(parameters) {
  67. const accessToken = await Factory.Get(AccessToken, parameters)
  68. const userSession = await Factory.Get(SessionKey, parameters)
  69. const responseData = await WeixinServer.GetUserEncryptKeyData({
  70. openid: parameters.openid,
  71. access_token: accessToken.access_token,
  72. session_key: userSession.session_key
  73. })
  74. const keyInfo = responseData.key_info_list.find((item) => {
  75. return item.version = parameters.version
  76. })
  77. const value = {
  78. encrypt_key: keyInfo.encrypt_key,
  79. iv: keyInfo.iv
  80. }
  81. return {
  82. value,
  83. duration: keyInfo.expire_in
  84. }
  85. }
  86. }
  87. class Ticket extends Storage {
  88. constructor() {
  89. super('ticket', ['dcloudAppid', 'platform'])
  90. }
  91. async fallback(parameters) {
  92. const accessToken = await Factory.Get(AccessToken, {
  93. dcloudAppid: parameters.dcloudAppid,
  94. platform: PlatformType.WEIXIN_H5
  95. })
  96. const responseData = await WeixinServer.GetH5TicketData(accessToken)
  97. const duration = responseData.expires_in || (60 * 60 * 2)
  98. delete responseData.expires_in
  99. delete responseData.errcode
  100. delete responseData.errmsg
  101. return {
  102. value: responseData,
  103. duration
  104. }
  105. }
  106. }
  107. // exports
  108. async function getAccessToken(key, fallback) {
  109. return await Factory.Get(AccessToken, key, fallback)
  110. }
  111. async function setAccessToken(key, value, expiresIn) {
  112. await Factory.Set(AccessToken, key, value, expiresIn)
  113. }
  114. async function removeAccessToken(key) {
  115. await Factory.Remove(AccessToken, key)
  116. }
  117. async function getUserAccessToken(key, fallback) {
  118. return await Factory.Get(UserAccessToken, key, fallback)
  119. }
  120. async function setUserAccessToken(key, value, expiresIn) {
  121. await Factory.Set(UserAccessToken, key, value, expiresIn)
  122. }
  123. async function removeUserAccessToken(key) {
  124. await Factory.Remove(UserAccessToken, key)
  125. }
  126. async function getSessionKey(key, fallback) {
  127. return await Factory.Get(SessionKey, key, fallback)
  128. }
  129. async function setSessionKey(key, value, expiresIn) {
  130. await Factory.Set(SessionKey, key, value, expiresIn)
  131. }
  132. async function removeSessionKey(key) {
  133. await Factory.Remove(SessionKey, key)
  134. }
  135. async function getEncryptKey(key, fallback) {
  136. return await Factory.Get(Encryptkey, key, fallback)
  137. }
  138. async function setEncryptKey(key, value, expiresIn) {
  139. await Factory.Set(Encryptkey, key, value, expiresIn)
  140. }
  141. async function removeEncryptKey(key) {
  142. await Factory.Remove(Encryptkey, key)
  143. }
  144. async function getTicket(key, fallback) {
  145. return await Factory.Get(Ticket, key, fallback)
  146. }
  147. async function setTicket(key, value, expiresIn) {
  148. await Factory.Set(Ticket, key, value, expiresIn)
  149. }
  150. async function removeTicket(key) {
  151. await Factory.Remove(Ticket, key)
  152. }
  153. module.exports = {
  154. getAccessToken,
  155. setAccessToken,
  156. removeAccessToken,
  157. getUserAccessToken,
  158. setUserAccessToken,
  159. removeUserAccessToken,
  160. getSessionKey,
  161. setSessionKey,
  162. removeSessionKey,
  163. getEncryptKey,
  164. setEncryptKey,
  165. removeEncryptKey,
  166. getTicket,
  167. setTicket,
  168. removeTicket,
  169. PlatformType,
  170. WeixinServer,
  171. ErrorCodeType
  172. }