1,页面数据准备
<form action="<%=basePath%>pay/submit" method="post" id="payForm">
<input id="WIDout_trade_no" name="WIDout_trade_no" type="hidden" value="${orderSubmitData.outTradeNo }"/>
<input id="WIDsubject" name="WIDsubject" type="hidden" value="手机网站支付"/>
<input id="WIDtotal_amount" name="WIDtotal_amount" type="hidden" value="${orderSubmitData.actualTotalPrice }"/>
<input id="WIDbody" name="WIDbody" type="hidden"/>
<input type="submit" value="支付"></input>
</form>
2,接收请求参数,调出支付宝支付页面
@RequestMapping("/submit")
public void submit(HttpServletRequest request, HttpServletResponse response, String WIDout_trade_no, String WIDsubject, String WIDtotal_amount, String WIDbody, String pay_type){
WrapperLog.start("[ALIPAY-"+WIDout_trade_no+"]", "PayController.submit start,WIDout_trade_no="+WIDout_trade_no+",WIDsubject="+WIDsubject+",WIDtotal_amount="+WIDtotal_amount+",WIDbody="+WIDbody+",pay_type="+pay_type);
try {
if(request.getParameter("WIDout_trade_no")!=null){
// 商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = WIDout_trade_no;
// 订单名称,必填
String subject = WIDsubject;
// 付款金额,必填
String total_amount=WIDtotal_amount;
// 商品描述,可空
String body = WIDbody;
// 超时时间 可空
String timeout_express="2m";
// 销售产品码 必填
String product_code="QUICK_WAP_WAY";
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
//调用RSA签名方式
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(out_trade_no);
model.setSubject(subject);
model.setTotalAmount(total_amount);
model.setBody(body);
model.setTimeoutExpress(timeout_express);
model.setProductCode(product_code);
alipay_request.setBizModel(model);
// 设置异步通知地址
if ("pay".equals(pay_type)){
alipay_request.setNotifyUrl(AlipayConfig.notify_url_check_sign);
}else if ("recharge".equals(pay_type)){
alipay_request.setNotifyUrl(AlipayConfig.recharge_notify_url_check_sign);
}
// 设置同步地址
alipay_request.setReturnUrl(AlipayConfig.return_url);
// form表单生产
String form = "";
try {
// 调用SDK生成表单
form = client.pageExecute(alipay_request).getBody();
response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (Exception e) {
WrapperLog.error("PayController.submit occured exception:", e);
}
WrapperLog.end("PayController.submit end");
}
3,配置信息
public class AlipayConfig {
// 商户appid
public static String APPID = ApplicationContextConfig.get("alipay.appid");
// 私钥 pkcs8格式的
public static String RSA_PRIVATE_KEY = ApplicationContextConfig.get("alipay.rsaPrivateKey");
// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = ApplicationContextConfig.get("alipay.notifyUrl");
public static String recharge_notify_url = ApplicationContextConfig.get("alipay.recharge.notifyUrl");
public static String notify_url_check_sign = ApplicationContextConfig.get("alipay.notifyUrl.checkSign");
public static String recharge_notify_url_check_sign = ApplicationContextConfig.get("alipay.recharge.notifyUrl.checkSign");
// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
public static String return_url = ApplicationContextConfig.get("alipay.returnUrl");
// 请求网关地址
public static String URL = ApplicationContextConfig.get("alipay.url");
// 编码
public static String CHARSET = ApplicationContextConfig.get("alipay.charset");
// 返回格式
public static String FORMAT = ApplicationContextConfig.get("alipay.format");
// 支付宝公钥
public static String ALIPAY_PUBLIC_KEY = ApplicationContextConfig.get("alipay.publicKey");
// 日志记录目录
public static String log_path = ApplicationContextConfig.get("alipay.logPath");
// RSA2
public static String SIGNTYPE = ApplicationContextConfig.get("alipay.signType");
}
4,支付成功回调验签
@RequestMapping("/alipayNotifyPay")
public void alipayNotifyPay(HttpServletRequest req){
try {
String out_trade_no = new String(req.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
WrapperLog.start("[ALIPAYNOTIFY-PAY-"+out_trade_no+"]", "PayController.alipayNotifyPay start");
Map<String,String> params = new HashMap<String,String>();
Map<String, String[]> requestParams = req.getParameterMap();
StringBuilder notifyUrl = new StringBuilder(ApplicationContextConfig.get("alipay.notifyUrl"));
for (Object key : requestParams.keySet()) {
String name = String.valueOf(key);
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"), "gbk");
params.put(name, valueStr);
}
WrapperLog.info("params="+JSONObject.toJSONString(params));
WrapperLog.info("start check sign");
boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
WrapperLog.info("check result:"+verify_result);
if (verify_result){
WrapperLog.info("check sign success,start notify nodejs,url is:"+notifyUrl.toString());
String notifyRes = CommonUtils.post(notifyUrl.toString(), params);
WrapperLog.info("notify end,result is:"+notifyRes);
}
} catch (Exception e) {
WrapperLog.error("PayController.alipayNotifyPay occured exception:", e);
}
WrapperLog.end("PayController.alipayNotifyPay end");
}
5,效果