wechat.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. import WechatJSSDK from "wechat-jssdk/dist/client.umd";
  2. import { getWechatConfig, wechatAuth } from "@api/public";
  3. import { parseQuery } from "@utils";
  4. import cookie from "@utils/store/cookie";
  5. import store from "@/store";
  6. const STATE_KEY = "wx_authorize_state";
  7. const WX_AUTH = "wx_auth";
  8. const BACK_URL = "login_back_url";
  9. const LOGINTYPE = "loginType";
  10. let instance;
  11. let wechatObj;
  12. const LONGITUDE = "user_longitude";
  13. const LATITUDE = "user_latitude";
  14. export default function wechat() {
  15. return new Promise((resolve, reject) => {
  16. if (instance) return resolve(instance);
  17. getWechatConfig()
  18. .then(res => {
  19. const _wx = WechatJSSDK(res.data);
  20. wechatObj = _wx;
  21. _wx
  22. .initialize()
  23. .then(() => {
  24. instance = _wx.wx;
  25. instance.initConfig = res.data;
  26. resolve(instance);
  27. })
  28. .catch(reject);
  29. })
  30. .catch(err => {
  31. console.log(err);
  32. reject(err);
  33. });
  34. });
  35. }
  36. export function clearAuthStatus() {
  37. cookie.remove(WX_AUTH);
  38. cookie.remove(STATE_KEY);
  39. }
  40. export function oAuth() {
  41. if (cookie.has(WX_AUTH) && store.state.app.token) return;
  42. const { code } = parseQuery();
  43. if (!code) return toAuth();
  44. }
  45. export function auth(code) {
  46. return new Promise((resolve, reject) => {
  47. let loginType = cookie.get(LOGINTYPE);
  48. //if (state !== cookie.get(STATE_KEY)) return reject();
  49. wechatAuth(code, parseInt(cookie.get("spread")), loginType)
  50. .then(({ data }) => {
  51. // const expires_time = dayjs(data.expires_time);
  52. // const newTime = Math.round(new Date() / 1000);
  53. // store.commit("LOGIN", data.token, expires_time - newTime);
  54. let expires_time = data.expires_time.substring(0, 19);
  55. expires_time = expires_time.replace(/-/g, "/");
  56. expires_time = new Date(expires_time).getTime() - 28800000;
  57. const datas = {
  58. token: data.token,
  59. expires_time: expires_time
  60. };
  61. store.commit("LOGIN", datas);
  62. cookie.set(WX_AUTH, code, expires_time);
  63. cookie.remove(STATE_KEY);
  64. loginType && cookie.remove("loginType");
  65. resolve();
  66. })
  67. .catch(reject);
  68. });
  69. }
  70. export function toAuth() {
  71. wechat().then(wx => {
  72. location.href = getAuthUrl(wx.initConfig.appId);
  73. });
  74. }
  75. function getAuthUrl(appId) {
  76. const redirect_uri = encodeURIComponent(
  77. `${location.origin}/auth/` +
  78. encodeURIComponent(
  79. encodeURIComponent(
  80. cookie.has(BACK_URL)
  81. ? cookie.get(BACK_URL)
  82. : location.pathname + location.search
  83. )
  84. )
  85. );
  86. cookie.remove(BACK_URL);
  87. const state = encodeURIComponent(
  88. ("" + Math.random()).split(".")[1] + "authorizestate"
  89. );
  90. cookie.set(STATE_KEY, state);
  91. return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=${state}#wechat_redirect`;
  92. }
  93. function toPromise(fn, config = {}) {
  94. return new Promise((resolve, reject) => {
  95. fn({
  96. ...config,
  97. success(res) {
  98. resolve(res);
  99. },
  100. fail(err) {
  101. reject(err);
  102. },
  103. complete(err) {
  104. reject(err);
  105. },
  106. cancel(err) {
  107. reject(err);
  108. }
  109. });
  110. });
  111. }
  112. export function pay(config) {
  113. return toPromise(instance.chooseWXPay, config);
  114. }
  115. export function openShareAll(config) {
  116. config || {};
  117. config.type = config.type == undefined ? "link" : config.type;
  118. return new Promise(resolve => {
  119. getWechatConfig().then(res => {
  120. wechatObj.signSignature({
  121. nonceStr: res.data.nonceStr,
  122. signature: res.data.signature,
  123. timestamp: res.data.timestamp
  124. });
  125. instance = wechatObj.getOriginalWx();
  126. instance.ready(() => {
  127. instance.updateAppMessageShareData(config);
  128. instance.updateTimelineShareData(config);
  129. resolve();
  130. });
  131. });
  132. });
  133. }
  134. export function openShareAppMessage(config) {
  135. instance.updateAppMessageShareData(config);
  136. instance.onMenuShareAppMessage && instance.onMenuShareAppMessage(config);
  137. }
  138. export function openShareTimeline(config) {
  139. instance.updateTimelineShareData(config);
  140. instance.onMenuShareTimeline && instance.onMenuShareTimeline(config);
  141. }
  142. export function openAddress() {
  143. return new Promise((resolve, reject) => {
  144. wechatEvevt("openAddress", {})
  145. .then(res => {
  146. console.log(res);
  147. resolve(res);
  148. })
  149. .catch(res => {
  150. console.log(res);
  151. if (res.is_ready) {
  152. res.wx.openAddress({
  153. fail(res) {
  154. reject(res);
  155. },
  156. success(res) {
  157. resolve(res);
  158. }
  159. });
  160. } else {
  161. reject(res);
  162. }
  163. });
  164. });
  165. }
  166. /**
  167. * 公众号事件
  168. * @param name 事件名
  169. * @param config 配置
  170. * @returns {Promise<unknown>}
  171. */
  172. export function wechatEvevt(name, config) {
  173. return new Promise((resolve, reject) => {
  174. let wx;
  175. let configDefault = {
  176. fail(res) {
  177. console.log(res);
  178. if (wx) return reject({ is_ready: true, wx: wx });
  179. getWechatConfig().then(res => {
  180. wechatObj.signSignature({
  181. nonceStr: res.data.nonceStr,
  182. signature: res.data.signature,
  183. timestamp: res.data.timestamp
  184. });
  185. wx = wechatObj.getOriginalWx();
  186. reject({ is_ready: true, wx: wx });
  187. });
  188. },
  189. success(res) {
  190. resolve(res);
  191. },
  192. cancel(err) {
  193. reject(err);
  194. },
  195. complete(err) {
  196. reject(err);
  197. }
  198. };
  199. Object.assign(configDefault, config);
  200. if (typeof instance !== "undefined") {
  201. instance.ready(() => {
  202. if (typeof name === "object") {
  203. name.forEach(item => {
  204. instance[item] && instance[item](configDefault);
  205. });
  206. } else instance[name] && instance[name](configDefault);
  207. });
  208. } else {
  209. getWechatConfig().then(res => {
  210. const _wx = WechatJSSDK(res.data);
  211. _wx.initialize().then(() => {
  212. instance = _wx.getOriginalWx();
  213. instance.ready(() => {
  214. if (typeof name === "object") {
  215. name.forEach(item => {
  216. instance[item] && instance[item](configDefault);
  217. });
  218. } else instance[name] && instance[name](configDefault);
  219. });
  220. });
  221. });
  222. }
  223. });
  224. }
  225. export function ready() {
  226. return new Promise(resolve => {
  227. if (typeof instance !== "undefined") {
  228. instance.ready(() => {
  229. resolve(instance);
  230. });
  231. } else {
  232. getWechatConfig().then(res => {
  233. const _wx = WechatJSSDK(res.data);
  234. _wx.initialize().then(() => {
  235. instance = _wx.wx;
  236. instance.ready(() => {
  237. resolve(instance);
  238. });
  239. });
  240. });
  241. }
  242. });
  243. }
  244. export function wxShowLocation() {
  245. return new Promise((resolve, reject) => {
  246. let longitude = cookie.get(LONGITUDE); //经度
  247. let latitude = cookie.get(LATITUDE); //纬度
  248. if (longitude && latitude) {
  249. return resolve({ longitude: longitude, latitude: latitude });
  250. }
  251. wechatEvevt("getLocation", { type: "wgs84" })
  252. .then(res => {
  253. let latitude = res.latitude; // 纬度
  254. let longitude = res.longitude; // 经度
  255. cookie.set(LATITUDE, latitude);
  256. cookie.set(LONGITUDE, longitude);
  257. resolve(res);
  258. })
  259. .catch(res => {
  260. cookie.remove(LATITUDE);
  261. cookie.remove(LONGITUDE);
  262. reject(res);
  263. if (res.is_ready) {
  264. res.wx.getLocation({
  265. success(res) {
  266. let latitude = res.latitude; // 纬度
  267. let longitude = res.longitude; // 经度
  268. cookie.set(LATITUDE, latitude);
  269. cookie.set(LONGITUDE, longitude);
  270. resolve(res);
  271. },
  272. cancel(res) {
  273. cookie.remove(LATITUDE);
  274. cookie.remove(LONGITUDE);
  275. reject(res);
  276. },
  277. fail(res) {
  278. cookie.remove(LATITUDE);
  279. cookie.remove(LONGITUDE);
  280. reject(res);
  281. }
  282. });
  283. } else {
  284. cookie.remove(LATITUDE);
  285. cookie.remove(LONGITUDE);
  286. reject(res);
  287. }
  288. })
  289. .fail(error => {
  290. reject(error);
  291. });
  292. });
  293. }