index.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. const {
  2. callWxOpenApi,
  3. buildUrl
  4. } = require('../normalize')
  5. module.exports = class Auth {
  6. constructor (options) {
  7. this.options = Object.assign({
  8. baseUrl: 'https://api.weixin.qq.com',
  9. timeout: 5000
  10. }, options)
  11. }
  12. async _requestWxOpenapi ({ name, url, data, options }) {
  13. const defaultOptions = {
  14. method: 'GET',
  15. dataType: 'json',
  16. dataAsQueryString: true,
  17. timeout: this.options.timeout
  18. }
  19. const result = await callWxOpenApi({
  20. name: `auth.${name}`,
  21. url: `${this.options.baseUrl}${buildUrl(url, data)}`,
  22. data,
  23. options,
  24. defaultOptions
  25. })
  26. return result
  27. }
  28. async code2Session (code) {
  29. const url = '/sns/jscode2session'
  30. const result = await this._requestWxOpenapi({
  31. name: 'code2Session',
  32. url,
  33. data: {
  34. grant_type: 'authorization_code',
  35. appid: this.options.appId,
  36. secret: this.options.secret,
  37. js_code: code
  38. }
  39. })
  40. return result
  41. }
  42. async getOauthAccessToken (code) {
  43. const url = '/sns/oauth2/access_token'
  44. const result = await this._requestWxOpenapi({
  45. name: 'getOauthAccessToken',
  46. url,
  47. data: {
  48. grant_type: 'authorization_code',
  49. appid: this.options.appId,
  50. secret: this.options.secret,
  51. code
  52. }
  53. })
  54. if (result.expiresIn) {
  55. result.expired = Date.now() + result.expiresIn * 1000
  56. // delete result.expiresIn
  57. }
  58. return result
  59. }
  60. async getUserInfo ({
  61. accessToken,
  62. openid
  63. } = {}) {
  64. const url = '/sns/userinfo'
  65. const {
  66. nickname,
  67. headimgurl: avatar
  68. } = await this._requestWxOpenapi({
  69. name: 'getUserInfo',
  70. url,
  71. data: {
  72. accessToken,
  73. openid,
  74. appid: this.options.appId,
  75. secret: this.options.secret,
  76. scope: 'snsapi_userinfo'
  77. }
  78. })
  79. return {
  80. nickname,
  81. avatar
  82. }
  83. }
  84. async getPhoneNumber (accessToken, code) {
  85. const url = `/wxa/business/getuserphonenumber?access_token=${accessToken}`
  86. const { phoneInfo } = await this._requestWxOpenapi({
  87. name: 'getPhoneNumber',
  88. url,
  89. data: {
  90. code
  91. },
  92. options: {
  93. method: 'POST',
  94. dataAsQueryString: false,
  95. headers: {
  96. 'content-type': 'application/json'
  97. }
  98. }
  99. })
  100. return {
  101. purePhoneNumber: phoneInfo.purePhoneNumber
  102. }
  103. }
  104. }