import * as utils from './utils' import ivyStore from './ivyStore' let ws = { ready: null, readyPromise: null, debug: window.location.href.includes('debug=1'), } export function weixinAuth(url, scope = 'snsapi_userinfo') { let {config} = ivyStore.objects let sec = Math.round(new Date().getTime() / 1000) let callurl = `${config.redirect_root}/api/mobile/wechat/wechatRedirect?_ts=${sec}&redirect=${encodeURIComponent(url)}` window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appid}&redirect_uri=${encodeURIComponent(callurl)}&response_type=code&scope=${scope}&state=STATE#wechat_redirect` } export async function wxConfigReady() { let {config, axios} = ivyStore.objects if (ws.readyPromise && utils.isIos()) return await ws.readyPromise // IOS只需要config一次 // 获取登陆数据后,等待js-sdk ready ws.readyPromise = axios.get(`/api/mobile/wechat/getJsapiAuth`, { params: { url: window.location.href, appid: config.appid, } }) ws.ready = await ws.readyPromise if (typeof window.WeixinJSBridge === 'undefined') { await new Promise(resolve => { document.addEventListener('WeixinJSBridgeReady', () => resolve('ready')) }) } await new Promise((resolve, reject) => { window.wx.config({ ...ws.ready.data, debug: ws.debug, jsApiList: ivyStore.objects.config.apiList || [ 'chooseWXPay', 'editAddress', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'startRecord', 'stopRecord', 'pauseVoice', 'playVoice', 'stopVoice', 'onVoicePlayEnd', 'uploadVoice' ] }) window.wx.ready(async () => { await utils.sleep(200) resolve('ready success') }) window.wx.error((res) => { let emsg = res && res.errMsg || '' let host = window.location.href let isDev = host.startsWith('http://1') || host.startsWith('http://localhost') if (emsg.startsWith('config:fail') || emsg.startsWith('config:param') || emsg.startsWith('config:')) return alert('wx error: ' + JSON.stringify(res)) }) }) } export async function weixinPay(options) { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.chooseWXPay({ ...options, success: (res) => { resolve(res) }, fail: res => { resolve(res) }, cancel: res => { resolve(res) }, }) }) } export async function weixinShare(options) { await wxConfigReady() // 分享到朋友圈 window.wx.onMenuShareTimeline({ ...options, success: f => f, cancel: f => f, }) // 分享给朋友 window.wx.onMenuShareAppMessage({ ...options, success: f => f, cancel: f => f, }) return true // 微信新版本已经取消了成功回调,所以直接返回 } export async function getWxAddress() { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.openAddress({ success: resolve }) }) } // 开始录音接口 export async function startRecord() { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.startRecord() resolve(true) }) } // 停止录音接口 并返回localId export async function stopRecord() { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.stopRecord({ success(res) { resolve(res) } }) }) } // 暂停播放本地音频,需要传localId export async function pauseVoice(localId) { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.pauseVoice({localId}) resolve(true) }) } // 需要播放的音频的本地ID,由stopRecord接口获得 export async function playVoice(localId) { await wxConfigReady() window.wx.playVoice({ localId }) } // 停止播放本地音频,需要传localId export async function stopVoice(localId) { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.stopVoice({localId}) resolve(true) }) } // 本地音频播放完成后返回localId export async function onVoicePlayEnd() { await wxConfigReady() window.wx.onVoicePlayEnd({ success(res) { return res } }) } // 上传本地音频到微信服务器并返回音频的服务器端ID export async function uploadVoice(localId) { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.uploadVoice({ localId, isShowProgressTips: 1, // 默认为1,显示进度提示 success(res) { resolve(res) } }) }) } export async function chooseImage(count: number): Promise { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.chooseImage({ count, sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success(res) { resolve(res) } }) }) } export async function uploadImage(localId: string): Promise { await wxConfigReady() return new Promise((resolve, reject) => { window.wx.uploadImage({ localId, isShowProgressTips: 1, success(res) { resolve(res) } }) }) } // abcde