package edu.fudan.weixin.model;
import java.net.URLDecoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import edu.fudan.eservice.common.utils.CommonUtil;
import edu.fudan.eservice.common.utils.Config;
import edu.fudan.eservice.common.utils.EncodeHelper;
import edu.fudan.eservice.common.utils.MongoUtil;
/**
* 树维一卡通接口
* @author wking
*
*/
public class SWEcardModel {
private static final DateFormat DF=new SimpleDateFormat("yyyyMMddHHmmss");
private static final DateFormat QDF=new SimpleDateFormat("yyyyMMdd");
private static final String CTYPE="application/x-www-form-urlencoded";
private static final String HASH="SHA1";
private static final Logger log=LoggerFactory.getLogger(SWEcardModel.class);
/**
* 生成订单
* @param uid
* @param amount
* @return
*/
@SuppressWarnings("unchecked")
public static Map<String,Object> order(String openid,String uid,int amount)
{
Map<String,Object> ret=new HashMap<String,Object>();
String nstr=DF.format(new Date());
Config conf=Config.getInstance();
String key=conf.get("ykt.key");
StringBuffer sb=new StringBuffer("stuempno=").append(uid)
.append("&amount=").append(amount).append("×tamp=").append(nstr).append("&sign=")
.append(EncodeHelper.hmac(HASH, uid+amount+nstr, key));
try {
StringBuffer retstr=CommonUtil.postWebRequest(conf.get("ykt.orderurl"), sb.toString().getBytes("utf-8"),CTYPE );
Object retobj=JSON.parse(retstr.toString());
if(retobj instanceof Map)
{
ret=(Map<String,Object>) retobj;
String retmsg= String.valueOf(ret.get("retcode"))+ret.get("retmsg")+ret.get("payid")+(CommonUtil.isEmpty(ret.get("url"))?"":URLDecoder.decode(ret.get("url").toString(), "utf-8"));
if(!EncodeHelper.hmac(HASH, retmsg,key).equals(ret.get("sign")))
{
ret.put("retcode", -997);
ret.put("retmsg", "CHECKSUM ERROR:");
}
//把返回的PC用的支付URL转为移动端的URL
String url=String.valueOf(ret.get("url"));
url=URLDecoder.decode(url, "utf-8");
int tk=url.indexOf("pwd=");
String pwd=null;
if(tk>0)
pwd=url.substring(tk+4);
else
pwd="";
tk=pwd.indexOf("&");
if(tk>0)
pwd=pwd.substring(0, tk);
//保存pwd和payid的对应关系
DBObject dbo=new BasicDBObject();
dbo.put("pwd", pwd);
dbo.put("payid", ret.get("payid"));
dbo.put("uisid", uid);
MongoUtil.getInstance().getCollection("ecardpay").save(dbo);
ret.put("url",WiscomPayModel.formupDirecturl(openid, uid, pwd));
}else
{
ret.put("retcode", -998);
ret.put("retmsg", "PARSE ERROR:"+retstr);
}
} catch (Exception e) {
log.error("POST REQ", e );
ret.put("retcode", -999);
ret.put("retmsg", e.getMessage());
}
return ret;
}
/**
* 查询订单信息
* @param uid
* @param payid
* @param bdate
* @param edate
* @param pageno
* @param pagesize
* @return
*/
@SuppressWarnings("unchecked")
public static Map<String,Object> query(String uid,String payid,Date bdate,Date edate,int pageno, int pagesize)
{
Map<String,Object> ret=new HashMap<String,Object>();
Config conf=Config.getInstance();
String key=conf.get("ykt.key");
String nstr=DF.format(new Date());
StringBuffer sb=new StringBuffer("stuempno=").append(CommonUtil.isEmpty(uid)?"":uid)
.append("&payid=").append(CommonUtil.isEmpty(payid)?"":payid)
.append("&startdate=").append(CommonUtil.isEmpty(bdate)?"":QDF.format(bdate))
.append("&enddate=").append(CommonUtil.isEmpty(edate)?"":QDF.format(edate))
.append("&pageno=").append(pageno)
.append("&pagesize=").append(pagesize)
.append("×tamp=").append(nstr)
.append("&sign=").append(EncodeHelper.hmac(HASH,(CommonUtil.isEmpty(uid)?"":uid)+ (CommonUtil.isEmpty(payid)?"":payid)+(CommonUtil.isEmpty(bdate)?"":QDF.format(bdate))
+(CommonUtil.isEmpty(edate)?"":QDF.format(edate))+pageno+""+pagesize+nstr
, key));
try {
StringBuffer retstr=CommonUtil.postWebRequest(conf.get("ykt.queryurl"), sb.toString().getBytes("utf-8"),CTYPE );
Object retobj=JSON.parse(retstr.toString());
if(retobj instanceof Map)
{
ret=(Map<String,Object>)retobj;
}else
{
ret.put("retcode", -998);
ret.put("retmsg", "PARSE ERROR:"+retstr);
}
} catch (Exception e) {
log.error("POST REQ", e );
ret.put("retcode", -999);
ret.put("retmsg", e.getMessage());
}
return ret;
}
/**
* 获取未支付订单
* @param uid
* @return
*/
public static List<Map<String,Object>> unpaid(String uid)
{
Map<String,Object> oret=query(uid,null,new Date(System.currentTimeMillis()-3600000L*24*15),null,1,10);
if(oret.get("retcode").equals(0))
{
Object ords=oret.get("data");
if(ords instanceof List)
{
Iterator<Map<String,Object>> i=((List<Map<String,Object>>)ords).iterator();
while(i.hasNext())
{
Map<String,Object> order=i.next();
if(order==null)
{
i.remove();
}else
{
if(!"待付款".equals(order.get("status")))
i.remove();
}
}
return (List<Map<String,Object>>)ords;
}
}
return new ArrayList<Map<String,Object>>(0);
}
public static DBObject getPwd(String payid)
{
return MongoUtil.getInstance().getCollection("ecardpay").findOne(new BasicDBObject("payid",payid));
}
}