AlipayForOrderMealConfig.java
package com.feparks.mobile.mobilepayment.alipay.config;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
public class AlipayForOrderMealConfig {
/**
* 应用号
*/
public static String APP_ID = "2021001141633558";
//public static String APP_ID ="2016101700709277";
/**
* 应用私钥
*/
public static String APP_PRIVATE_KEY = "";
/**
* 编码
*/
public static String CHARSET = "UTF-8";
/**
* 应用公钥
*/
public static String ALIPAY_PUBLIC_KEY = "";
public static String ALIPAY_KEY="";
/**
* 支付宝网关地址
*/
private static String GATEWAY = "https://openapi.alipay.com/gateway.do";
//沙箱
private static String GATEWAY = "https://openapi.alipaydev.com/gateway.do";
/**
* 成功付款回调
*/
public static String PAY_NOTIFY = "http://xxxx/ali/aliPayOrderMealApi/notifyUrl";
/**
* 支付成功回调
*/
public static String REFUND_NOTIFY = "http://xxx/ali/aliPayOrderMealApi/returnUrl";
/**
* 前台通知地址
*/
public static String RETURN_URL = "你的回调地址";
/**
* 参数类型
*/
public static String PARAM_TYPE = "json";
/**
* 成功标识
*/
public static final String SUCCESS_REQUEST = "TRADE_SUCCESS";
/**
* 交易关闭回调(当该笔订单全部退款完毕,则交易关闭)
*/
public static final String TRADE_CLOSED = "TRADE_CLOSED";
/**
* 收款方账号
*/
public static final String SELLER_ID = "注册沙箱的支付宝账号";
/**
* 支付宝请求客户端入口
*/
private volatile static AlipayClient alipayClient = null;
public static String SIGNTYPE = "RSA2";
/**
* 不可实例化
*/
private AlipayForOrderMealConfig(){};
/**
* 双重锁单例
* @return 支付宝请求客户端实例
*/
public static AlipayClient getInstance(){
if (alipayClient == null){
synchronized (AlipayConfig.class){
if (alipayClient == null){
alipayClient = new DefaultAlipayClient(GATEWAY,APP_ID,APP_PRIVATE_KEY,PARAM_TYPE,CHARSET,ALIPAY_PUBLIC_KEY,SIGNTYPE);
}
}
}
return alipayClient;
}
}
AlipayForOrderMealController.java
package com.feparks.mobile.mobilepayment.alipay.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.feparks.base.common.tool.StringUtils;
import com.feparks.base.sys.vo.ResultVO;
import com.feparks.mobile.mobilepayment.alipay.config.AlipayConfig;
import com.feparks.mobile.mobilepayment.alipay.config.AlipayForOrderMealConfig;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import net.sf.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class AlipayForOrderMealController extends Controller {
//页面跳转同步通知页面路径
public void returnUrl(){
Map paraMap = this.getParaMap();
Map<String, String> map = getMap(paraMap);
// 这里的校验没有多大的意思,不可信,直接获取out_trade_no跳转到对应的payed controller也可
boolean rsaCheck = rsaCheck(map);
if (rsaCheck){
System.out.println("验证通过");
}else {
System.out.println("验证失败");
}
// 获取订单号
String out_trade_no = map.get("out_trade_no");
System.out.println("out_trade_no:" + out_trade_no);
// 这里一般都是 重定向 payed的controller, 然后携带对应的信息如:return "redirect:/alipay/success?out_trade_no=" + out_trade_no;
// payed的controller根据out_trade_no获取支付结果,并且给出页面提示
renderJson("支付完成");
}
// 服务器异步通知页面路径
public void notifyUrl(){
System.out.println("支付宝回调了");
String result="failure";
Map paraMap = this.getParaMap();
Map<String, String> map = getMap(paraMap);
System.out.println("支付宝回调的返回数据:"+ JSONObject.fromObject(paraMap));
boolean rsaCheck = rsaCheck(map);
if (rsaCheck){
System.out.println("验证通过");
// 处理业务逻辑,更改支付状态等骚操作
String out_trade_no = map.get("out_trade_no");
。。。。。
result="success";
}
renderText(result);
}
//支付
public void pay(){
ResultVO resultVO = new ResultVO();
resultVO.setSuccess(false);
resultVO.setCode("1");
resultVO.setResult("数据错误!");
String openKey = this.getPara("openKey");
String orderId = this.getPara("orderId");
if (StringUtils.isBlank(openKey)){
resultVO.setCode("2");
resultVO.setResult("用户为空!");
renderJson(resultVO);
return;
}
String sql="select * from t_order where orderId='"+orderId+"'";
Record first = Db.findFirst(sql);
if (first==null || "0".equals(first.getStr("orderStatus"))){
resultVO.setCode("2");
resultVO.setResult("订单不存在或者订单已取消!");
renderJson(resultVO);
return;
}
String totalPrice = first.getStr("totalPrice");
AlipayClient client = AlipayForOrderMealConfig.getInstance();
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo(orderId);
//model.setBody(first.get(""));
model.setSubject(orderId);
//model.setTotalAmount("0.01".equals(totalPrice)?totalPrice:totalPrice+".00");
model.setTotalAmount("0.01");
//model.setOutTradeNo(this.getPara("outTradeNo"));
model.setProductCode("QUICK_MSECURITY_PAY");
request.setNotifyUrl(AlipayForOrderMealConfig.PAY_NOTIFY);
request.setBizModel(model);
try {
AlipayTradeAppPayResponse alipayTradeAppPayResponse = client.sdkExecute(request);
System.out.println(alipayTradeAppPayResponse.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
resultVO.setCode("0");
resultVO.setResult("成功!");
resultVO.setData(alipayTradeAppPayResponse.getBody());
renderJson(resultVO);
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
//支付宝回调的转换
public Map<String,String> getMap(Map requestParams){
Map<String,String> params = new HashMap<String,String>();
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
return params;
}
/**
* 校验是否支付成功
* @param handleParams
* @return
*/
public static boolean rsaCheck(Map<String, String> handleParams) {
boolean checkV1 = false;
try {
checkV1 = AlipaySignature.rsaCheckV1(handleParams, AlipayForOrderMealConfig.ALIPAY_KEY, AlipayForOrderMealConfig.CHARSET, AlipayForOrderMealConfig.SIGNTYPE);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return checkV1;
}
}