auth.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. const WXAPI = require('apifm-wxapi')
  2. import Dialog from '@vant/weapp/dialog/dialog'
  3. async function checkSession(){
  4. return new Promise((resolve, reject) => {
  5. wx.checkSession({
  6. success() {
  7. return resolve(true)
  8. },
  9. fail() {
  10. return resolve(false)
  11. }
  12. })
  13. })
  14. }
  15. // 检测登录状态,返回 true / false
  16. async function checkHasLogined() {
  17. const token = wx.getStorageSync('token')
  18. if (!token) {
  19. return false
  20. }
  21. const loggined = await checkSession()
  22. if (!loggined) {
  23. wx.removeStorageSync('token')
  24. return false
  25. }
  26. const checkTokenRes = await WXAPI.checkToken(token)
  27. if (checkTokenRes.code != 0) {
  28. wx.removeStorageSync('token')
  29. return false
  30. }
  31. return true
  32. }
  33. async function wxaCode(){
  34. return new Promise((resolve, reject) => {
  35. wx.login({
  36. success(res) {
  37. return resolve(res.code)
  38. },
  39. fail() {
  40. wx.showToast({
  41. title: '获取code失败',
  42. icon: 'none'
  43. })
  44. return resolve('获取code失败')
  45. }
  46. })
  47. })
  48. }
  49. async function getUserInfo() {
  50. return new Promise((resolve, reject) => {
  51. wx.getUserInfo({
  52. success: res => {
  53. return resolve(res)
  54. },
  55. fail: err => {
  56. console.error(err)
  57. return resolve()
  58. }
  59. })
  60. })
  61. }
  62. async function login(page){
  63. const _this = this
  64. wx.login({
  65. success: function (res) {
  66. const componentAppid = wx.getStorageSync('componentAppid')
  67. if (componentAppid) {
  68. WXAPI.wxappServiceLogin({
  69. componentAppid,
  70. appid: wx.getStorageSync('appid'),
  71. code: res.code
  72. }).then(function (res) {
  73. if (res.code == 10000) {
  74. // 去注册
  75. //_this.register(page)
  76. return;
  77. }
  78. if (res.code != 0) {
  79. // 登录错误
  80. wx.showModal({
  81. title: '无法登录',
  82. content: res.msg,
  83. showCancel: false
  84. })
  85. return;
  86. }
  87. wx.setStorageSync('token', res.data.token)
  88. wx.setStorageSync('uid', res.data.uid)
  89. if ( page ) {
  90. page.onShow()
  91. }
  92. })
  93. } else {
  94. WXAPI.login_wx(res.code).then(function (res) {
  95. if (res.code == 10000) {
  96. // 去注册
  97. //_this.register(page)
  98. return;
  99. }
  100. if (res.code != 0) {
  101. // 登录错误
  102. wx.showModal({
  103. title: '无法登录',
  104. content: res.msg,
  105. showCancel: false
  106. })
  107. return;
  108. }
  109. wx.setStorageSync('token', res.data.token)
  110. wx.setStorageSync('uid', res.data.uid)
  111. if ( page ) {
  112. page.onShow()
  113. }
  114. })
  115. }
  116. }
  117. })
  118. }
  119. async function register(page) {
  120. let _this = this;
  121. wx.login({
  122. success: function (res) {
  123. let code = res.code; // 微信登录接口返回的 code 参数,下面注册接口需要用到
  124. wx.getUserInfo({
  125. success: function (res) {
  126. let iv = res.iv;
  127. let encryptedData = res.encryptedData;
  128. let referrer = '' // 推荐人
  129. let referrer_storge = wx.getStorageSync('referrer');
  130. if (referrer_storge) {
  131. referrer = referrer_storge;
  132. }
  133. // 下面开始调用注册接口
  134. const componentAppid = wx.getStorageSync('componentAppid')
  135. if (componentAppid) {
  136. WXAPI.wxappServiceRegisterComplex({
  137. componentAppid,
  138. appid: wx.getStorageSync('appid'),
  139. code: code,
  140. encryptedData: encryptedData,
  141. iv: iv,
  142. referrer: referrer
  143. }).then(function (res) {
  144. _this.login(page);
  145. })
  146. } else {
  147. WXAPI.register_complex({
  148. code: code,
  149. encryptedData: encryptedData,
  150. iv: iv,
  151. referrer: referrer
  152. }).then(function (res) {
  153. _this.login(page);
  154. })
  155. }
  156. }
  157. })
  158. }
  159. })
  160. }
  161. async function authorize() {
  162. return new Promise((resolve, reject) => {
  163. wx.login({
  164. success: function (res) {
  165. const code = res.code
  166. let referrer = '' // 推荐人
  167. let referrer_storge = wx.getStorageSync('referrer');
  168. if (referrer_storge) {
  169. referrer = referrer_storge;
  170. }
  171. // 下面开始调用注册接口
  172. const componentAppid = wx.getStorageSync('componentAppid')
  173. if (componentAppid) {
  174. WXAPI.wxappServiceAuthorize({
  175. code: code,
  176. referrer: referrer
  177. }).then(function (res) {
  178. if (res.code == 0) {
  179. wx.setStorageSync('token', res.data.token)
  180. wx.setStorageSync('uid', res.data.uid)
  181. resolve(res)
  182. } else {
  183. wx.showToast({
  184. title: res.msg,
  185. icon: 'none'
  186. })
  187. reject(res.msg)
  188. }
  189. })
  190. } else {
  191. WXAPI.authorize({
  192. code: code,
  193. referrer: referrer
  194. }).then(function (res) {
  195. if (res.code == 0) {
  196. wx.setStorageSync('token', res.data.token)
  197. wx.setStorageSync('uid', res.data.uid)
  198. resolve(res)
  199. } else {
  200. wx.showToast({
  201. title: res.msg,
  202. icon: 'none'
  203. })
  204. reject(res.msg)
  205. }
  206. })
  207. }
  208. },
  209. fail: err => {
  210. reject(err)
  211. }
  212. })
  213. })
  214. }
  215. function loginOut(){
  216. wx.removeStorageSync('token')
  217. wx.removeStorageSync('uid')
  218. }
  219. async function checkAndAuthorize (scope) {
  220. return new Promise((resolve, reject) => {
  221. wx.getSetting({
  222. success(res) {
  223. if (!res.authSetting[scope]) {
  224. wx.authorize({
  225. scope: scope,
  226. success() {
  227. resolve() // 无返回参数
  228. },
  229. fail(e){
  230. console.error(e)
  231. // if (e.errMsg.indexof('auth deny') != -1) {
  232. // wx.showToast({
  233. // title: e.errMsg,
  234. // icon: 'none'
  235. // })
  236. // }
  237. wx.showModal({
  238. title: '无权操作',
  239. content: '需要获得您的授权',
  240. showCancel: false,
  241. confirmText: '立即授权',
  242. confirmColor: '#e64340',
  243. success(res) {
  244. wx.openSetting();
  245. },
  246. fail(e){
  247. console.error(e)
  248. reject(e)
  249. },
  250. })
  251. }
  252. })
  253. } else {
  254. resolve() // 无返回参数
  255. }
  256. },
  257. fail(e){
  258. console.error(e)
  259. reject(e)
  260. }
  261. })
  262. })
  263. }
  264. function openLoginDialog() {
  265. Dialog.confirm({
  266. selector: '#van-dialog-auth-login',
  267. message: '需要登陆后才能继续操作',
  268. confirmButtonText: '立即登陆',
  269. cancelButtonText: '暂不登陆',
  270. confirmButtonOpenType: 'getUserInfo',
  271. lang: 'zh_CN'
  272. }).then(() => {
  273. // Dialog.close()
  274. }).catch(() => {
  275. // Dialog.close()
  276. })
  277. }
  278. module.exports = {
  279. checkHasLogined: checkHasLogined,
  280. wxaCode: wxaCode,
  281. getUserInfo: getUserInfo,
  282. login: login,
  283. register: register,
  284. loginOut: loginOut,
  285. checkAndAuthorize: checkAndAuthorize,
  286. openLoginDialog: openLoginDialog,
  287. authorize: authorize
  288. }