jiangping
2023-08-21 2837bdd57f72e386bbf9a725e7b3a13e5eb9e930
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import wx from 'weixin-js-sdk'
import { Toast } from 'vant'
import { getTimestamp, randomString, getSignature } from './utils.ts'
 
class AuthWechat {
 
  /**
   * 获取浏览器地址
   * */
  signLink() {
    if (typeof window.entryUrl === 'undefined' || window.entryUrl === '') {
      window.entryUrl = document.location.href
    }
    let url = /(Android)/i.test(navigator.userAgent) ? document.location.href : window.entryUrl;
    return url.split('#')[0]
  }
 
  /**
   * 当前是否是微信环境
   * */
  isWeixin() {
    return navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1;
  }
 
  /**
   * 初始化
   * */
  wechat(ticket) {
    if (!this.isWeixin()) {
      return Toast.fail('当前不是微信环境');
    }
 
    return new Promise((resolve, reject) => {
      let url = this.signLink()
      let timestamp = getTimestamp()
      let nonceStr = randomString()
      let signature = getSignature(ticket, nonceStr, timestamp, url)
 
      wx.config({
        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: process.env.VUE_APP_APPID, // 必填,公众号的唯一标识
        timestamp, // 必填,生成签名的时间戳
        nonceStr, // 必填,生成签名的随机串
        signature, // 必填,签名
        jsApiList: [
          'updateAppMessageShareData', // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容
          'updateTimelineShareData', // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)
          'closeWindow', //关闭当前网页窗口接口
          'chooseWXPay'
        ]
      })
      wx.ready(res => {
        // 微信SDK准备就绪后执行的回调。
        // console.log('wx.ready',res);
        resolve(wx, res)
      })
      wx.error(err => {
        // console.log('wx.error',err)
        reject(wx, err)
      })
    })
  }
 
  /**
   * 微信分享
   * @param {object} shareObj 分享内容对象
   * */
  wxShare(shareObj) {
    if (!this.isWeixin()) {
      return Toast.fail('当前不是微信环境');
    }
    console.log('分享', shareObj)
    let norShare = new Promise((resolve, reject) => {
      wx.ready(() => {
        wx.updateAppMessageShareData({
          title: shareObj.title, // 分享标题
          desc: shareObj.desc, // 分享描述
          link: shareObj.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
          imgUrl: shareObj.imgUrl, // 分享图标
          success: function () {
            resolve('成功了')
          },
          fail: function (res) {
            console.log('好友分享 失败', res);
            alert('fail:' + JSON.stringify(res));
            reject(JSON.stringify(res))
          }
        })
      })
    })
    let friendShare = new Promise((resolve, reject) => {
      wx.ready(() => {
        wx.updateTimelineShareData({
          title: shareObj.title, // 分享标题
          desc: shareObj.desc, // 分享描述
          link: shareObj.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
          imgUrl: shareObj.imgUrl, // 分享图标
          success: function () {
            resolve('成功了')
          },
          fail: function (res) {
            console.log('朋友圈分享 失败', res);
            alert('fail:' + JSON.stringify(res));
            reject(JSON.stringify(res))
          }
        })
      })
    })
    return Promise.all([norShare, friendShare])
  }
 
  wxPay(response) {
    if (!this.isWeixin()) {
      return Toast.fail('当前不是微信环境');
    }
    console.log('支付', response);
    return new Promise((resolve, reject) => {
      wx.chooseWXPay({
        appId: response.appId,
        timestamp: response.timeStamp, // 支付签名时间戳,注意微信 jssdk 中的所有使用 timestamp 字段均为小写。但最新版的支付后台生成签名使用的 timeStamp 字段名需大写其中的 S 字符
        nonceStr: response.nonceStr, // 支付签名随机串,不长于 32 位
        package: response.packageValue, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
        signType: response.signType, // 微信支付V3的传入 RSA ,微信支付V2的传入格式与V2统一下单的签名格式保持一致
        paySign: response.paySign, // 支付签名
        complete: (res) => {
          console.log(res);
          reject(res)
        },
        success: function (res) {
          // 支付成功后的回调函数
          console.log(res);
          resolve(res)
        },
        // cancel: function (err) {
        //   reject(err)
        // }
      })
    })
  }
}
 
 
 
export default new AuthWechat();