org.skfiy.typhon.rnsd.service.impl.RechargingServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.skfiy.typhon.rnsd.service.impl.RechargingServiceImpl.java

Source

/*
 * Copyright 2015 The Skfiy Open Association.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.skfiy.typhon.rnsd.service.impl;

import com.alibaba.fastjson.JSONObject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.skfiy.typhon.rnsd.domain.OS;
import org.skfiy.typhon.rnsd.domain.Recharging;
import org.skfiy.typhon.rnsd.domain.Region;
import org.skfiy.typhon.rnsd.domain.Zucks;
import org.skfiy.typhon.rnsd.repository.RechargingRepository;
import org.skfiy.typhon.rnsd.service.RechargingException;
import org.skfiy.typhon.rnsd.service.RechargingService;
import org.skfiy.typhon.rnsd.service.RegionService;
import org.skfiy.typhon.rnsd.service.handler.RechargingBO;
import org.skfiy.typhon.rnsd.service.handler.RechargingHandler;
import org.skfiy.typhon.rnsd.service.handler.TradeValidatedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Kevin Zou <kevinz@skfiy.org>
 */
public class RechargingServiceImpl implements RechargingService {

    private static final Logger LOG = LoggerFactory.getLogger(RechargingService.class);

    @Resource
    private RegionService regionService;
    @Resource
    private RechargingRepository rechargingRepository;
    @Resource
    private Map<String, RechargingHandler> rechargingHandlers;

    private final String basicAuth;
    // 
    private final HttpClientBuilder HC_BUILDER = HttpClientBuilder.create();
    private final Map<OS, String> zucksKeys = new HashMap<>();

    private RechargingServiceImpl(String basicAuth) {
        this.basicAuth = basicAuth;

        zucksKeys.put(OS.ANDROID, "fa5396f7705881831269de56b921d6eb");
        zucksKeys.put(OS.IOS, "530e936ead86ffc313f2f3cbd8382d76");
    }

    @Transactional
    @Override
    public String recharge(JSONObject json) throws TradeValidatedException {
        RechargingBO rechargingBo = rechargingHandlers.get(json.getString("platform")).handle(json);
        LOG.debug("recharging info: {}", rechargingBo.getRecharging());

        rechargingRepository.save(rechargingBo.getRecharging());

        // ??
        sendToGameServer(rechargingBo.getRecharging());

        // ???
        rechargingBo.getRecharging().setStatus("S");
        return rechargingBo.getResult();
    }

    @Transactional
    @Override
    public void giveZucks(JSONObject json) throws TradeValidatedException {
        Zucks zucks = new Zucks();
        zucks.setOs(OS.valueOf(json.getString("os")));
        zucks.setZid(json.getString("id"));
        zucks.setPoint(json.getIntValue("point"));
        zucks.setUid(json.getString("userId"));

        // validate
        String sha1 = DigestUtils
                .sha1Hex(zucksKeys.get(zucks.getOs()) + zucks.getUid() + zucks.getPoint() + zucks.getZid());
        if (!json.getString("verify").equals(sha1)) {
            throw new TradeValidatedException(sha1, "verify failed");
        }

        rechargingRepository.save(zucks);

        Region region = regionService.loadAll().get(0);

        CloseableHttpClient hc = HC_BUILDER.build();
        HttpHost httpHost = new HttpHost(region.getIp(), region.getJmxPort());

        StringBuilder query = new StringBuilder();
        query.append(
                "/InvokeAction//org.skfiy.typhon.spi%3Aname%3DGMConsoleProvider%2Ctype%3Dorg.skfiy.typhon.spi.GMConsoleProvider/action=pushItem?action=pushItem");
        query.append("&uid%2Bjava.lang.String=").append(zucks.getUid());
        query.append("&iid%2Bjava.lang.String=").append("w036");
        query.append("&count%2Bjava.lang.String=").append(zucks.getPoint());

        HttpGet httpGet = new HttpGet(query.toString());
        httpGet.addHeader("Authorization", basicAuth);

        CloseableHttpResponse response = null;
        try {
            response = hc.execute(httpHost, httpGet);
        } catch (IOException ex) {
            LOG.error("host:port -> {}:{}", region.getIp(), region.getJmxPort(), ex);
            throw new RechargingException("send to game server error error", ex);
        } finally {
            try {
                hc.close();
            } catch (IOException ex) {
            }
        }

        if (response == null || response.getStatusLine().getStatusCode() != HttpStatus.OK.value()) {
            LOG.error("recharging failed. {}", response);
            throw new RechargingException("recharging failed");
        }
    }

    private void sendToGameServer(Recharging recharging) {
        Region region = regionService.load(Integer.parseInt(recharging.getRegion()));

        CloseableHttpClient hc = HC_BUILDER.build();
        HttpHost httpHost = new HttpHost(region.getIp(), region.getJmxPort());

        StringBuilder query = new StringBuilder();
        query.append(
                "/InvokeAction//org.skfiy.typhon.spi%3Aname%3DGMConsoleProvider%2Ctype%3Dorg.skfiy.typhon.spi.GMConsoleProvider/action=recharge?action=recharge");
        query.append("&rid%2Bjava.lang.String=").append(recharging.getUid());
        query.append("&cash%2Bjava.lang.String=").append(recharging.getGoods());

        HttpGet httpGet = new HttpGet(query.toString());
        httpGet.addHeader("Authorization", basicAuth);

        CloseableHttpResponse response = null;
        try {
            response = hc.execute(httpHost, httpGet);
        } catch (IOException ex) {
            LOG.error("host:port -> {}:{}", region.getIp(), region.getJmxPort(), ex);
            throw new RechargingException("send to game server error error", ex);
        } finally {
            try {
                hc.close();
            } catch (IOException ex) {
            }
        }

        if (response == null || response.getStatusLine().getStatusCode() != HttpStatus.OK.value()) {
            LOG.error("recharging failed. {}", response);
            throw new RechargingException("recharging failed");
        }
    }

}