import React, { Component } from 'react'; import {Flex, WingBlank, WhiteSpace, List, Radio, Toast} from 'antd-mobile'; import {http, getParam, is_weixin } from '@/utils'; import { OrderItem, HeaderBar } from '@/common/index'; import { Link } from 'react-router-dom'; import './PayOrder.scss'; import { VList } from '@/common'; const Item = List.Item; const Brief = Item.Brief; const RadioItem = Radio.RadioItem; let mockData = [ { value: 0, label: '支付宝', icon: 'iconzhifubaox-' }, { value: 1, label: '微信支付', icon: 'iconweixinzhifu' }, // { value: 2, label: '花呗分期', icon: 'iconhuabei' }, ]; export default class PayOrder extends Component { constructor(props) { super(props); this.state = { pay_amount: 0, payType: 0, stageNumber: 0, checkPeriod: false, singleMoney: 0, periodNumber: 0, orderId: getParam('oid'), huabei: false, fenqiList: [ { value: 'zhifubao', qishu: '3', lilv: '2.30%', everyMoney: 300, feiyong: 2.3 }, { value: 'weixin', qishu: '6', lilv: '4.50%', everyMoney: 150, feiyong: 4.5 }, { value: 'huabei', qishu: '9', lilv: '7.50%', everyMoney: 100, feiyong: 7.5 }, ], categoryList: [], } } onChange = (value) => { this.setState({ payType: value, checkPeriod: false, }); if (value === 2) { this.setState({ huabei: true, }); } }; checkStaging = (item) => { console.log(item); this.setState({ huabei: false, stageNumber: item.value, singleMoney: item.everyTotal, periodNumber: item.stage, checkPeriod: true, }); } print = (...e) => { console.log(e); }; // 确定购买 pay = () => { const {payType, orderId} = this.state; if(payType === 0) { this.alipayPay(orderId) } else if (payType === 1) { this.weixinPay(orderId) } // else { // 花呗分期暂时不做 // this.huabeiPay(orderId) // } } // 微信支付 weixinPay = (orderId) => { // 微信内部-支付 if (is_weixin()) { 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) => { console.log(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) } }) } } // 微信内部支付 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 = () => { // 调到已购课程 /purchased 不需要传递任何参数 } 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('支付失败') } } ) } // 支付宝支付 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) } }) } // 花呗分期 暂时不做 huabeiPay = (orderId) => { const {singleMoney, periodNumber} = this.state; console.log('花呗分期支付'); http.get(`/pay/alipay/wap_charge/oid/${orderId}/plat/{plat} /hb_num/${periodNumber}`).then(res=>{ console.log(res); if (res.data.errno === 0) { window.location = res.data.data.url; } else { Toast.info(res.data.msg, 2) } }); } componentDidMount() { http.post(`${API['base-api']}/m/order/detail`, { order_id: this.state.orderId }).then((res) => { console.log(res); if (res.data.errno !== 200) { Toast.info(res.data.msg, 2); return; } const { course, pay_amount } = res.data.data; const fenqiList = []; [1, 2, 3].map((item)=>{ let obj = {}; obj.value = item; if(item === 1) { obj.stage = 3; //期数 obj.moneyRate = '2.30%'; // 分期费率展示 obj.rate = 0.023; // 分期费率计算 obj.periodic = (pay_amount/3).toFixed(2); // 每期本金 } else if (item === 2) { obj.stage = 6; //期数 obj.moneyRate = '4.50%'; // 分期费率展示 obj.rate = 0.045; // 分期费率计算 obj.periodic = (pay_amount/6).toFixed(2); // 每期本金 } else { obj.stage = 12; //期数 obj.moneyRate = '7.50%'; // 分期费率展示 obj.rate = 0.075; // 分期费率计算 obj.periodic = (pay_amount/9).toFixed(2); // 每期本金 } obj.serviceFee = ((pay_amount * obj.rate) / obj.stage).toFixed(2); // 每期的手续费 = 总金额 * 费率 / 期数 obj.everyTotal = (parseFloat(obj.periodic) + parseFloat(obj.serviceFee)).toFixed(2);// 每期总费用 = 每期本金 + 每期手续费 fenqiList.push(obj); }); console.log(fenqiList); // { value: 'zhifubao', qishu: '3', lilv: '2.30%', everyMoney: 300, feiyong: 2.3 }, // { value: 'weixin', qishu: '6', lilv: '4.50%', everyMoney: 150, feiyong: 4.5 }, // { value: 'huabei', qishu: '9', lilv: '7.50%', everyMoney: 100, feiyong: 7.5 }, this.setState({ pay_amount, categoryList: course, fenqiList, }); }); if (getParam('is_class') === 1 || getParam('weixinpay')) { this.payCallback() } if (is_weixin()) { this.isweixinPay() } } render() { const { orderId, pay_amount, payType, checkPeriod, singleMoney, periodNumber, huabei, fenqiList, categoryList, stageNumber } = this.state; return ( <div className='pay-order'> <HeaderBar title='确认支付' arrow={true}></HeaderBar> <WhiteSpace size='sm'></WhiteSpace> <div className='order-number'> <WingBlank> <Flex justify='between' align='center' style={{ height: '44px' }}> <span>订单号</span> <span className='number'>{orderId}</span> </Flex> </WingBlank> </div> <WhiteSpace size='md'></WhiteSpace> { categoryList.map((item, index) => { const Info = ( <div className="order-info"> <p className='order-title text-overflow-one'> <Link to={`/detail?id=${item.course_id}`}>{item.course_title}</Link> </p> <p className='order-content text-overflow-2'>{item.simpledescription}</p> <p className='order-des'> <span className='order-newprice'>¥{item.price1}</span> <span className='order-price'>¥{item.price0}</span> </p> </div> ) return ( <VList handleClick={this.print} key={index} img={item.image_name} id={item.course_id} info={Info}></VList> ) }) } <WhiteSpace size='md'></WhiteSpace> <div className='order-number'> <WingBlank> <Flex justify='between' align='center' style={{ height: '44px' }}> <span>支付金额</span> <span className='money'>{`¥${pay_amount}`}</span> </Flex> </WingBlank> </div> <WhiteSpace size='md'></WhiteSpace> <List renderHeader={() => '支付方式'} className='pay-type-list'> {mockData.map(i => ( <RadioItem thumb={<i className={`iconfont ${i.icon} ${payType === i.value ? 'checked' : ''}`}></i>} key={i.value} checked={payType === i.value} onChange={() => this.onChange(i.value)}> {/* {i.label} */} { i.value === 2 ? ( <Flex direction='column' align='start' style={{ width: '100%', marginTop: '6px' }}> <Flex direction='row' justify='between' style={{ width: '100%', paddingRight: '30px' }}> <span style={{ color: '#555555', fontSize: '14px' }}>{i.label}</span> { checkPeriod ? ( <span style={{ color: '#333333', fontSize: '12px' }}>{`${singleMoney}元 × ${periodNumber}期`}</span> ) : null } </Flex> <Flex justify='start'> <span style={{ color: '#999999', fontSize: '12px' }}>支付上限受限于您的花呗额度</span> </Flex> </Flex> ) : (i.label) } </RadioItem> ))} </List> <div className='pay-tip'>请在24小时内完成支付,否则届时系统将关闭该订单。</div> <div className='pay-button' onClick={this.pay}>确认支付</div> { huabei ? ( <div className='check-staging'> <div className='container'> <p className='check-title'>请选择分期</p> {fenqiList.map(i => ( <RadioItem key={i.value} checked={stageNumber === i.value} onChange={() => this.checkStaging(i)}> {`${i.everyTotal}元 × ${i.stage}期`} <List.Item.Brief>{`手续费${i.serviceFee}元/期,费率${i.moneyRate}`}</List.Item.Brief> </RadioItem> ))} </div> </div> ) : null } </div> ) } }