支付宝支付基础配置类
import java.io.FileWriter;
import java.io.IOException;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2018-12-28
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2018****************";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "**********";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "**********";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
// 支付宝log存放地址
public static String log_path = "D:\\";
/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
支付宝支付接口
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
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.linksaint.common.AjaxBeanData;
import com.linksaint.core.BaseAction;
import com.linksaint.util.JSONObjectTool;
import com.linksaint.web.app.config.AlipayConfig;
public class AlipayAction extends BaseAction {
/**
* 支付宝支付
* ykp
*/
private static final long serialVersionUID = 1L;
private String body; // 对一笔交易的具体描述信息
private String subject; // 商品的标题/交易标题/
private String outTradeNo; // 商户网站唯一订单号
private String totalAmount;//金额 例子:"0.01"
/**
* 支付宝支付
*/
public String alipay() {
AjaxBeanData ajaxBeanData=new AjaxBeanData();
// 实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(
AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key,
"json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
// 对一笔交易的具体描述信息
model.setBody(body);
// 商品的标题/交易标题/
model.setSubject(subject);
// 商户网站唯一订单号
model.setOutTradeNo(outTradeNo);
// 该笔订单允许的最晚付款时间,逾期将关闭交易。
model.setTimeoutExpress("30m");
// 订单总金额,单位为元
model.setTotalAmount(totalAmount);
// 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.notify_url);//"商户外网可以访问的异步地址"
String orderInfo = null;
String log="支付宝\r\n*商品的标题:"+subject+"\r\n*交易的具体描述信息:"+body+"\r\n*商户网站唯一订单号:"+outTradeNo+"\r\n*订单金额:"+totalAmount;
try {
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
orderInfo = response.getBody();
if(response.isSuccess()){
System.out.println("调用成功");
System.out.println(response.getBody());// 就是orderString
ajaxBeanData = AjaxBeanData.success("success", orderInfo);
AlipayConfig.logResult(log+"\r\n¥支付宝交易码:"+orderInfo);
} else {
AlipayConfig.logResult(response.getMsg());
System.out.println("调用失败");
ajaxBeanData = AjaxBeanData.fail("fail", log+"\r\n交易码生成失败:"+response.getMsg());
}
// 可以直接给客户端请求,无需再做处理。
} catch (AlipayApiException e) {
e.printStackTrace();
}
json=JSONObjectTool.getJson(ajaxBeanData);
return AJAX;
}
public String AlipayNotify() throws AlipayApiException, IOException {
//获取支付宝POST过来反馈信息
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);
}
boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, "utf-8", "RSA2");
if (flag) {
//更新状态
String trade_no = params.get("out_trade_no");
System.out.print("支付宝:"+trade_no);
return "success";
// if (updateTaskAndNotice(trade_no, PayTypeQuantity.ZHIFUBAOPAYMENT)) {
// return "success";
// }
}else{
System.out.print("支付宝支付失败!");
}
return "";
}
}