miniProgram.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. import third from '@/sheep/api/third';
  2. import $store from '@/sheep/store';
  3. import AuthUtil from '@/sheep/api/member/auth';
  4. const socialType = 34; // 社交类型 - 微信小程序
  5. let sessionId = uni.getStorageSync('sessionId');
  6. let subscribeEventList = [];
  7. // 加载微信小程序
  8. function load() {
  9. checkUpdate();
  10. // const sessionStatus = await checkSession();
  11. // 小程序的接口改动太频繁了 强制每次进入都重新获取
  12. const sessionStatus = false;
  13. if (!sessionStatus) {
  14. getSessionId();
  15. }
  16. getSubscribeTemplate();
  17. }
  18. // 微信小程序静默授权登陆
  19. const login = async () => {
  20. return new Promise(async (resolve, reject) => {
  21. // 1. 获得微信 code
  22. const codeResult = await uni.login();
  23. if (codeResult.errMsg !== 'login:ok') {
  24. return resolve(false);
  25. }
  26. // 2. 社交登录
  27. const loginResult = await AuthUtil.socialLogin(socialType, codeResult.code, 'default');
  28. debugger
  29. if (loginResult.code === 0) {
  30. setOpenid(loginResult.data.openid);
  31. return resolve(true);
  32. } else {
  33. return resolve(false);
  34. }
  35. });
  36. };
  37. // 微信小程序手机号授权登陆
  38. const mobileLogin = async (e) => {
  39. return new Promise(async (resolve, reject) => {
  40. console.log(e.errMsg)
  41. if (e.errMsg !== 'getPhoneNumber:ok') {
  42. return resolve(false);
  43. }
  44. // 1. 获得微信 code
  45. const codeResult = await uni.login();
  46. if (codeResult.errMsg !== 'login:ok') {
  47. return resolve(false);
  48. }
  49. // 2. 一键登录
  50. debugger
  51. const loginResult = await AuthUtil.weixinMiniAppLogin(e.code, codeResult.code, 'default');
  52. if (loginResult.code === 0) {
  53. setOpenid(loginResult.data.openid);
  54. return resolve(true);
  55. } else {
  56. return resolve(false);
  57. }
  58. // TODO 芋艿:shareInfo: uni.getStorageSync('shareLog') || {},
  59. });
  60. };
  61. // 微信小程序绑定
  62. const bind = () => {
  63. return new Promise(async (resolve, reject) => {
  64. const loginRes = await third.wechat.bind({
  65. platform: 'miniProgram',
  66. payload: encodeURIComponent(
  67. JSON.stringify({
  68. sessionId: uni.getStorageSync('sessionId'),
  69. }),
  70. ),
  71. });
  72. if (loginRes.error === -1) {
  73. getSessionId(false);
  74. } else if (loginRes.error === 0) {
  75. resolve(true);
  76. } else {
  77. reject(false);
  78. }
  79. });
  80. };
  81. // 微信小程序解除绑定
  82. const unbind = async () => {
  83. const { error } = await third.wechat.unbind({
  84. platform: 'miniProgram',
  85. });
  86. return !error;
  87. };
  88. // 获取最新sessionId
  89. const getSessionId = async (auto_login = null) => {
  90. // 获取code
  91. let codeStr = '';
  92. const loginResult = await uni.login();
  93. if (loginResult.errMsg === 'login:ok') {
  94. codeStr = loginResult.code;
  95. } else {
  96. getSessionId(auto_login);
  97. return false;
  98. }
  99. if(auto_login === null) {
  100. auto_login = !!($store('app').platform.auto_login && !$store('user').isLogin);
  101. }
  102. const { error, data } = await third.wechat.getSessionId({
  103. platform: 'miniProgram',
  104. payload: encodeURIComponent(
  105. JSON.stringify({
  106. code: codeStr,
  107. auto_login,
  108. }),
  109. ),
  110. });
  111. if (error === 0) {
  112. uni.setStorageSync('sessionId', data.session_id);
  113. return true;
  114. }
  115. return false;
  116. };
  117. // 检查sessionId是否可用
  118. const checkSession = () => {
  119. return new Promise((resolve, reject) => {
  120. if (!sessionId) {
  121. return resolve(false);
  122. }
  123. uni.checkSession({
  124. success() {
  125. return resolve(true);
  126. },
  127. fail() {
  128. uni.removeStorageSync('sessionId');
  129. return resolve(false);
  130. },
  131. });
  132. });
  133. };
  134. // 小程序更新
  135. const checkUpdate = async (silence = true) => {
  136. if (uni.canIUse('getUpdateManager')) {
  137. const updateManager = uni.getUpdateManager();
  138. updateManager.onCheckForUpdate(function (res) {
  139. // 请求完新版本信息的回调
  140. if (res.hasUpdate) {
  141. updateManager.onUpdateReady(function () {
  142. uni.showModal({
  143. title: '更新提示',
  144. content: '新版本已经准备好,是否重启应用?',
  145. success: function (res) {
  146. if (res.confirm) {
  147. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  148. updateManager.applyUpdate();
  149. }
  150. },
  151. });
  152. });
  153. updateManager.onUpdateFailed(function () {
  154. // 新的版本下载失败
  155. // uni.showModal({
  156. // title: '已经有新版本了哟~',
  157. // content: '新版本已经上线啦,请您删除当前小程序,重新搜索打开~',
  158. // });
  159. });
  160. } else {
  161. if (!silence) {
  162. uni.showModal({
  163. title: '当前为最新版本',
  164. showCancel: false,
  165. });
  166. }
  167. }
  168. });
  169. }
  170. };
  171. // 绑定用户手机号
  172. const bindUserPhoneNumber = (e) => {
  173. return new Promise(async (resolve, reject) => {
  174. const { error } = await third.wechat.bindUserPhoneNumber({
  175. platform: 'miniProgram',
  176. payload: encodeURIComponent(
  177. JSON.stringify({
  178. sessionId: uni.getStorageSync('sessionId'),
  179. iv: e.iv,
  180. encryptedData: e.encryptedData,
  181. code: e.code,
  182. }),
  183. ),
  184. });
  185. if (error === 0) {
  186. resolve(true);
  187. }
  188. resolve(false);
  189. });
  190. };
  191. // 获取订阅消息模板
  192. async function getSubscribeTemplate() {
  193. const { error, data } = await third.wechat.subscribeTemplate();
  194. if (error === 0) {
  195. subscribeEventList = data;
  196. }
  197. }
  198. // 订阅消息
  199. function subscribeMessage(event) {
  200. let tmplIds = [];
  201. if (typeof event === 'string') {
  202. tmplIds.push(subscribeEventList[event]);
  203. }
  204. if (typeof event === 'object') {
  205. event.forEach((item) => {
  206. if (typeof subscribeEventList[item] !== 'undefined') tmplIds.push(subscribeEventList[item]);
  207. });
  208. }
  209. if (tmplIds.length === 0) return;
  210. uni.requestSubscribeMessage({
  211. tmplIds,
  212. fail: (err) => {
  213. console.log(err);
  214. },
  215. });
  216. }
  217. // 设置 openid 到本地存储,目前只有 pay 支付时会使用
  218. function setOpenid(openid) {
  219. uni.setStorageSync('openid', openid);
  220. }
  221. export default {
  222. load,
  223. login,
  224. bind,
  225. unbind,
  226. checkUpdate,
  227. bindUserPhoneNumber,
  228. mobileLogin,
  229. subscribeMessage,
  230. };