wechat.js 7.7 KB

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