import React, {Component} from 'react' import './index.scss' import {api, getParam, http, browser} from "@/utils"; import {Toast} from 'antd-mobile'; import {Link, withRouter} from "react-router-dom"; import {compose} from "redux"; import {connect} from "react-redux"; import {differenceInHours, differenceInMinutes, differenceInSeconds} from "date-fns"; class Single extends Component { constructor(props) { super(props) this.state = { status: 1, orderId: '', nowPrice: '', laterPrice: '', hour: '', min: '', sec: '', endTime: '', groupOrderId: '', payType: '0', // 1支付宝 0微信 } } componentDidMount() { if (getParam('is_class') === 1 || getParam('weixinpay')) { this.payCallback() } if (browser.isWeixin) { this.isweixinPay() } } // 选择支付方式 check = (type) => { this.setState({ payType: type }) } // 确定购买 toBuy = () => { http.get(`${API.home}/sys/createClassOrder/${this.props.data.video_id}`).then((res) => { if (res.data.code === 200) { this.setState({ orderId: res.data.data.order_id }) this.state.payType === '1' ? this.alipayPay(this.state.orderId) : this.weixinPay(this.state.orderId) } else { Toast.info(res.data.msg, 2) } }) } // 微信支付 weixinPay = (orderId) => { // 微信内部-支付 if (browser.isWeixin) { window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx23dac6775ac82877&redirect_uri=" + encodeURIComponent(window.location.href + "&aa=bb").toLowerCase() + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; } else { // 微信外部-支付 http.get(`${API['base-api']}/pay/wxpay/wap_charge/oid/${orderId}`).then((res) => { if (res.data.errno === 0) { window.location.href = res.data.data.url + "&redirect_url=" + encodeURIComponent(window.location.href + "&weixinpay=1").toLowerCase(); } else { Toast.info(res.data.msg, 2) } }) } } // 支付宝支付 alipayPay = (orderId) => { http.get(`${API['base-api']}/pay/alipay/wap_charge/oid/${orderId}`).then((res) => { if (res.data.errno === 0) { window.location = res.data.data.url; } else { Toast.info(res.data.msg, 2) } }) } onBridgeReady = (data) => { WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId": data.appId, //公众号名称,由商户传入 "timeStamp": data.timeStamp, //时间戳,自1970年以来的秒数 "nonceStr": data.nonceStr, //随机串 "package": data.package, "signType": data.signType, //微信签名方式: "paySign": data.paySign //微信签名 }, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") { this.payCallback() } else { alert('支付失败') } } ) } // 微信内部支付 isweixinPay = () => { let weixin_code = getParam('code') if (weixin_code) { if (getParam('oid') === undefined) { return } else { http.get(`${API['base-api']}/pay/wxpay/pub_charge/oid/${getParam('oid')}/code/${weixin_code}`).then((res) => { if (res.data.errno === 0) { const data = res.data.data this.onBridgeReady(data) if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady, false) } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', this.onBridgeReady) document.attachEvent('onWeixinJSBridgeReady', this.onBridgeReady) } } else { this.onBridgeReady() } } else { Toast.info(res.data.msg, 2) } }) } } } // 支付完成之后获取状态 payCallback = () => { http.get(`${API.home}/sys/orderStatus/${getParam('oid')}`).then((res) => { if (res.data.data.errno == '200') { // 正常购买单集成功 this.setState({ status: 6 }) } else if (res.data.data.errno == '201') { // 0元参团 this.setState({ status: 4 }) } else if (res.data.data.errno == '202') { // 0元购 this.setState({ status: 3 }) } else if (res.data.data.errno == '203') { // 三天内特价 this.setState({ nowPrice: res.data.data.data.now_price, laterPrice: res.data.data.data.three_day_later_price, status: 2 }) } else { Toast.info(res.data.data.msg, 2) } }) } // 特价购买全集 toBuyAll = () => { } // 0元购买全集 zerobuyReceive = () => { Toast.success('购买全集成功', 3) this.colse() } // 0元参团 zerogroupBuy = () => { this.getOrderId() } // 获取订单号-0元参团 getOrderId = () => { let data = { course_id: getParam('id') } http.post(`${API['base-api']}/pdd/sys`, data).then((res) => { if (res.data.errno === 0) { this.setState({ groupOrderId: res.data.data.order_id }) this.getOrderStatus(res.data.data.order_id) } else { Toast.info(res.data.msg, 2) } }) } // 获取订单状态-0元参团 getOrderStatus = (id) => { http.get(`${API.home}/m/pdd/order_status/${id}`).then((res) => { if (res.data.code === 200) { this.getTime(res.data.data.pdd_order_id) } else { Toast.info(res.data.msg, 2) } }) } // 获取倒计时-0元参团 getTime = (id) => { http.get(`${API.home}/m/pdd_order_end_time/${id}`).then((res) => { if (res.data.code === 200) { this.setState({ endTime: res.data.data.end_time, status: 7 }) } else { Toast.info(res.data.msg, 2) } }) } // 邀请好友参团 toGroup = () => { this.props.history.push(`/togroup?id=${this.state.groupOrderId}`) } // 关闭弹窗 colse = () => { this.props.boxHide(false); this.setState({ status: 1 }) } render() { if (this.state.endTime) { let date = this.state.endTime * 1000 let now = Date.now() setInterval(() => { date -= 1000 let s = differenceInSeconds(new Date(date), now) % 60, m = differenceInMinutes(new Date(date), now) % 60, h = differenceInHours(new Date(date), now) % 24 this.setState({ hour: h, min: m, sec: s, }) }, 1000) } return ( <div> { this.props.singleBox && <div className='popup-box'> { this.state.status === 1 && <div className='content singleset-payment'> <div className='price-box'> <span>实付款:</span> <p>{this.props.data.class_price}元</p> </div> <div className='course-info'> <p className='text-overflow-1'><span>课程:</span> {this.props.title} </p> <p className='text-overflow-1'><span>课时:</span> {this.props.data.name} </p> </div> <div className='payment-type'> <label>支付方式:</label> { !browser.isWeixin && <p onClick={this.check.bind(this, '1')}> <i className='iconfont iconzhifubaox-'></i> <span>支付宝</span> <i className={`iconfont icondanseshixintubiao-5 redio ${this.state.payType === '1' ? 'redioed' : ''}`}></i> </p> } <p onClick={this.check.bind(this, '0')}> <i className='iconfont iconweixinzhifu buy'></i> <span>微信支付</span> <i className={`iconfont icondanseshixintubiao-5 redio ${this.state.payType === '0' ? 'redioed' : ''}`}></i> </p> </div> <div className='btn btn-18B4ED' onClick={this.toBuy}>确认购买</div> </div> } { this.state.status === 2 && <div className='content payment-success'> <div className="header"> <i className='iconfont icondanseshixintubiao-5'></i> <span>购买成功</span> </div> <div className="dec">· 3天内购买全集,可直接抵扣该集费用,{this.state.nowPrice}元购买。</div> <div className="dec">· 超过3天,按照未够集数/全部集数等比例计费,{this.state.laterPrice}元购买全集。</div> <div className='btn btn-18B4ED'>开始学习</div> <div className='btn btn-FF4000' onclick={this.toBuyAll()}>¥{this.state.nowPrice}购买全集 </div> </div> } { this.state.status === 3 && <div className='content zero'> <div className="header"> <i className='iconfont icondanseshixintubiao-5'></i> <span>购买成功</span> </div> <div className="dec">· 恭喜您获得0元拼团购买剩余课时的机会。</div> <div className='btn btn-FF4000' onClick={this.zerogroupBuy}>0元参团</div> </div> } { this.state.status === 4 && <div className='content zero'> <div className="header"> <i className='iconfont icondanseshixintubiao-5'></i> <span>购买成功</span> </div> <div className="dec">· 恭喜您获得0元购买剩余课时的机会。</div> <div className='btn btn-FF4000' onClick={this.zerobuyReceive}>0元购</div> </div> } { this.state.status === 6 && <div className='content zero'> <div className="header"> <i className='iconfont icondanseshixintubiao-5'></i> <span>购买成功</span> </div> <Link to={`/play?id=${getParam('id')}`} className='btn btn-18B4ED'>去学习</Link> </div> } { this.state.status === 7 && <div className='content group'> <div className="header"> <i className='iconfont icondanseshixintubiao-5'></i> <span>参团成功</span> </div> <div className='group-img'> <img src={this.props.user.data.avatar} alt=""/> <img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/images/weekend/train7/ellipsis.png" alt=""/> <img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/images/weekend/train7/ellipsis.png" alt=""/> </div> <div className='btn-l btn-FF4000' onClick={this.toGroup}> 剩余{String(this.state.hour).padStart(2, 0)}:{String(this.state.min).padStart(2, 0)}:{String(this.state.sec).padStart(2, 0)} 邀请好友参团 </div> </div> } <i onClick={this.colse} className={'iconfont iconiconfront-2 close'}></i> </div> } </div> ); } } export default compose( connect( state => ({user: state.user}), null ), withRouter )(Single)