qq.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. const {
  2. userCollection
  3. } = require('../../common/constants')
  4. const {
  5. ERROR
  6. } = require('../../common/error')
  7. function getQQPlatform () {
  8. const platform = this.clientPlatform
  9. switch (platform) {
  10. case 'app':
  11. case 'app-plus':
  12. case 'app-android':
  13. case 'app-ios':
  14. return 'app'
  15. case 'mp-qq':
  16. return 'mp'
  17. default:
  18. throw new Error('Unsupported qq platform')
  19. }
  20. }
  21. async function saveQQUserKey ({
  22. openid,
  23. sessionKey, // QQ小程序用户sessionKey
  24. accessToken, // App端QQ用户accessToken
  25. accessTokenExpired // App端QQ用户accessToken过期时间
  26. } = {}) {
  27. // 微信公众平台、开放平台refreshToken有效期均为30天(微信没有在网络请求里面返回30天这个值,务必注意未来可能出现调整,需及时更新此处逻辑)。
  28. // 此前QQ开放平台有调整过accessToken的过期时间:[access_token有效期由90天缩短至30天](https://wiki.connect.qq.com/%E3%80%90qq%E4%BA%92%E8%81%94%E3%80%91access_token%E6%9C%89%E6%95%88%E6%9C%9F%E8%B0%83%E6%95%B4)
  29. const appId = this.getUniversalClientInfo().appId
  30. const qqPlatform = getQQPlatform.call(this)
  31. const keyObj = {
  32. dcloudAppid: appId,
  33. openid,
  34. platform: 'qq-' + qqPlatform
  35. }
  36. switch (qqPlatform) {
  37. case 'mp':
  38. await this.uniOpenBridge.setSessionKey(keyObj, {
  39. session_key: sessionKey
  40. }, 30 * 24 * 60 * 60)
  41. break
  42. case 'app':
  43. case 'h5':
  44. case 'web':
  45. await this.uniOpenBridge.setUserAccessToken(keyObj, {
  46. access_token: accessToken,
  47. access_token_expired: accessTokenExpired
  48. }, accessTokenExpired
  49. ? Math.floor((accessTokenExpired - Date.now()) / 1000)
  50. : 30 * 24 * 60 * 60
  51. )
  52. break
  53. default:
  54. break
  55. }
  56. }
  57. function generateQQCache ({
  58. sessionKey, // QQ小程序用户sessionKey
  59. accessToken, // App端QQ用户accessToken
  60. accessTokenExpired // App端QQ用户accessToken过期时间
  61. } = {}) {
  62. const platform = getQQPlatform.call(this)
  63. let cache
  64. switch (platform) {
  65. case 'app':
  66. cache = {
  67. access_token: accessToken,
  68. access_token_expired: accessTokenExpired
  69. }
  70. break
  71. case 'mp':
  72. cache = {
  73. session_key: sessionKey
  74. }
  75. break
  76. default:
  77. throw new Error('Unsupported qq platform')
  78. }
  79. return {
  80. third_party: {
  81. [`${platform}_qq`]: cache
  82. }
  83. }
  84. }
  85. function getQQOpenid ({
  86. userRecord
  87. } = {}) {
  88. const qqPlatform = getQQPlatform.call(this)
  89. const appId = this.getUniversalClientInfo().appId
  90. const qqOpenidObj = userRecord.qq_openid
  91. if (!qqOpenidObj) {
  92. return
  93. }
  94. return qqOpenidObj[`${qqPlatform}_${appId}`] || qqOpenidObj[qqPlatform]
  95. }
  96. async function getQQCacheFallback ({
  97. userRecord,
  98. key
  99. } = {}) {
  100. const platform = getQQPlatform.call(this)
  101. const thirdParty = userRecord && userRecord.third_party
  102. if (!thirdParty) {
  103. return
  104. }
  105. const qqCache = thirdParty[`${platform}_qq`]
  106. return qqCache && qqCache[key]
  107. }
  108. async function getQQCache ({
  109. uid,
  110. userRecord,
  111. key
  112. } = {}) {
  113. const qqPlatform = getQQPlatform.call(this)
  114. const appId = this.getUniversalClientInfo().appId
  115. if (!userRecord) {
  116. const getUserRes = await userCollection.doc(uid).get()
  117. userRecord = getUserRes.data[0]
  118. }
  119. if (!userRecord) {
  120. throw {
  121. errCode: ERROR.ACCOUNT_NOT_EXISTS
  122. }
  123. }
  124. const openid = getQQOpenid.call(this, {
  125. userRecord
  126. })
  127. const getCacheMethod = qqPlatform === 'mp' ? 'getSessionKey' : 'getUserAccessToken'
  128. const userKey = await this.uniOpenBridge[getCacheMethod]({
  129. dcloudAppid: appId,
  130. platform: 'qq-' + qqPlatform,
  131. openid
  132. })
  133. if (userKey) {
  134. return userKey[key]
  135. }
  136. return getQQCacheFallback({
  137. userRecord,
  138. key
  139. })
  140. }
  141. module.exports = {
  142. getQQPlatform,
  143. generateQQCache,
  144. getQQCache,
  145. saveQQUserKey
  146. }