Java tutorial
/* * 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; } }