UNPKG

shadowsocks-manager

Version:

A shadowsocks manager tool for multi user and traffic control.

217 lines (215 loc) 7.45 kB
const app = angular.module('app'); const window = require('window'); const cdn = window.cdn || ''; app.factory('payDialog' , [ '$mdDialog', '$interval', '$timeout', '$http', '$localStorage', 'configManager', ($mdDialog, $interval, $timeout, $http, $localStorage, configManager) => { const publicInfo = { config: configManager.getConfig(), time: [{ type: 'hour', name: '一小时' }, { type: 'day', name: '一天' }, { type: 'week', name: '一周' }, { type: 'month', name: '一个月' }, { type: 'season', name: '三个月' }, { type: 'year', name: '一年' }], payType: [], }; if(publicInfo.config.alipay) { publicInfo.payType.push({ type: 'alipay', name: '支付宝' }); } if(publicInfo.config.paypal) { publicInfo.payType.push({ type: 'paypal', name: 'Paypal' }); } if(publicInfo.config.giftcard) { publicInfo.payType.push({ type: 'giftcard', name: '充值码' }); } publicInfo.myPayType = publicInfo.payType[0] ? publicInfo.payType[0].type : undefined; let dialogPromise = null; const createOrder = () => { publicInfo.status = 'loading'; if(publicInfo.config.alipay && publicInfo.myPayType === 'alipay') { $http.post('/api/user/order/qrcode', { accountId: publicInfo.accountId, orderId: publicInfo.orderId, }).then(success => { publicInfo.myOrderId = success.data.orderId; publicInfo.qrCode = success.data.qrCode; publicInfo.status = 'pay'; interval = $interval(() => { $http.post('/api/user/order/status', { orderId: publicInfo.myOrderId, }).then(success => { const orderStatus = success.data.status; if(orderStatus === 'TRADE_SUCCESS' || orderStatus === 'FINISH') { publicInfo.status = 'success'; publicInfo.message = '订单会在两分钟内生效,请稍候'; interval && $interval.cancel(interval); } }); }, 5 * 1000); }).catch(() => { publicInfo.status = 'error'; }); } else { publicInfo.status = 'pay'; } const env = publicInfo.config.paypalMode === 'sandbox' ? 'sandbox' : 'production'; if(publicInfo.myPayType === 'paypal') { paypal.Button.render({ locale: $localStorage.language ? $localStorage.language.replace('-', '_') : 'zh_CN', style: { label: 'checkout', // checkout | credit | pay size: 'medium', // small | medium | responsive shape: 'rect', // pill | rect color: 'blue' // gold | blue | silver }, env, // production or sandbox commit: true, payment: function() { var CREATE_URL = '/api/user/paypal/create'; return paypal.request.post(CREATE_URL, { accountId: publicInfo.accountId, orderId: publicInfo.orderId, }) .then(function(res) { return res.paymentID; }); }, onAuthorize: function(data, actions) { var EXECUTE_URL = '/api/user/paypal/execute/'; var data = { paymentID: data.paymentID, payerID: data.payerID }; return paypal.request.post(EXECUTE_URL, data) .then(function (res) { publicInfo.status = 'success'; publicInfo.message = '订单会在两分钟内生效,请稍候'; }); } }, '#paypal-button-container'); } }; let interval = null; const close = () => { interval && $interval.cancel(interval); $mdDialog.hide(); }; publicInfo.createOrder = createOrder; publicInfo.close = close; const dialog = { templateUrl: `${ cdn }/public/views/dialog/pay.html`, escapeToClose: false, locals: { bind: publicInfo }, bindToController: true, fullscreen: false, controller: ['$scope', '$mdDialog', '$mdMedia', 'bind', function($scope, $mdDialog, $mdMedia, bind) { $scope.publicInfo = bind; $scope.setDialogWidth = () => { if($mdMedia('xs') || $mdMedia('sm')) { return {}; } return { 'min-width': '405px' }; }; $scope.getQrCodeSize = () => { if($mdMedia('xs') || $mdMedia('sm')) { return 200; } return 250; }; $scope.qrCode = () => { return $scope.publicInfo.qrCode || 'invalid qrcode'; }; $scope.pay = () => { window.location.href = $scope.publicInfo.qrCode; }; }], clickOutsideToClose: false, }; const choosePayType = account => { publicInfo.status = 'type'; publicInfo.account = account; publicInfo.accountId = account ? account.id : null; if(account) { publicInfo.orderId = account.orderId; } dialogPromise = $mdDialog.show(dialog); if(publicInfo.payType.length === 1) { publicInfo.jumpToPayPage(); } return dialogPromise; }; const chooseOrderType = () => { publicInfo.status = 'loading'; $http.get('/api/user/order/price', { params: { accountId: publicInfo.accountId } }).then(success => { publicInfo.orders = success.data.sort((a, b) => { if(a.baseId > 0 && b.baseId === 0) { return 1; } if(a.baseId === 0 && b.baseId > 0) { return -1; } return a[publicInfo.myPayType] >= b[publicInfo.myPayType]; }); if(publicInfo.orderId) { publicInfo.setOrder(publicInfo.orderId); } $timeout(() => { publicInfo.status = 'choose'; }, 125); }).catch(() => { publicInfo.status = 'error'; }); }; const giftCard = () => { publicInfo.status = 'giftcard'; }; const payByGiftCard = () => { publicInfo.status = 'loading'; $http.post('/api/user/giftcard/use', { accountId: publicInfo.accountId, password: publicInfo.giftCardPassword }).then(result => { const data = result.data; if (data.success) { publicInfo.status = 'success'; publicInfo.message = `充值码[ ${ publicInfo.giftCardPassword } ]使用成功`; publicInfo.giftCardPassword = ''; } else { publicInfo.status = 'error'; publicInfo.message = data.message; } }).catch(err => { publicInfo.status = 'error'; publicInfo.message = '充值出现错误'; }); }; const jumpToPayPage = () => { if(publicInfo.myPayType === 'giftcard') { giftCard(); } else { chooseOrderType(); } }; const showComment = () => { publicInfo.comment = publicInfo.selectedOrder.comment; if(!publicInfo.comment) { publicInfo.createOrder(); } else { publicInfo.status = 'comment'; publicInfo.time = 3; $interval(() => { if(publicInfo.time >= 1) { publicInfo.time--; } }, 1000, 3); } }; publicInfo.jumpToPayPage = jumpToPayPage; publicInfo.payByGiftCard = payByGiftCard; publicInfo.showComment = showComment; const setOrder = orderId => { publicInfo.selectedOrder = publicInfo.orders.filter(f => { return f.id === +orderId; })[0]; }; publicInfo.setOrder = setOrder; return { choosePayType, chooseOrderType, createOrder, }; }]);