miniProgram.js 5.9 KB

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