com.greenline.guahao.biz.manager.partners.xm.impl.XmManagerImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.greenline.guahao.biz.manager.partners.xm.impl.XmManagerImpl.java

Source

/*
 * Project: guahao-portal-biz-core
 * 
 * File Created at 2014-4-8
 * 
 * Copyright 2012 Greenline.com Corporation Limited.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * Greenline Company. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Greenline.com.
 */
package com.greenline.guahao.biz.manager.partners.xm.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.httpclient.Header;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

import com.greenline.framework.http.HttpClientManager;
import com.greenline.guahao.biz.manager.cache.JackJsonUtil;
import com.greenline.guahao.biz.manager.common.LocalResponseDO;
import com.greenline.guahao.biz.manager.common.LocalResponseDO.LocalResponseCode;
import com.greenline.guahao.biz.manager.order.dataobject.OrderDO;
import com.greenline.guahao.biz.manager.partners.xm.XmManager;
import com.greenline.guahao.biz.manager.partners.xm.config.XmConstants;
import com.greenline.guahao.biz.manager.partners.xm.converter.XmConverter;
import com.greenline.guahao.biz.manager.partners.xm.dataobject.XmOrderDataDO;
import com.greenline.guahao.biz.manager.partners.xm.dataobject.XmRequestDO;
import com.greenline.guahao.biz.manager.partners.xm.dataobject.XmResponseDO;
import com.greenline.guahao.biz.manager.partners.xm.dataobject.XmResponseOfPushOrderDO;
import com.greenline.guahao.biz.manager.partners.xm.reference.CoderUtils;
import com.greenline.guahao.biz.manager.partners.xm.reference.XMApiHttpClient;
import com.greenline.guahao.biz.manager.partners.xm.reference.XMHttpClient;
import com.greenline.guahao.biz.manager.partners.xm.reference.XMUtil;
import com.greenline.guahao.biz.util.HttpClientUtil;

/**
 * @Type XmManagerImpl
 * @Desc ?
 * @author alex
 * @date 2014-4-8
 * @Version V1.0
 */
public class XmManagerImpl implements XmManager {
    public static final Log log = LogFactory.getLog(XmManagerImpl.class);
    @Resource
    private HttpClientManager httpClientManager;
    @Resource
    private JackJsonUtil jackjson;

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.greenline.guahao.biz.manager.partners.xm.XmManager#getAuthByCode(
     * com.greenline.guahao.biz.manager.common.LocalResponseDO,
     * com.greenline.guahao.biz.manager.partners.xm.dataobject.XmRequestDO)
     */
    @Override
    public XmResponseDO getAuthByCode(LocalResponseDO<Object> lrd, XmRequestDO req) {
        String logObjName = "??????";
        HttpClient client = httpClientManager.getHttpClient();
        String json = HttpClientUtil.httpSendByGet(lrd, XmConstants.URL_AUTH, buildParamsForGetAuthByCode(req),
                logObjName, client);
        if (lrd.isSuccess()) {
            log.info(logObjName + "?");
        } else {
            log.error(String.format("%s(?:%s)%s|%s|%s", logObjName, jackjson.writeString(req), json,
                    lrd.getMessage(), lrd.getProfessionalInfo()));
        }
        return null;
    }

    private List<NameValuePair> buildParamsForGetAuthByCode(XmRequestDO req) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("client_id", XmConstants.APP_ID));
        params.add(new BasicNameValuePair("redirect_uri", HttpClientUtil.URLEncode(XmConstants.URL_AUTH_REDIRECT)));
        params.add(new BasicNameValuePair("response_type", XmConstants.RESPONSE_TYPE_CODE));
        params.add(new BasicNameValuePair("state", req.getState()));
        params.add(new BasicNameValuePair("skip_confirm", req.getSkipConfirm().toString()));
        return params;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.greenline.guahao.biz.manager.partners.xm.XmManager#getAccessTokenByCode
     * (com.greenline.guahao.biz.manager.common.LocalResponseDO,
     * com.greenline.guahao.biz.manager.partners.xm.dataobject.XmRequestDO)
     */
    @Override
    public XmResponseDO getAccessTokenByCode(LocalResponseDO<Object> lrd, XmRequestDO req) {
        XmResponseDO resp = null;
        String logObjName = "?????";
        HttpClient client = httpClientManager.getHttpClient();
        String json = HttpClientUtil.httpSendByGet(lrd, XmConstants.URL_GET_ACCESS_TOKEN,
                buildParamsForGetAccessTokenByCode(req), logObjName, client);
        if (lrd.isSuccess()) {
            log.info(String.format("%s?%s", logObjName, json));
            if (null != json) {
                json = json.replaceFirst("&&&START&&&", "");
                resp = jackjson.read(json, XmResponseDO.class);
                if (StringUtils.isBlank(resp.getError())) {
                    log.info(String.format("%s?%s%s", logObjName, req, json));
                } else {
                    String info = String.format(
                            "%s?%s; ???%s; ??%s; ?%s; %s",
                            logObjName, resp.getError(), XmConstants.getError(resp.getError()),
                            resp.getError_description(), req, json);
                    log.error(info);
                    lrd.setResult(LocalResponseCode.REMOTE_ERROR, String.format("%s", logObjName), info);
                }
            }
        } else {
            log.error(String.format("%s(?:%s)%s|%s|%s", logObjName, jackjson.writeString(req), json,
                    lrd.getMessage(), lrd.getProfessionalInfo()));
        }
        return resp;
    }

    private List<NameValuePair> buildParamsForGetAccessTokenByCode(XmRequestDO req) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("client_id", XmConstants.APP_ID));
        params.add(new BasicNameValuePair("redirect_uri", XmConstants.URL_AUTH_REDIRECT));
        params.add(new BasicNameValuePair("client_secret", XmConstants.APP_SECRET));
        params.add(new BasicNameValuePair("grant_type", XmConstants.GRANT_TYPE_CODE));
        params.add(new BasicNameValuePair("code", req.getCode()));
        params.add(new BasicNameValuePair("token_type", XmConstants.TOKEN_TYPE_MAC));
        return params;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.greenline.guahao.biz.manager.partners.xm.XmManager#getUserProfile
     * (com.greenline.guahao.biz.manager.common.LocalResponseDO,
     * com.greenline.guahao.biz.manager.partners.xm.dataobject.XmRequestDO)
     */
    @Override
    public XmResponseDO getUserProfile(LocalResponseDO<Object> lrd, XmRequestDO req) {
        XmResponseDO resp = null;
        String logObjName = "????";
        req.setUri(XmConstants.URI_GET_USER_PROFILE);
        resp = callXmApi(lrd, req, logObjName);
        if (lrd.isSuccess()) {
            if (!resp.callApiOk()) {
                String info = String.format(
                        "%s?%s; ???%s; ??%s; ?%s; %s;",
                        logObjName, resp.getCode(), XmConstants.getError(resp.getCode()), resp.getDescription(),
                        jackjson.writeString(req), jackjson.writeString(resp));
                log.error("\n" + info);
                lrd.setResult(LocalResponseCode.REMOTE_ERROR, String.format("%s", logObjName), info);
            }
        }
        return resp;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.greenline.guahao.biz.manager.partners.xm.XmManager#getUserPhone(com
     * .greenline.guahao.biz.manager.common.LocalResponseDO,
     * com.greenline.guahao.biz.manager.partners.xm.dataobject.XmRequestDO)
     */
    @Override
    public XmResponseDO getUserPhone(LocalResponseDO<Object> lrd, XmRequestDO req) {
        XmResponseDO resp = null;
        String logObjName = "????";
        req.setUri(XmConstants.URI_GET_USER_PHONE);
        resp = callXmApi(lrd, req, logObjName);
        if (lrd.isSuccess()) {
            if (!resp.callApiOk()) {
                String info = String.format(
                        "%s?%s; ???%s; ??%s; ?%s; %s;",
                        logObjName, resp.getCode(), XmConstants.getError(resp.getCode()), resp.getDescription(),
                        jackjson.writeString(req), jackjson.writeString(resp));
                log.error("\n" + info);
                lrd.setResult(LocalResponseCode.REMOTE_ERROR, String.format("%s", logObjName), info);
            }
        }
        return resp;
    }

    /**
     * ?api
     * 
     * @param lrd
     * @param req
     * @return
     */
    private XmResponseDO callXmApi(LocalResponseDO<Object> lrd, XmRequestDO req, String logObjName) {
        XmResponseDO result = null;
        try {
            List<Header> headers = new ArrayList<Header>();
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("clientId", XmConstants.APP_ID));
            params.add(new BasicNameValuePair("token", req.getToken()));

            String nonce = XMUtil.generateNonce();
            String qs = URLEncodedUtils.format(params, "UTF-8");
            String mac = XMUtil.getMacAccessTokenSignatureString(nonce, "GET", XmConstants.HOST_XM_API,
                    req.getUri(), qs, req.getMacKey(), req.getMacAlgorithm());
            Header macHeader = XMUtil.buildMacRequestHead(req.getToken(), nonce, mac);
            headers.add(macHeader);
            XMApiHttpClient client = new XMApiHttpClient(new Long(XmConstants.APP_ID).longValue(), req.getToken(),
                    new XMHttpClient());
            JSONObject json = client.apiCall(req.getUri(), params, headers, "GET");
            result = jackjson.read(String.valueOf(json), XmResponseDO.class);
        } catch (Exception e) {
            String info = String.format(logObjName + "?%s", jackjson.writeString(req));
            log.error(info, e);
            lrd.setResult(LocalResponseCode.LOCAL_EXCEPTION, info, info + "," + e.getMessage());
        }
        return result;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.greenline.guahao.biz.manager.partners.xm.XmManager#getAuthByCodeUrl
     * (com.greenline.guahao.biz.manager.common.LocalResponseDO,
     * com.greenline.guahao.biz.manager.partners.xm.dataobject.XmRequestDO)
     */
    @Override
    public String getAuthByCodeUrl(LocalResponseDO<Object> lrd, XmRequestDO req) {
        return HttpClientUtil.buildUrl(XmConstants.URL_AUTH, buildParamsForGetAuthByCode(req));
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.greenline.guahao.biz.manager.partners.xm.XmManager#pushOrderInfo(
     * com.greenline.guahao.biz.manager.order.dataobject.OrderDO)
     */
    @Override
    public boolean pushOrderInfo(String xmUserId, String accessToken, OrderDO... orders) {
        boolean suc = false;
        String logObjName = "\n?????";
        HttpClient client = httpClientManager.getHttpClient();
        LocalResponseDO<Object> lrd = new LocalResponseDO<Object>();
        String data = getPushOrderData(xmUserId, accessToken, orders);

        String json = HttpClientUtil.httpSendByPost(lrd, XmConstants.URL_PUSH_ORDER_INFO,
                buildParamsForPushOrderInfo(data), logObjName, client);

        if (lrd.isSuccess()) {
            log.info(String.format("%s?%s", logObjName, json));
            XmResponseOfPushOrderDO resp = jackjson.read(json, XmResponseOfPushOrderDO.class);
            if (resp.callApiOk()) {
                suc = true;
            } else {
                log.error(String.format(
                        "%s?%s???%s; ??%s?:%s%s",
                        logObjName, resp.getCode(), XmConstants.getError(resp.getCode()), resp.getDescription(),
                        jackjson.writeString(orders), json));
            }
        } else {
            log.error(String.format("%s(?:%s)%s|%s|%s", logObjName, jackjson.writeString(orders),
                    json, lrd.getMessage(), lrd.getProfessionalInfo()));
        }
        return suc;
    }

    private List<NameValuePair> buildParamsForPushOrderInfo(String data) {
        List<NameValuePair> params = buildParamsForPushOrderSign(data);
        params.add(new BasicNameValuePair("sign", getPushOrderSign(params)));
        params.add(new BasicNameValuePair("appkey", XmConstants.APP_KEY));
        return params;
    }

    private List<NameValuePair> buildParamsForPushOrderSign(String data) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("clientId", XmConstants.APP_ID));
        params.add(new BasicNameValuePair("data", data));
        params.add(new BasicNameValuePair("orderType", XmConstants.ORDER_TYPE));
        return params;
    }

    /**
     * ?????
     * 
     * @return
     */
    private String getPushOrderSign(List<NameValuePair> params) {
        StringBuffer ps = new StringBuffer();
        for (NameValuePair p : params) {
            ps.append(p.getName()).append(p.getValue());
        }
        String codes = String.format("%s%s%s", XmConstants.APP_KEY, ps, XmConstants.APP_SECRET);
        log.info(String.format("\n???%s", codes));
        String sign = DigestUtils.shaHex(codes).toUpperCase();
        log.info(String.format("\n???%s", sign));
        return sign;
    }

    /**
     * ????
     * 
     * @param orders
     * @return
     */
    private String getPushOrderData(String xmUserId, String accessToken, OrderDO... orders) {
        XmOrderDataDO orderData = new XmOrderDataDO();
        if (null != orders && orders.length > 0) {
            int count = 0;
            for (OrderDO o : orders) {
                if (null != o) {
                    orderData.getOrderList().add(XmConverter.convertToXmOrderDO(o, xmUserId, accessToken));
                    ++count;
                }
            }
            orderData.setOrderCount(count);
        }
        String json = jackjson.writeString(orderData);
        log.info(String.format("\n????%s", json));
        String encode = CoderUtils.base64AesEncode(json, XmConstants.APP_SECRET);
        log.info(String.format("\n????%s", encode));
        return encode;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.greenline.guahao.biz.manager.partners.xm.XmManager#
     * getAccessTokenByRefresh
     * (com.greenline.guahao.biz.manager.common.LocalResponseDO,
     * com.greenline.guahao.biz.manager.partners.xm.dataobject.XmRequestDO)
     */
    @Override
    public XmResponseDO getAccessTokenByRefreshToken(LocalResponseDO<Object> lrd, XmRequestDO req) {
        XmResponseDO resp = null;
        String logObjName = "???";
        HttpClient client = httpClientManager.getHttpClient();
        String json = HttpClientUtil.httpSendByGet(lrd, XmConstants.URL_GET_ACCESS_TOKEN,
                buildParamsForGetAccessTokenByRefreshToken(req), logObjName, client);
        if (lrd.isSuccess()) {
            log.info(String.format("%s?%s", logObjName, json));
            if (null != json) {
                json = json.replaceFirst("&&&START&&&", "");
            }
            resp = jackjson.read(json, XmResponseDO.class);
        } else {
            log.error(String.format("%s(?:%s)%s|%s|%s", logObjName, jackjson.writeString(req), json,
                    lrd.getMessage(), lrd.getProfessionalInfo()));
        }
        return resp;
    }

    private List<NameValuePair> buildParamsForGetAccessTokenByRefreshToken(XmRequestDO req) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("client_id", XmConstants.APP_ID));
        params.add(new BasicNameValuePair("redirect_uri", XmConstants.URL_AUTH_REDIRECT));
        params.add(new BasicNameValuePair("client_secret", XmConstants.APP_SECRET));
        params.add(new BasicNameValuePair("grant_type", XmConstants.GRANT_TYPE_REFRESH_TOKEN));
        params.add(new BasicNameValuePair("refresh_token", req.getRefresh_token()));
        params.add(new BasicNameValuePair("token_type", XmConstants.TOKEN_TYPE_MAC));
        return params;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.greenline.guahao.biz.manager.partners.xm.XmManager#getAccessToken
     * (com.greenline.guahao.biz.manager.common.LocalResponseDO,
     * com.greenline.guahao.biz.manager.partners.xm.dataobject.XmResponseDO)
     */
    @Override
    public String getAccessToken(LocalResponseDO<XmResponseDO> lrd, XmResponseDO old) {
        String accessToken = "";
        if (null != old) {
            if (null != old.getAccessTokenEndTime() && Calendar.getInstance().after(old.getAccessTokenEndTime())) { // ?
                LocalResponseDO<Object> lrd_in = new LocalResponseDO<Object>();
                XmRequestDO req = new XmRequestDO();
                req.setRefresh_token(old.getRefresh_token());
                XmResponseDO newResp = getAccessTokenByRefreshToken(lrd_in, req);
                if (lrd_in.isSuccess()) {
                    lrd.setData(newResp);
                    accessToken = newResp.getAccess_token();
                } else {
                    log.error(String.format(
                            "???%s?%s??%s,%s",
                            jackjson.writeString(old), lrd_in.getCode(), lrd_in.getMessage(),
                            lrd_in.getProfessionalInfo()));
                    lrd.setResult(lrd_in.getCode(), lrd_in.getMessage(), lrd_in.getProfessionalInfo());
                }
            } else {
                accessToken = old.getAccess_token();
            }
        }
        return accessToken;
    }
}