pom配置文件
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.5.0.ALL</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
AliPayUtil
package com.zj.ob.yyf.util;
import com.alibaba.fastjson.JSON;
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.zj.ob.yyf.config.AliPayConfigProperties;
import java.util.HashMap;
import java.util.Map;
public class AliPayUtil {
public static Map<String, Object> getOrderSign(String totalAmount, String orderId){
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfigProperties.getUrl(),
AliPayConfigProperties.getAppId(),
AliPayConfigProperties.getAppPrivateKey(),
AliPayConfigProperties.getFormat(),
AliPayConfigProperties.getCharset(),
AliPayConfigProperties.getAlipayPublicKey(),
AliPayConfigProperties.getSignType());
Map<String, Object> map = new HashMap<>();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
model.setBody("*****");//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body
model.setSubject("*****");//商品的标题/交易标题/订单标题/订单关键字等
model.setTotalAmount(*****);//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
model.setProductCode("*****");//销售产品码,商家和支付宝签约的产品码
model.setOutTradeNo(****);//商户网站唯一订单号,请保证OutTradeNo值每次保证唯一
model.setTimeoutExpress("30m");//该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
request.setBizModel(model);
request.setNotifyUrl("*****");//商户外网可以访问的异步地址
AlipayTradeAppPayResponse response;
try {
response = alipayClient.sdkExecute(request);//这里和普通的接口调用不同,使用的是sdkExecute
map.put("orderString",response.getBody());
map.put("res",1);
map.put("msg","请求sign成功");
} catch (AlipayApiException e) {
e.printStackTrace();
String massage = "alipay.trade.app.pay接口:订单签名错误";
map.put("res",-1);
map.put("msg","失败订单号"+orderId);
}
return map;
}
public static Boolean checkParam(Map<String, String> params){
try {
return AlipaySignature.rsaCheckV1(params, AliPayConfigProperties.getAlipayPublicKey(), AliPayConfigProperties.getCharset(),
AliPayConfigProperties.getSignType());
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
配置支付宝参数实体类
package com.zj.ob.yyf.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class AliPayConfigProperties {
private static String url;
private static String appId;
/**
* 商户私钥
*/
private static String appPrivateKey;
private static String format;
private static String charset;
/**
* 支付宝公钥
*/
private static String alipayPublicKey;
private static String signType;
@Value("${alipay.url}")
private String purl;
@Value("${alipay.appId}")
private String pappId;
@Value("${alipay.appPrivateKey}")
private String pappPrivateKey;
@Value("${alipay.format}")
private String pformat;
@Value("${alipay.charset}")
private String pcharset;
@Value("${alipay.alipayPublicKey}")
private String palipayPublicKey;
@Value("${alipay.signType}")
private String psignType;
@PostConstruct
public void transValues() {
url = this.purl;
appId = this.pappId;
appPrivateKey = this.pappPrivateKey;
format = this.pformat;
charset = this.pcharset;
alipayPublicKey = this.palipayPublicKey;
signType = this.psignType;
}
public static String getUrl() {
return url;
}
public static String getAppId() {
return appId;
}
public static String getAppPrivateKey() {
return appPrivateKey;
}
public static String getFormat() {
return format;
}
public static String getCharset() {
return charset;
}
public static String getAlipayPublicKey() {
return alipayPublicKey;
}
public static String getSignType() {
return signType;
}
}
ylm配置
alipay:
url: ****
appId: ****
appPrivateKey: ****
format: JSON
charset: utf-8
alipayPublicKey: ***
signType: RSA2
异步回调
@RequestMapping(value = "/getAlipayNotify", method = RequestMethod.POST)
public void getAlipayNotify(HttpServletRequest request, HttpServletResponse response) {
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
LOG.error("异步支付宝回调数据" + JSON.toJSONString(requestParams));
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);
}
// 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
try {
boolean flag = AliPayUtil.checkParam(params);
if (flag) {
String trade_status = params.get("trade_status");
String out_trade_no = params.get("out_trade_no");
String trade_no = params.get("trade_no");
if ("TRADE_SUCCESS".equals(trade_status)) { // 交易支付成功的执行相关业务逻辑
AliOrderPo aliOrderPo = new AliOrderPo();
if (StringUtils.isNotBlank(out_trade_no)) {
//out_trade_no = "16";
String notify_time = params.get("notify_time");///参数请查看支付宝文档
Date notifyDate = DateTimeUtil.parseDatetime(notify_time);
String app_id = params.get("app_id");
String notify_id = params.get("notify_id");
String out_biz_no = params.get("out_biz_no");
String buyer_id = params.get("buyer_id");
String buyer_logon_id = params.get("buyer_logon_id");
String seller_id = params.get("seller_id");
String seller_email = params.get("seller_email");
String total_amount = params.get("total_amount");
String receipt_amount = params.get("receipt_amount");
String buyer_pay_amount = params.get("buyer_pay_amount");
// 可以写业务
//
//
String result = "SUCCESS";
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(result.getBytes());
out.flush();
out.close();
}
} else if ("TRADE_CLOSED".equals(trade_status)) { // 未付款交易超时关闭,或支付完成后全额退款,执行相关业务逻辑
LOG.error("异步支付宝失败" + JSON.toJSONString(requestParams));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}