facebook-login.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <view class="btns_item" @click="handleFacebookLogin">
  3. <view class="btn_icon">
  4. <image src="@/static/login/facebook.png" class="img" mode="widthFix"></image>
  5. </view>
  6. <trans _t="使用脸书登录" />
  7. </view>
  8. </template>
  9. <script setup>
  10. import { ref, onMounted } from 'vue'
  11. import { systemInfo } from "@/utils"
  12. const emit = defineEmits(['success', 'error'])
  13. const platform = ref(systemInfo().uniPlatform)
  14. const isInitialized = ref(false)
  15. // #ifdef H5
  16. // 初始化Facebook登录
  17. const initFacebookAuth = async () => {
  18. if (platform.value === 'web') {
  19. initFacebookSDK()
  20. }
  21. }
  22. const initFacebookSDK = () => {
  23. return new Promise((resolve) => {
  24. if (window.FB) {
  25. isInitialized.value = true
  26. resolve()
  27. return
  28. }
  29. if (window.fbAsyncInit) {
  30. const originalInit = window.fbAsyncInit
  31. window.fbAsyncInit = function () {
  32. originalInit()
  33. isInitialized.value = true
  34. resolve()
  35. }
  36. } else {
  37. window.fbAsyncInit = function () {
  38. FB.init({
  39. appId: '501088503016892',
  40. xfbml: 1,
  41. version: 'v23.0',
  42. autoLogAppEvents: true
  43. })
  44. isInitialized.value = true
  45. resolve()
  46. }
  47. }
  48. if (!document.getElementById('facebook-jssdk')) {
  49. const script = document.createElement('script')
  50. script.id = 'facebook-jssdk'
  51. script.src = 'https://connect.facebook.net/en_US/sdk.js'
  52. script.async = true
  53. script.defer = true
  54. document.body.appendChild(script)
  55. } else {
  56. if (!window.FB) {
  57. const script = document.getElementById('facebook-jssdk')
  58. script.parentNode.removeChild(script)
  59. const newScript = document.createElement('script')
  60. newScript.id = 'facebook-jssdk'
  61. newScript.src = 'https://connect.facebook.net/en_US/sdk.js'
  62. newScript.async = true
  63. newScript.defer = true
  64. document.body.appendChild(newScript)
  65. }
  66. }
  67. })
  68. }
  69. const FacebookLoginInH5 = () => {
  70. FB.login(response => {
  71. if (response.authResponse) {
  72. emit('success', response.authResponse)
  73. } else {
  74. console.log('用户取消登录');
  75. }
  76. }, { scope: 'public_profile,email' });
  77. }
  78. // #endif
  79. // #ifdef APP-PLUS
  80. const FacebookLoginInApp = async () => {
  81. try {
  82. uni.login({
  83. provider: 'facebook',
  84. success: function (loginRes) {
  85. // 登录成功
  86. uni.getUserInfo({
  87. provider: 'facebook',
  88. success: function (info) {
  89. emit('success', info.authResult)
  90. }
  91. })
  92. },
  93. fail: function (err) {
  94. console.log('登录失败:', err);
  95. }
  96. });
  97. } catch (error) {
  98. emit('error', error)
  99. }
  100. }
  101. // #endif
  102. const handleFacebookLogin = async () => {
  103. try {
  104. if (platform.value === 'app') {
  105. await FacebookLoginInApp()
  106. } else if (platform.value === 'web') {
  107. if (!isInitialized.value) {
  108. await initFacebookSdk()
  109. }
  110. await FacebookLoginInH5()
  111. } else {
  112. emit('error', new Error('不支持的平台'))
  113. }
  114. } catch (error) {
  115. emit('error', error)
  116. }
  117. }
  118. onMounted(() => {
  119. // #ifdef H5
  120. initFacebookAuth()
  121. // #endif
  122. })
  123. </script>
  124. <style lang="less" scoped>
  125. @import url('@/style.less');
  126. .btns_item {
  127. .ver();
  128. width: 400rpx;
  129. border: 1px solid var(--black);
  130. border-radius: 100px;
  131. padding: 14rpx 52rpx;
  132. margin-top: 18rpx;
  133. color: var(--text-02);
  134. .size(24rpx);
  135. .btn_icon {
  136. width: 48rpx;
  137. margin-right: 52rpx;
  138. .img {
  139. width: inherit;
  140. display: block;
  141. }
  142. }
  143. }
  144. </style>