一、下载支付宝支付工具包,配置AlipayConfig
partner、seller_id、private_key、alipay_public_key、notify_url、return_url
二、返还前台所需支付宝支付信息
/**
* create the order info. 创建订单信息
*
*/
public static String getOrderInfo(String orderCode, String subject,
String body, String price) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + AlipayConfig.partner + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + AlipayConfig.seller_id + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + orderCode + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 服务器异步通知页面路径
orderInfo += "¬ify_url=" + "\""+ AlipayConfig.notify_url+ "\"";
// 服务接口名称, 固定值
orderInfo += "&service=\"mobile.securitypay.pay\"";
// 支付类型, 固定值
orderInfo += "&payment_type=\"1\"";
// 参数编码, 固定值
orderInfo += "&_input_charset=\"utf-8\"";
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += "&it_b_pay=\"30m\"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";
return orderInfo;
}
//核心方法,生成订单信息+签名+sign_type。此方法生成返给前台的支付宝支付信息,前台调用即可。
public static String getAlipayString(String orderCode, String subject,
String body, String price) {
String orderInfo = getOrderInfo(orderCode, subject, body, price);
String sign = RSA.sign(orderInfo, AlipayConfig.private_key, "utf-8");
System.out.println("sign encode before = " + sign);
try{
sign = URLEncoder.encode(sign, AlipayConfig.input_charset);
System.out.println("sign encode before = " + sign);
}catch (Exception e){
e.printStackTrace();
}
String string = orderInfo + "&sign=\"" + sign + "\"&sign_type=\"RSA\"";
return string;
}
三、补充:支付回调方法
//支付宝支付回调
@RequestMapping("/pay/alipay/notify.htm")
public void alinotify(HttpServletRequest request, HttpServletResponse response) {
try {
Map<String, String> params = new HashMap<String, String>();
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] + ",";
}
params.put(name, valueStr);
}
requestParams.get("trade_status");
String tradeNo = request.getParameter("out_trade_no");
String tradeStatus = request.getParameter("trade_status");
logger.error("trade params:" + params);
if (AlipayNotify.verify(params)) {//验证成功
logger.info("alipay verify success");
if (tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")) {
logger.info("alipay trade success");
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("ORDERCODE", tradeNo);
resultMap.put("STATUS", "0");
if(tradeNo.startsWith("XF")){
service4.addVoucher(resultMap);
}else if(tradeNo.startsWith("BV")){
service4.addDeliveryVoucher(resultMap);
}else{
service2.callBack(resultMap);
}
try {
response.getOutputStream().print("SUCCESS");
} catch (IOException e) {
logger.error("***error***" + e.getMessage() + "\n", e);
}finally{
try {
response.getOutputStream().close();
} catch (IOException e) {
logger.error("***error***" + e.getMessage() + "\n", e);
}
}
}else{
logger.error("alipay pay success but state incorrect");
}
} else {//验证失败
logger.error("alipay verify failure");
}
} catch (Exception e) {
logger.error("**********error*******" + e.getMessage() + "\n", e);
}
}