#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再次开通 def bs_new ActiveRecord::Base.transaction do begin ecloud_id = 0 if params['opttype'] == 0 # 开通企业/个人业务 ecloud = Ecloud.create!(eloud_params) ecloud_id = ecloud.try(:id) elsif params['opttype'] == 2 # 试用转商用 # 变更企业/个人业务 ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode']).first ecloud.update_attributes!(eloud_params) ecloud.ecloud_productparas.destroy ecloud.ecloud_services.destroy ecloud_id = ecloud.try(:id) elsif params['opttype'] == 1 # 业务变更 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 # 再次重复开通 REDO ecloud = Ecloud.where(bossorderid: params['bossorderid']).first end # 业务列表 services = params['services'] if services.present? services.each do |service| es = EcloudService.create(opttype: service['opttype'], code: service['code'], begintime: service['begintime'], endtime: service['endtime'], ecloud_id: ecloud_id) if service['serviceparas'].present? service['serviceparas'].each do |servicepara| EcloudServieceServicepara.create!(ecloud_service_id: es.id, key: servicepara['key'], value: servicepara['value']) end end end end # 应用开通参数 productparas = params['productparas'] if productparas.present? productparas.each do |productpara| EcloudProductpara.create!(key: productpara['key'], value: productpara['value'], ecloud_id: ecloud_id) end 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 # 企业/个人业务变更、注销 def bs_update ActiveRecord::Base.transaction do begin ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode']).first ecloud.update_attributes!(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'], custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'], operatime: params['operatime'], effecttime: params['effecttime']) services = params['services'].first ecloud.ecloud_service.update_attributes!(packagecode: services['packagecode'], bossorderid: services['bossorderid']) 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 def ps_new begin user_params = params['users'] user_params.each do |user_param| 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, status: 1) end render :json => {success: true, errmsg: ""} # end rescue Exception => e logger.error(e.message) render :json => {code: 500, msg: "#{e.message}"} end end # 用户业务状态变更 # 授权statu为1,取消授权status为0 def ps_update begin user_params = params['users'] user_params.each do |user_param| ecloud_user = EcloudUser.where(userid: user_param['userid'], status: 1).first ecloud_user.update_attributes(opttype: user_param['opttype'], userid: user_param['userid'], status: 0) end render :json => {success: true, errmsg: ""} # else # render :json => {code: 404, msg: "企业ID不存在"} # end rescue Exception => e logger.error(e.message) render :json => {code: 500, msg: "#{e.message}"} end end def ecloud_login_callback #获取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}" body = decode(res) #{"access_token":"21a80f20ff736b54aecd002b60210943","token_type":"bearer","expires_in":86400,"refresh_token":"be92e2c137a8c6dd22f0d8c4a622b3aeceb054087a95d293130f04ec60fd3e3f","scope":"user_info","created_at":1542684088} raise '登录失败' unless body["access_token"] #获取此用户信息 # res = get("https://gitee.com/api/v5/user?access_token=#{body["access_token"]}") res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}") logger.info "oauth2 get user info: #{res}" # 同步用户 # info = decode(res) # # user = User.find_by_oschina_user_id(info["id"]) # unless user # user = User.create_with_oschina!(info) # end # # @current_user = user render :index 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 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']) end end