Loading...

最近在做APP,项目中要用支付,就写了下面的支付宝支付!还有微信支付,看下面的文章!

首先呢,先去开发平台上看看介绍,知道你不想看,但有些东西你是需要滴,
比如说

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
* 支付宝支付配置文件
*
* @author 知吾朱
*/
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {

/**
* AppId
*/
private String appId;

/**
* 应用私钥
*/
private String privateKey;

/**
* 应用公钥
*/
private String publicKey;

/**
* 支付宝公钥
*/
private String aliPayPublicKey;

/**
* 异步回调接口
*/
private String notifyUrl;

/**
* 支付宝网关
*/
private String url;

/**
* 编码类型
*/
private String charset;

/**
* 数据类型
*/
private String formatType;

/**
* 签名类型
*/
private String signType;

/**
* 域名
*/
private String projectDomain;

}

这些东西都是你需要的,

1
2
3
4
5
6
7
8
9
10
11
alipay:
appId: 不告诉你,自己去找
privateKey: 好大一串
publicKey: 还是好大一串
aliPayPublicKey: 又是一大串
url: https://openapi.alipay.com/gateway.do
charset: UTF-8
formatType: json
signType: RSA2
notifyUrl: /pay/aliPay/notify 回调接口
projectDomain: 域名,当然是你的api域名了

然后呢,然后就开始敲代码了。
话不多说,上代码。
Maven送上。

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>

接口送上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//支付宝需要的参数serverUrl、appId、private_key、format、charset、public_key、signType
AlipayClient alipayClient = new DefaultAlipayClient(aliPayConfig.getUrl(),
aliPayConfig.getAppId(),
aliPayConfig.getPrivateKey(),
aliPayConfig.getFormatType(),
aliPayConfig.getCharset(),
aliPayConfig.getPublicKey(),
aliPayConfig.getSignType());
AlipayTradeAppPayRequest payRequest = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//商品信息
model.setBody("XXXX-支付测试");
//商品名称
model.setSubject("XXXX-支付测试");
//订单号
model.setOutTradeNo("订单编号(唯一的,自己生成)");
//支付超时时间
model.setTimeoutExpress("30m");
// 支付金额
model.setTotalAmount("钱哦 ,可以填0.01,测试是要花钱的");
payRequest.setBizModel(model);
// 回调地址(充值订单)
payRequest.setNotifyUrl(aliPayConfig.getProjectDomain() + aliPayConfig.getNotifyUrl());
//这里和普通的接口调用不同,使用的是sdkExecute
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(payRequest);
log.info("支付返回[{}]", response.getBody());
System.out.println(JSONObject.toJSONString(response.getBody()));
return ApiResponse.success(response.getBody()).msg("支付成功");
} catch (AlipayApiException e) {
return ApiResponse.fail().msg(e.getErrMsg());
}

别急,还有呢,你要回调哦,记住回调要用外网能访问到的,支付宝调你的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@ApiOperation("支付回调")
@RequestMapping("/pay/aliPay/notify")
public String aliPayNotify(HttpServletRequest request, HttpServletResponse response) {
Map<String, String> params = new HashMap<>();
//从支付宝回调的request域中取值
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
String[] values = 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);
}
log.info("回调数据[{}]", JSONObject.toJSONString(params));
//商品订单号
String orderNumber = request.getParameter("out_trade_no");
// 当前交易状态
String tradeStatus = request.getParameter("trade_status");
// 支付金额
String totalAmount = request.getParameter("total_amount");
// 支付时间
String payDate = request.getParameter("gmt_payment");
//3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
try {
boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayConfig.getAliPayPublicKey(), aliPayConfig.getCharset(), aliPayConfig.getSignType());
//返回状态存入redis中
log.info("验签通过[{}]",signVerified);
//对验签进行处理
if (signVerified) {
//验签通过
if ("TRADE_SUCCESS".equals(tradeStatus)) {
//支付成功后的业务处理
//todo 当然是你自己的业务了,修改支付状态啊。
//添加支付信息
return "success";
} else {
return "failure";
}
} else { //验签不通过
return "failure";
}
} catch (AlipayApiException e) {
return "failure";
}

}

好了,到这里就结束了,就是这么简单,你学会了吗?