mp-weixin.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <view class="container">
  3. <view class="wechatapp">
  4. <view class="header">
  5. <open-data class="avatar" type="userAvatarUrl"></open-data>
  6. </view>
  7. </view>
  8. <view class="auth-title">申请获取以下权限</view>
  9. <view class="auth-subtitle">获得你的公开信息(昵称、头像等)</view>
  10. <view class="login-btn">
  11. <!-- 获取微信用户信息(旧版已弃用) -->
  12. <!-- <button class="button btn-normal" open-type="getUserInfo" lang="zh_CN" @getuserinfo="getUserInfo">授权登录</button> -->
  13. <!-- 获取微信用户信息(新版) -->
  14. <button class="button btn-normal" @click.stop="getUserProfile">授权登录</button>
  15. </view>
  16. <view class="no-login-btn">
  17. <button class="button btn-normal" @click="handleCancel">暂不登录</button>
  18. </view>
  19. </view>
  20. </template>
  21. <script>
  22. import store from '@/store'
  23. export default {
  24. data() {
  25. return {
  26. // 微信小程序登录凭证 (code)
  27. // 提交到后端,用于换取openid
  28. code: ''
  29. }
  30. },
  31. created() {
  32. // 获取code
  33. // this.getCode()
  34. },
  35. methods: {
  36. // 获取code
  37. // https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
  38. getCode() {
  39. return new Promise((resolve, reject) => {
  40. uni.login({
  41. provider: 'weixin',
  42. success: res => {
  43. console.log('code', res.code)
  44. resolve(res.code)
  45. },
  46. fail: reject
  47. })
  48. })
  49. },
  50. // 获取微信用户信息(新版)
  51. getUserProfile() {
  52. const app = this
  53. wx.canIUse('getUserProfile') && wx.getUserProfile({
  54. lang: 'zh_CN',
  55. desc: '获取用户相关信息',
  56. success({ userInfo }) {
  57. console.log('用户同意了授权')
  58. console.log('userInfo:', userInfo)
  59. // 授权成功事件
  60. app.onAuthSuccess(userInfo)
  61. },
  62. fail() {
  63. console.log('用户拒绝了授权')
  64. }
  65. })
  66. },
  67. // 授权成功事件
  68. // 这里分为两个逻辑:
  69. // 1.将code和userInfo提交到后端,如果存在该用户 则实现自动登录,无需再填写手机号
  70. // 2.如果不存在该用户, 则显示注册页面, 需填写手机号
  71. // 3.如果后端报错了, 则显示错误信息
  72. async onAuthSuccess(userInfo) {
  73. const app = this
  74. // 提交到后端
  75. store.dispatch('MpWxLogin', { code: await app.getCode(), userInfo })
  76. .then(result => {
  77. // 一键登录成功
  78. app.$toast(result.message)
  79. // 跳转回原页面
  80. setTimeout(() => {
  81. app.onNavigateBack()
  82. }, 2000)
  83. })
  84. .catch(err => {
  85. if (err.result.data.showError) {
  86. // 显示错误信息
  87. app.$toast(err.result.message)
  88. } else {
  89. // 将oauth提交给父级
  90. app.onEmitSuccess(userInfo)
  91. }
  92. })
  93. },
  94. // 将oauth提交给父级
  95. // 这里要重新获取code, 因为上一次获取的code不能复用(会报错)
  96. async onEmitSuccess(userInfo) {
  97. const app = this
  98. app.$emit('success', {
  99. oauth: 'MP-WEIXIN', // 第三方登录类型: MP-WEIXIN
  100. code: await app.getCode(), // 微信登录的code, 用于换取openid
  101. userInfo // 微信用户信息
  102. })
  103. },
  104. // /**
  105. // * 授权登录(旧版弃用)
  106. // */
  107. // getUserInfo(e) {
  108. // const app = this
  109. // if (e.detail.errMsg === 'getUserInfo:ok') {
  110. // app.$emit('success', {
  111. // oauth: 'MP-WEIXIN', // 第三方登录类型: MP-WEIXIN
  112. // code: app.code, // 微信登录的code, 用于换取openid
  113. // userInfo: JSON.parse(e.detail.rawData) // 微信用户信息
  114. // })
  115. // }
  116. // },
  117. /**
  118. * 暂不登录
  119. */
  120. handleCancel() {
  121. // 跳转回原页面
  122. this.onNavigateBack()
  123. },
  124. /**
  125. * 授权成功 跳转回原页面
  126. */
  127. onNavigateBack(delta = 1) {
  128. uni.navigateBack({
  129. delta: Number(delta)
  130. })
  131. }
  132. }
  133. }
  134. </script>
  135. <style lang="scss" scoped>
  136. .container {
  137. padding: 0 60rpx;
  138. font-size: 32rpx;
  139. background: #fff;
  140. min-height: 100vh;
  141. }
  142. .wechatapp {
  143. padding: 80rpx 0 48rpx;
  144. border-bottom: 1rpx solid #e3e3e3;
  145. margin-bottom: 72rpx;
  146. text-align: center;
  147. .header {
  148. width: 190rpx;
  149. height: 190rpx;
  150. border: 4rpx solid #fff;
  151. margin: 0 auto 0;
  152. border-radius: 50%;
  153. overflow: hidden;
  154. box-shadow: 2rpx 0 10rpx rgba(50, 50, 50, 0.3);
  155. }
  156. }
  157. .auth-title {
  158. color: #585858;
  159. font-size: 34rpx;
  160. margin-bottom: 40rpx;
  161. }
  162. .auth-subtitle {
  163. color: #888;
  164. margin-bottom: 88rpx;
  165. font-size: 28rpx;
  166. }
  167. .login-btn {
  168. padding: 0 20rpx;
  169. .button {
  170. height: 88rpx;
  171. line-height: 88rpx;
  172. background: #04be01;
  173. color: #fff;
  174. font-size: 30rpx;
  175. border-radius: 999rpx;
  176. text-align: center;
  177. }
  178. }
  179. .no-login-btn {
  180. margin-top: 20rpx;
  181. padding: 0 20rpx;
  182. .button {
  183. height: 88rpx;
  184. line-height: 88rpx;
  185. background: #dfdfdf;
  186. color: #fff;
  187. font-size: 30rpx;
  188. border-radius: 999rpx;
  189. text-align: center;
  190. }
  191. }
  192. </style>