沙箱环境
1:先去蚂蚁金服入驻
得到开发需要的信息 appid 支付宝网管 商户私钥和支付宝公钥

2:配置参数类

pom引入jar包
com.alipay.sdk
alipay-sdk-java
3.1.0
配置支付宝需要的参数配置
package com.fandemi.utils.alipay;
public class AlipayConfig {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "appid";
// 支付宝网关
public static String url = "https://openapi.alipaydev.com/gateway.do";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String private_key = "";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String public_key = "";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "";
// 签名方式
public static String sign_type = "RSA2";// 签名方式
public static String format = "json";//参数格式为json
// 字符编码格式
public static String charset = "utf-8";
}
3:配置参数实体类
package com.fandemi.utils.alipay;
public class AlipayBean {
/**
* 商户订单号,必填
*
*/
private String out_trade_no;
/**
* 订单名称,必填
*/
private String subject;
/**
* 付款金额,必填
* 根据支付宝接口协议,必须使用下划线
*/
private String total_amount;
/**
* 商品描述,可空
*/
private String body;
/**
* 超时时间参数
*/
private String timeout_express= "10m";
/**
* 产品编号
*/
private String product_code= "FAST_INSTANT_TRADE_PAY";
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getTotal_amount() {
return total_amount;
}
public void setTotal_amount(String total_amount) {
this.total_amount = total_amount;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTimeout_express() {
return timeout_express;
}
public void setTimeout_express(String timeout_express) {
this.timeout_express = timeout_express;
}
public String getProduct_code() {
return product_code;
}
public void setProduct_code(String product_code) {
this.product_code = product_code;
}
}
4:编写支付业务代码service实现类
/**
* 支付宝支付接口
* @param orderNo 订单号
* @param payMoney 支付金额
* @return
*/
@Override
public String pay(AlipayBean alipayBean) {
try {
AlipayClient alipayClient = new DefaultAlipayClient(
AlipayConfig.url,//支付宝网管
AlipayConfig.app_id,//appid
AlipayConfig.private_key,//私钥
AlipayConfig.format,//json格式
AlipayConfig.charset,//编码格式
AlipayConfig.public_key,//公钥
AlipayConfig.sign_type);//签名方式
AlipayTradeAppPayRequest appPayRequest = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试Java");
//请保证OutTradeNo值每次保证唯一
model.setOutTradeNo(alipayBean.getOut_trade_no());//订单号
model.setTimeoutExpress("30m");//超时时间 自定义
model.setTotalAmount(alipayBean.getTotal_amount());//前台传的支付金额 string类型
model.setProductCode("QUICK_MSECURITY_PAY");//写死
appPayRequest.setBizModel(model);
appPayRequest.setNotifyUrl(AlipayConfig.notify_url);//回调地址
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(appPayRequest);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
return response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
String msg = e.getMessage();
return msg;
}
}
5:回调方法
/**
* 米币商城回调地址(学员端)
* @param request
* @param response
* @return
* @throws IOException
*/
@PostMapping("/notifyMibiMall01")
public void notifyMibiMall01(HttpServletRequest request, HttpServletResponse response) throws IOException{
logger.info("米币商城学员端支付宝异步回调开始==============");
//1:从支付宝异步回调中取值
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
Map aliParams = request.getParameterMap();
//用于存放转化后的参数集合
Map conversionParams = new HashMap();
for (Iterator iter = aliParams.keySet().iterator();iter.hasNext();){
String key = iter.next();
String[] values = aliParams.get(key);
String valueStr="";
for (int i=0;i