123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- 'use strict';
- const {
- PlatformType,
- ProviderType,
- ErrorCodeType
- } = require('./consts.js')
- const {
- AppConfig
- } = require('./config.js')
- const {
- Storage
- } = require('./storage.js')
- const {
- BridgeError
- } = require('./bridge-error.js')
- const {
- WeixinServer
- } = require('./weixin-server.js')
- const appConfig = new AppConfig()
- class AccessToken extends Storage {
- constructor() {
- super('access-token', ['provider', 'appid'])
- }
- async update(key) {
- super.update(key)
- const result = await this.getByWeixinServer(key)
- return this.set(key, result.value, result.duration)
- }
- async fallback(key) {
- return this.getByWeixinServer(key)
- }
- async getByWeixinServer(key) {
- const oauthConfig = appConfig.get(key.dcloudAppid, key.provider)
- let methodName
- if (key.provider === ProviderType.WEIXIN_MP) {
- methodName = 'GetMPAccessTokenData'
- } else if (key.provider === ProviderType.WEIXIN_H5) {
- methodName = 'GetH5AccessTokenData'
- } else {
- throw new BridgeError(ErrorCodeType.SYSTEM_ERROR, "provider invalid")
- }
- const responseData = await WeixinServer[methodName](oauthConfig)
- const duration = responseData.expires_in || (60 * 60 * 2)
- delete responseData.expires_in
- return {
- value: responseData,
- duration
- }
- }
- }
- class UserAccessToken extends Storage {
- constructor() {
- super('user-access-token', ['provider', 'appid', 'openid'])
- }
- }
- class SessionKey extends Storage {
- constructor() {
- super('session-key', ['provider', 'appid', 'openid'])
- }
- }
- class Encryptkey extends Storage {
- constructor() {
- super('encrypt-key', ['provider', 'appid', 'openid'])
- }
- async update(key) {
- super.update(key)
- const result = await this.getByWeixinServer(key)
- return this.set(key, result.value, result.duration)
- }
- getKeyString(key) {
- return `${super.getKeyString(key)}-${key.version}`
- }
- getExpiresIn(value) {
- if (value <= 0) {
- return 60
- }
- return value
- }
- async fallback(key) {
- return this.getByWeixinServer(key)
- }
- async getByWeixinServer(key) {
- const accessToken = await Factory.Get(AccessToken, key)
- const userSession = await Factory.Get(SessionKey, key)
- const responseData = await WeixinServer.GetUserEncryptKeyData({
- openid: key.openid,
- access_token: accessToken.access_token,
- session_key: userSession.session_key
- })
- const keyInfo = responseData.key_info_list.find((item) => {
- return item.version === key.version
- })
- if (!keyInfo) {
- throw new BridgeError(ErrorCodeType.SYSTEM_ERROR, 'key version invalid')
- }
- const value = {
- encrypt_key: keyInfo.encrypt_key,
- iv: keyInfo.iv
- }
- return {
- value,
- duration: keyInfo.expire_in || (24 * 60 * 60)
- }
- }
- }
- class Ticket extends Storage {
- constructor() {
- super('ticket', ['provider', 'appid'])
- }
- async update(key) {
- super.update(key)
- const result = await this.getByWeixinServer(key)
- return this.set(key, result.value, result.duration)
- }
- async fallback(key) {
- return this.getByWeixinServer(key)
- }
- async getByWeixinServer(key) {
- const accessToken = await Factory.Get(AccessToken, {
- dcloudAppid: key.dcloudAppid,
- provider: ProviderType.WEIXIN_H5
- })
- const responseData = await WeixinServer.GetH5TicketData(accessToken)
- const duration = responseData.expires_in || (60 * 60 * 2)
- delete responseData.expires_in
- delete responseData.errcode
- delete responseData.errmsg
- return {
- value: responseData,
- duration
- }
- }
- }
- const Factory = {
- async Get(T, key, fallback) {
- Factory.FixOldKey(key)
- return Factory.MakeUnique(T).get(key, fallback)
- },
- async Set(T, key, value, expiresIn) {
- Factory.FixOldKey(key)
- return Factory.MakeUnique(T).set(key, value, expiresIn)
- },
- async Remove(T, key) {
- Factory.FixOldKey(key)
- return Factory.MakeUnique(T).remove(key)
- },
- async Update(T, key) {
- Factory.FixOldKey(key)
- return Factory.MakeUnique(T).update(key)
- },
- FixOldKey(key) {
- if (!key.provider) {
- key.provider = key.platform
- }
- const configData = appConfig.get(key.dcloudAppid, key.provider)
- if (!configData) {
- throw new BridgeError(ErrorCodeType.SYSTEM_ERROR, 'appid or provider invalid')
- }
- key.appid = configData.appid
- },
- MakeUnique(T) {
- return new T()
- }
- }
- // exports
- async function getAccessToken(key, fallback) {
- return Factory.Get(AccessToken, key, fallback)
- }
- async function setAccessToken(key, value, expiresIn) {
- return Factory.Set(AccessToken, key, value, expiresIn)
- }
- async function removeAccessToken(key) {
- return Factory.Remove(AccessToken, key)
- }
- async function updateAccessToken(key) {
- return Factory.Update(AccessToken, key)
- }
- async function getUserAccessToken(key, fallback) {
- return Factory.Get(UserAccessToken, key, fallback)
- }
- async function setUserAccessToken(key, value, expiresIn) {
- return Factory.Set(UserAccessToken, key, value, expiresIn)
- }
- async function removeUserAccessToken(key) {
- return Factory.Remove(UserAccessToken, key)
- }
- async function getSessionKey(key, fallback) {
- return Factory.Get(SessionKey, key, fallback)
- }
- async function setSessionKey(key, value, expiresIn) {
- return Factory.Set(SessionKey, key, value, expiresIn)
- }
- async function removeSessionKey(key) {
- return Factory.Remove(SessionKey, key)
- }
- async function getEncryptKey(key, fallback) {
- return Factory.Get(Encryptkey, key, fallback)
- }
- async function setEncryptKey(key, value, expiresIn) {
- return Factory.Set(Encryptkey, key, value, expiresIn)
- }
- async function removeEncryptKey(key) {
- return Factory.Remove(Encryptkey, key)
- }
- async function updateEncryptKey(key) {
- return Factory.Update(Encryptkey, key)
- }
- async function getTicket(key, fallback) {
- return Factory.Get(Ticket, key, fallback)
- }
- async function setTicket(key, value, expiresIn) {
- return Factory.Set(Ticket, key, value, expiresIn)
- }
- async function removeTicket(key) {
- return Factory.Remove(Ticket, key)
- }
- async function updateTicket(key) {
- return Factory.Update(Ticket, key)
- }
- module.exports = {
- getAccessToken,
- setAccessToken,
- removeAccessToken,
- updateAccessToken,
- getUserAccessToken,
- setUserAccessToken,
- removeUserAccessToken,
- getSessionKey,
- setSessionKey,
- removeSessionKey,
- getEncryptKey,
- setEncryptKey,
- removeEncryptKey,
- updateEncryptKey,
- getTicket,
- setTicket,
- removeTicket,
- updateTicket,
- ProviderType,
- PlatformType,
- WeixinServer,
- ErrorCodeType
- }
|