|
|
#encoding=utf-8
|
|
|
# 云启训练场(EduCoder)个人版 产品编码(appId) 9200108
|
|
|
# 产品名称 计费类型 套餐编码
|
|
|
# 云启训练场(EduCoder)个人版 固定包月 9200108001
|
|
|
# 固定包月 9200108002
|
|
|
# 固定包月 9200108003
|
|
|
# ---------------------------------------------------
|
|
|
# 产品名称 计费类型 套餐编码
|
|
|
# 云启训练场(EduCoder))院校版 包月+按license 9200109001
|
|
|
# 包月+按license 9200109002
|
|
|
|
|
|
# 云启训练场(EduCoder))院校版 产品编码(appId) 9200109
|
|
|
|
|
|
require 'net/http'
|
|
|
require 'digest'
|
|
|
|
|
|
class EcloudController < ApplicationController
|
|
|
skip_before_filter :verify_authenticity_token
|
|
|
|
|
|
before_filter :check_sign, only: [:ps_new, :ps_update, :bs_new, :bs_update]
|
|
|
before_filter :save_para
|
|
|
|
|
|
before_filter :user_setup
|
|
|
# before_filter :require_login, only: [:authorize]
|
|
|
|
|
|
|
|
|
skip_before_filter :verify_authenticity_token, only: [:ps_new, :ps_update, :bs_new, :bs_update, :ecloud_login_callback]
|
|
|
|
|
|
def index
|
|
|
render file: 'public/react-oschina/build/index.html', :layout => false
|
|
|
end
|
|
|
|
|
|
def trustie_login
|
|
|
end
|
|
|
|
|
|
CLIENT_ID = '1022'
|
|
|
CLIENT_SECRET = '2112037a-6d7a-432b-9081-feb1153d8668'
|
|
|
ROOT_URl = 'http://localhost:3000'
|
|
|
SERVER_URL = "https://221.176.54.92:9081/restful/services/"
|
|
|
|
|
|
## 签名
|
|
|
def sign(timestamp)
|
|
|
Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}").upcase
|
|
|
end
|
|
|
|
|
|
|
|
|
# 企业/个人业务开通
|
|
|
# applyno 申请单号,唯一
|
|
|
# ecordercode 唯一标志一个企业的订购关系
|
|
|
# params['opttype']:操作类型。0开通;1变更;2试用转商用;4再次开通
|
|
|
# 业务列表opttype: 0新增;1注销;2修改
|
|
|
# serviceparas: 但是由于企业版是按成员收费的,所以serviceparas里面会传成员数;个人版是包月计费的,serviceparas不会传成员数
|
|
|
def bs_new
|
|
|
ActiveRecord::Base.transaction do
|
|
|
begin
|
|
|
if params['opttype'] == 0 # 开通企业/个人业务
|
|
|
ecloud = Ecloud.create!(eloud_params)
|
|
|
create_service(params['services'], ecloud.try(:id))
|
|
|
create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present?
|
|
|
# 为管理员添加一条记录
|
|
|
# 开通的时候都是用户的opttype也是0
|
|
|
EcloudUser.create!(custid: params['custid'], opttype: params['opttype'], userid: params['userid'],
|
|
|
username: params['username'], useralias: params['useralias'],
|
|
|
mobile: params['mobile'], email: params['email'], begintime: params['begintime'],
|
|
|
endtime: params['endtime'])
|
|
|
elsif params['opttype'] == 2 # 试用转商用 # 变更企业/个人业务
|
|
|
# 业务列表:注销业务(注销试用的套餐),另一个业务项的操作代码是:新增业务(开通商用的套餐)
|
|
|
# 需要通过产品服务编号和业务编码来区分哪个产品
|
|
|
ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'], trial: true).first
|
|
|
|
|
|
# 注销试用的套餐
|
|
|
## 需要注销的套餐; 试用转商用是不会有批量操作的,所以可以使用first
|
|
|
des_service = params['services'].select{|s| s['opttype'] == 1}.first
|
|
|
esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: des_service['code']).first
|
|
|
ecloud.update_attribute(:trial, params['trial'])
|
|
|
esd.update_attributes!(opttype: des_service['opttype'], begintime: des_service['begintime'], endtime: des_service['endtime'])
|
|
|
|
|
|
# 试用转商用是不会有批量操作的
|
|
|
# 新增业务
|
|
|
add_service = params['services'].select{|s| s['opttype'] == 0}
|
|
|
create_service(add_service, ecloud.try(:id))
|
|
|
#
|
|
|
|
|
|
elsif params['opttype'] == 1 # 业务变更
|
|
|
ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first
|
|
|
# 套餐变更
|
|
|
# 新增业务
|
|
|
add_service = params['services'].select{|s| s['opttype'] == 0}
|
|
|
create_service(add_service, ecloud.try(:id)) if add_service.present?
|
|
|
|
|
|
# 如果有注销业务,注销业务
|
|
|
des_services = params['services'].select{|s| s['opttype'] == 1}
|
|
|
if des_services.present?
|
|
|
des_services.each do |ds|
|
|
|
esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: ds['code']).first
|
|
|
esd.update_attributes!(opttype: ds['opttype'], begintime: ds['begintime'], endtime: ds['endtime'])
|
|
|
end
|
|
|
end
|
|
|
|
|
|
# 变更业务
|
|
|
edt_services = params['services'].select{|s| s['opttype'] == 2}
|
|
|
if edt_services.present?
|
|
|
edt_services.each do |es|
|
|
|
ese = EcloudService.where(ecloud_id: ecloud.try(:id), code: es['code']).first
|
|
|
ese.update_attributes!(opttype: es['opttype'], begintime: es['begintime'], endtime: es['endtime'])
|
|
|
create_serviceparas es['serviceparas'].first, ese.id
|
|
|
end
|
|
|
end
|
|
|
|
|
|
|
|
|
# ecloud = Ecloud.where(bossorderid: params['bossorderid']).first
|
|
|
# ecloud.update_attributes!(eloud_params)
|
|
|
# ecloud.ecloud_productparas.destroy
|
|
|
# ecloud.ecloud_services.destroy
|
|
|
#
|
|
|
# ecloud_id = ecloud.try(:id)
|
|
|
|
|
|
elsif params['opttype'] == 4 # 再次重复开通
|
|
|
ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first
|
|
|
create_service(params['services'], ecloud.try(:id))
|
|
|
create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present?
|
|
|
end
|
|
|
|
|
|
#
|
|
|
# # 非试用情况下,为管理员单独创建一条账号,企业账号
|
|
|
# unless params['trial']
|
|
|
# EcloudUser.create!(ecloud_id: ecloud.try(:id), opttype: params['opttype'], userid: params['userid'],
|
|
|
# username: params['username'], useralias: params['useralias'],
|
|
|
# mobile: params['mobile'], email: params['email'])
|
|
|
# end
|
|
|
|
|
|
render :json => {result: true, errmsg: ""}
|
|
|
rescue Exception => e
|
|
|
logger.error(e.message)
|
|
|
render :json => {code: 500, msg: "#{e.message}"}
|
|
|
raise ActiveRecord::Rollback
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
# 企业/个人业务变更、注销
|
|
|
# 处理业务平台退订、暂停(欠费暂停,信控暂停等)、暂停后恢复应用业务
|
|
|
# 这个接口是不会新增业务的
|
|
|
# 试用退订的时候bossorderid传空字符
|
|
|
def bs_update
|
|
|
ActiveRecord::Base.transaction do
|
|
|
begin
|
|
|
case params['opttype']
|
|
|
when 0 # 退订
|
|
|
opttype = 6
|
|
|
when 1 # 暂停
|
|
|
opttype = 7
|
|
|
when 2 # 恢复
|
|
|
opttype = 8
|
|
|
end
|
|
|
if params['bossorderid'].present?
|
|
|
ecloud = Ecloud.where(bossorderid: params['bossorderid']).first
|
|
|
ecloud.update_attribute(:opttype, opttype)
|
|
|
else
|
|
|
# 试用退订
|
|
|
params['services'].each do |service|
|
|
|
ecloud_id = EcloudService.where(code: service['packagecode']).first.try(:ecloud_id)
|
|
|
Ecloud.find(ecloud_id).update_attribute(:opttype, opttype)
|
|
|
end
|
|
|
end
|
|
|
render :json => {result: true, errmsg: ""}
|
|
|
rescue Exception => e
|
|
|
logger.error(e.message)
|
|
|
render :json => {code: 500, msg: "#{e.message}"}
|
|
|
raise ActiveRecord::Rollback
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
# 用户业务开通与变更接口
|
|
|
# 授权statu为1,取消授权status为0
|
|
|
# user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复;
|
|
|
|
|
|
def ps_new
|
|
|
ActiveRecord::Base.transaction do
|
|
|
begin
|
|
|
user_params = params['users']
|
|
|
user_params.each do |user_param|
|
|
|
if user_param['opttype'] == 0 # 开通
|
|
|
EcloudUser.create!(custid: params['custid'], opttype: user_param['opttype'], userid: user_param['userid'],
|
|
|
username: user_param['username'], useralias: user_param['useralias'],
|
|
|
mobile: user_param['mobile'], email: user_param['email'], begintime: user_param['begintime'].to_s,
|
|
|
endtime: user_param['endtime'].to_s)
|
|
|
elsif user_param['opttype'] == 1 # 变更
|
|
|
ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first
|
|
|
ecloud_user.update_attributes!(opttype: user_param['opttype'], username: user_param['username'],
|
|
|
useralias: user_param['useralias'], mobile: user_param['mobile'], email: user_param['email'],
|
|
|
begintime: user_param['begintime'].to_s, endtime: user_param['endtime'].to_s)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
render :json => {success: true, errmsg: ""}
|
|
|
# end
|
|
|
rescue Exception => e
|
|
|
logger.error(e.message)
|
|
|
render :json => {code: 500, msg: "#{e.message}"}
|
|
|
raise ActiveRecord::Rollback
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
# 用户业务状态变更
|
|
|
# user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复;
|
|
|
def ps_update
|
|
|
begin
|
|
|
user_params = params['users']
|
|
|
user_params.each do |user_param|
|
|
|
case user_param['opttype']
|
|
|
when 0 # 取消授权
|
|
|
opttype = 3
|
|
|
when 1 # 暂停
|
|
|
opttype = 4
|
|
|
when 2 # 恢复
|
|
|
opttype = 5
|
|
|
end
|
|
|
ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first
|
|
|
ecloud_user.update_attributes!(opttype: opttype, operatime: params['operatime'], effecttime: params['effecttime'])
|
|
|
end
|
|
|
|
|
|
render :json => {success: true, errmsg: ""}
|
|
|
rescue Exception => e
|
|
|
logger.error(e.message)
|
|
|
render :json => {code: 500, msg: "#{e.message}"}
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def ecloud_login_callback
|
|
|
|
|
|
unless params["test"] == 'true'
|
|
|
#获取code
|
|
|
logger.info "oauth2 login_callback: #{params}"
|
|
|
|
|
|
raise "没有code" unless params[:code]
|
|
|
|
|
|
url = "#{SERVER_URL}/oauth2/authorization?grant_type=authorization_code" +
|
|
|
"&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}"
|
|
|
|
|
|
res = post(url)
|
|
|
logger.info "oauth2 authorization resp: #{res}"
|
|
|
# {"access_token":"ae673b2d-88b4-46cc-aa74-0b031f24b76f","expires":6,"refresh_token":"7380cc67-a59c-4c21-9000-70e12a58d175","username":"15111030087@QW_er","uid":2147}
|
|
|
|
|
|
body = decode(res)
|
|
|
|
|
|
raise '登录失败' unless body["access_token"]
|
|
|
|
|
|
#获取此用户信息
|
|
|
res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}")
|
|
|
logger.info "oauth2 get user info: #{res}"
|
|
|
# {"userid":2147,"custid":2104,"custcode":"E0002018042810010054","custtype":2,"status":2,"username":"15111030087@QW_er","useralias":"15111030087","isadmin":true,"entprise":"04**004","departments":"","departmentnames":"","mobile":"15365386520","email":"15111030087@139.com"}
|
|
|
else
|
|
|
res = '{"userid":2147,"custid":2104,"custcode":"E0002018042810010054","custtype":2,"status":2,"username":"15111030087@QW_er","useralias":"15111030087","isadmin":true,"entprise":"04**004","departments":"","departmentnames":"","mobile":"15365386520","email":"15111030087@139.com"}'
|
|
|
end
|
|
|
|
|
|
|
|
|
# 同步用户
|
|
|
info = decode(res)
|
|
|
|
|
|
user = User.find_by_ecoder_user_id(info["userid"])
|
|
|
unless user
|
|
|
#新建用户
|
|
|
user = User.create_with_ecoder!(info)
|
|
|
end
|
|
|
|
|
|
self.logged_user = user
|
|
|
|
|
|
user = UserExtensions.where(:user_id => User.current.id).first
|
|
|
if user.gender.nil? || user.school_id.nil? || User.current.lastname.nil?
|
|
|
redirect_to my_account_path
|
|
|
elsif user.identity == 3 && user.school_id.nil?
|
|
|
redirect_to my_account_path
|
|
|
else
|
|
|
redirect_to User.current
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
private
|
|
|
def get(url)
|
|
|
uri = URI(url)
|
|
|
|
|
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
|
http.use_ssl = url.start_with?('https')
|
|
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
|
request = Net::HTTP::Get.new(uri.request_uri)
|
|
|
request['Content-Type'] = 'application/json'
|
|
|
request['Accept'] = 'application/json'
|
|
|
response = http.request(request)
|
|
|
|
|
|
response.body
|
|
|
end
|
|
|
|
|
|
def post(url)
|
|
|
uri = URI(url)
|
|
|
|
|
|
http = Net::HTTP.new(uri.host, uri.port)
|
|
|
http.use_ssl = url.start_with?('https')
|
|
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
|
request = Net::HTTP::Post.new(uri.request_uri)
|
|
|
request['Content-Type'] = 'application/json'
|
|
|
request['Accept'] = 'application/json'
|
|
|
response = http.request(request)
|
|
|
|
|
|
response.body
|
|
|
end
|
|
|
|
|
|
def decode(s)
|
|
|
begin
|
|
|
obj = ActiveSupport::JSON.decode(s)
|
|
|
rescue ActiveSupport::JSON.parse_error
|
|
|
logger.error("Attempted to decode invalid JSON: #{s}")
|
|
|
end
|
|
|
end
|
|
|
|
|
|
private
|
|
|
def eloud_params
|
|
|
return {applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'],
|
|
|
trial: params['trial'], bossorderid: params['bossorderid'], custid: params['custid'], custtype: params['custtype'],
|
|
|
custcode: params['custcode'], registersource: params['registersource'], custname: params['custname'],
|
|
|
userid: params['userid'], username: params['username'], useralias: params['useralias'], mobile: params['mobile'],
|
|
|
email: params['email'], productcode: params['productcode'], begintime: params['begintime'],
|
|
|
endtime: params['endtime']}
|
|
|
end
|
|
|
|
|
|
# 新增套餐
|
|
|
def create_service services, ecloud_id
|
|
|
services.each do |service|
|
|
|
ese = EcloudService.create!(opttype: service['opttype'], code: service['code'], begintime: service['begintime'],
|
|
|
endtime: service['endtime'], ecloud_id: ecloud_id)
|
|
|
if service['serviceparas'].present?
|
|
|
create_serviceparas(service['serviceparas'].first, ese.id)
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def create_serviceparas params_serviceparas, ese_id
|
|
|
if params_serviceparas.present?
|
|
|
EcloudServieceServicepara.create(key: params_serviceparas['key'], value: params_serviceparas['value'], ecloud_service_id: ese_id)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def create_product_params params, ecloud_id
|
|
|
params.each do |p|
|
|
|
EcloudProductpara.create(key: p['key'], value: p['value'], ecloud_id: ecloud_id)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def check_sign
|
|
|
sign = sign(params['timestamp'])
|
|
|
if sign != params['sign']
|
|
|
render :json => {code: 501, msg: "sign的值错误"}
|
|
|
return
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def save_para
|
|
|
EcloudLog.create(url: request.url, para_value: params, applyno: params['applyno'], custid: params['custid'],
|
|
|
custcode: params['custcode'], userid: params['userid'], username: params['username'])
|
|
|
end
|
|
|
|
|
|
end
|