import request from '@/helpers/request' import { browser, getUrlCode, moneyFormat } from '@/helpers/utils' import { goWechatAuth } from '@/state' import numeral from 'numeral' import { Button, Cell, CellGroup, Icon, showToast } from 'vant' import { defineComponent, onMounted, reactive } from 'vue' import { useRoute } from 'vue-router' import styles from './index.module.less' export default defineComponent({ name: 'pay-define', setup() { const route = useRoute() const state = reactive({ browserStatus: false, errorText: '', code: null as any, pay_channel: route.query.pay_channel as any, wxAppId: route.query.wxAppId as any, body: route.query.body as any, price: route.query.price as any, orderNo: route.query.orderNo as any, userId: route.query.userId as any, payInfo: {} as any }) const getPayment = async () => { try { if (parseFloat(state.price) <= 0) { showToast('支付金额异常') return } const payMap: any = { merOrderNo: state.orderNo, paymentChannel: state.pay_channel, // 支付渠道 userId: state.userId } // // 判断是否是微信公众号支付 if (state.pay_channel == 'wx_pub') { payMap.code = state.code } console.log(payMap, 'payMap') const { data } = await request.post('/api-student/open/userOrder/executePayment', { hideLoading: false, data: { ...payMap } }) console.log(data, 'payment') scanCodePay(data.reqParams) } catch (e) { // console.log(e) } } const scanCodePay = (data: any) => { // 判断支付方式 如果是 test 模式 支付用测试url 否则用生产url if (state.pay_channel == 'alipay_qr') { const url = data.prod_mode === 'false' ? data.expend.qrcode_url + '?payment_id=' + data.id + '&pay_channel=' + data.pay_channel : data.expend.qrcode_url window.location.href = url } else if (state.pay_channel == 'wx_pub') { const tempPayInfo = JSON.parse(data.expend.pay_info) state.payInfo = tempPayInfo if (typeof (window as any).WeixinJSBridge == 'undefined') { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false) } else if ((document as any).attachEvent) { ;(document as any) .attachEvent( 'WeixinJSBridgeReady', onBridgeReady )(document as any) .attachEvent('onWeixinJSBridgeReady', onBridgeReady) } } else { onBridgeReady() } } } const onBridgeReady = () => { const payInfo = state.payInfo // let orderNo = state.orderNo ;(window as any).WeixinJSBridge.invoke( 'getBrandWCPayRequest', { appId: payInfo.appId, //公众号名称,由商户传入 timeStamp: payInfo.timeStamp, //时间戳,自1970年以来的秒数 nonceStr: payInfo.nonceStr, //随机串 package: payInfo.package, signType: payInfo.signType, //微信签名方式: paySign: payInfo.paySign //微信签名 }, (res: any) => { // if(res.err_msg == "get_brand_wcpay_request:ok" ){ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 // } else if ( res.err_msg == 'get_brand_wcpay_request:cancel' || res.err_msg == 'get_brand_wcpay_request:fail' ) { window.location.replace( location.origin + '/orchestra-student/#/payment-result?orderNo=' + state.orderNo ) } else { // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 // alert('支付成功') window.location.replace( location.origin + '/orchestra-student/#/payment-result?orderNo=' + state.orderNo ) } } ) } // const goAuth = () => { // // 用户授权 // const urlNow = encodeURIComponent(window.location.href) // const scope = 'snsapi_base' //snsapi_userinfo //静默授权 用户无感知 // const appid = state.wxAppId || 'wx8654c671631cfade' // const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect` // window.location.replace(url) // } const init = () => { const pay_channel = state.pay_channel if (browser().weixin) { if (pay_channel === 'wx_pub') { //授权 const code = getUrlCode() console.log(code) if (code) { state.code = code // 赋值code码 } else { // goAuth() goWechatAuth(state.wxAppId) } state.browserStatus = true document.title = '微信支付' } else if (pay_channel == 'alipay_qr') { state.errorText = '请使用支付宝扫码' } } else if (browser().alipay) { if (pay_channel === 'wx_pub') { state.errorText = '请使用微信扫码' } else if (pay_channel == 'alipay_qr') { // 支付宝支付 state.browserStatus = true document.title = '支付宝支付' } } else { state.errorText = '请在微信或支付宝客户端打开' } state.errorText && (document.title = 'ERROR') } onMounted(() => { console.log(state) init() }) return () => (