+ "_input_charset=" + AlipayConfig.input_charset + "\" method=\"" + strMethod
@Controller
@RequestMapping("${apiPath}/hc/app/pay")
public class AlipayController {
//账户记录
@Autowired
private HcAccountRecordService accountService;
/**向对方(商户)支付宝支付款项
*@author xiaoyu
*@param request
*@param response
*@param money 金额
*@param remarks 描述(备注)
*@param userId 用户id(回调)
* @return
*@return
* @throws UnsupportedEncodingException
*@time 2015年12月2日下午7:34:54
*/
@RequestMapping("payMoney")
//@ResponseBody//页面跳转 不要
public String payMoney(HttpServletRequest request ,HttpServletResponse response
,String money,String remarks,String userId) throws UnsupportedEncodingException{
//支付类型
String payment_type = "1";
//必填,不能修改
//商户订单号 网站订单系统中唯一订单号,必填
String number = UtilDate.getOrderNum();//获取一个时间戳代表的唯一订单号
String out_trade_no = new String(number.getBytes("ISO-8859-1"),"UTF-8");
//订单名称必填(用userId作为名称,作为回调使用)
String subject = new String(userId.getBytes("ISO-8859-1"),"UTF-8");
//付款金额必填
String total_fee = new String(money.getBytes("ISO-8859-1"),"UTF-8");
//订单描述,作为回调用
String body = remarks;//new String(remarks.getBytes("ISO-8859-1"),"UTF-8");
//把请求参数打包成数组
Map sParaTemp = new HashMap();
sParaTemp.put("service", "create_direct_pay_by_user");//必填 自我认为应该是支付宝作为判别作为那种服务的标识
sParaTemp.put("partner", AlipayConfig.partner);
sParaTemp.put("seller_email", AlipayConfig.seller_email);
sParaTemp.put("_input_charset", AlipayConfig.input_charset);
sParaTemp.put("payment_type", payment_type);
sParaTemp.put("notify_url", AlipayConfig.notify_url);
sParaTemp.put("return_url", AlipayConfig.return_url);
sParaTemp.put("out_trade_no", out_trade_no);
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", total_fee);
sParaTemp.put("body", body);
//建立请求采用get模式
String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"get","确认");
request.setAttribute("sHtmlText", sHtmlText);
return "modules/hc/alipay";//跳转页面 ,生成form表单 自动提交
}
/**支付宝post回调接口
* 用于支付宝主动通知商户对订单一些状态变化的通知(我这里额业务暂时无用)
*@author xiaoyu
*@param request
*@param response
*@return
*@throws UnsupportedEncodingException
*@time 2015年12月2日下午3:07:26
*/
@SuppressWarnings("rawtypes")
@RequestMapping("aliPostCallBack")
@ResponseBody
public String aliPostCallBack(HttpServletRequest request ,HttpServletResponse response) throws UnsupportedEncodingException {
//获取支付宝POST过来反馈信息
Map params = new HashMap();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//获取支付宝的通知返回参数
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//用户id
String userId=new String(request.getParameter("subject").getBytes("ISO-8859-1"),"UTF-8");
//描述
String remarks=new String(request.getParameter("body").getBytes("ISO-8859-1"),"UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//金额
String money = new String(request.getParameter("total_fee").getBytes("ISO-8859-1"),"UTF-8");
//交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("回调参数列表:"+"out_trade_no:"+out_trade_no+
"remarks"+remarks+"trade_no"+trade_no+"money"+money+"trade_status"+trade_status);
System.out.println("这个是>?:"+params);
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
if(AlipayNotify.verify(params)){//验证成功
//////////////////////////////////////////////////////////////////////////////////////////
//记录用户的消费记录入库
HcAccountRecord record = new HcAccountRecord();
record.setMoney(money);
record.setRemarks(remarks);
record.setUserId(userId);
record.setTypeId("1");
this.accountService.save(record);
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
if(trade_status.equals("TRADE_FINISHED")){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序
System.out.println("post:TRADE_FINISHED");
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (trade_status.equals("TRADE_SUCCESS")){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序
System.out.println("post:TRADE_SUCCESS");
//注意:
//付款完成后,支付宝系统发送该交易状态通知
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
return "success"; //请不要修改或删除
//////////////////////////////////////////////////////////////////////////////////////////
}else{//验证失败
//out.println("fail");
return "fail";
}
}
/**支付宝回调接口
*@author xiaoyu
*@param request
*@param response
*@return
*@throws UnsupportedEncodingException
*@time 2015年12月2日下午3:07:26
*/
@SuppressWarnings("rawtypes")
@RequestMapping("aliGetCallBack")
@ResponseBody
public Map aliGetCallBack(HttpServletRequest request ,HttpServletResponse response) throws UnsupportedEncodingException {
//获取支付宝GET过来反馈信息
ResponseMapper mapper = new ResponseMapper();
Map params = new HashMap();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//获取支付宝的通知返回参数
//商户订单号
//String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//回调过来的用户id
String userId=new String(request.getParameter("subject").getBytes("ISO-8859-1"),"UTF-8");
//描述
String remarks=new String(request.getParameter("body").getBytes("ISO-8859-1"),"UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//金额
String money = new String(request.getParameter("total_fee").getBytes("ISO-8859-1"),"UTF-8");
//交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
//System.out.println("这个是回调参数列表:"+params);
//计算得出通知验证结果
boolean verify_result = AlipayNotify.verify(params);
if(verify_result){//验证成功验证是为了防止用户修改get参数,这样回调验证时必须的
if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){//这里也你自己的业务逻辑就行了
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程
HcAccountRecord record = new HcAccountRecord();
record.setMoney(money);
record.setRemarks(remarks);
record.setUserId(userId);
record.setTradeNo(trade_no);
int total = this.accountService.saveAndChangeAccount(record);
if(total > 0) {
mapper.setCode(SystemConstant.APP_RETURN_SUCESS);
mapper.setMessage("验证成功");
}
else {
mapper.setCode(SystemConstant.APP_RETURN_SUCESS);
mapper.setMessage("验证成功但是保存数据库失败");
}
}
}else{
mapper.setCode(SystemConstant.APP_RETURN_EXCEPTION);
mapper.setMessage("验证失败");
}
return mapper.getResultMap();
}