一、登录支付宝沙箱
旧版
开放平台-沙箱环境 (alipay.com)
(1)获取appid 没有账号的先注册
(2)设置RSA2密钥
1、依然是沙箱环境,如下,点击 设置
2、选择 公钥,此处的公钥支付宝提供了专门的生产工具,很方便
3.选择在线生成即可
4.注意公钥,私钥
5.将生成的应用公钥拷贝到沙箱环境公钥位置
6.点击保存,会生成支付宝公钥,后续开发会说明用在哪里。
新版
首先先注册
要想完成支付宝沙箱支付就必须先完成这些设置后才能往后走
点击下面的网址,点击右上角的立即入驻,然后用支付宝账号扫码登陆。然后填写信息,登陆。
支付宝开放平台
然后进入平台找到沙箱后点击进入
找到左侧沙箱应用点击自定义密钥
图3
点击公用后,进入支付宝密钥生成器。如图所示:
进入后下载这个应用(支付宝平台)
下载好后进入生产密钥
(生成后的密钥记得保存好 后面配置需要用到)
生产后复制应用公钥回到支付宝平台界面粘贴,保存修改
注意
旧版demo已失效
新版demo
以上步骤都完成后接下来继续下载开放平台服务端 SDK(点击此处点击此处),根据自己需要下载相对应语言的Demo 版本。我们是Java,直接下载Java就好(文件路径都设好,别乱下载不然就找不到文件了),也可以直接按照我的下面步骤配置。
二、项目配置
目录结构
导入pom
1
2
3
4
5
6
7
8
9
10
11
|
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.13.50.ALL</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.1.2</version>
</dependency>
|
三、开发
AliPayBean类
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
|
@Data
public class AliPayBean {
/**
* 商户订单号
*/
private String out_trade_no;
/**
* 订单名称
*/
private String subject;
/**
* 付款金额
*/
private String total_amount;
/**
* 商品描述
*/
// private String body;
/**
* 超时时间参数
*/
private String timeout_express = "60m";
/**
* 产品编号
*/
private String product_code = "FAST_INSTANT_TRADE_PAY";
}
|
Alipay 类:注意上面的appid,商户私钥,支付宝公钥,网关填写自己的
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
package com.aaa.ssm.config;
import com.aaa.ssm.bean.AliPayBean;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class Alipay {
/**日志对象*/
private static final Logger logger = LoggerFactory.getLogger(Alipay.class);
private final String format = "json";
/**
* appId
*/
@Value("填写自己的appid")
private String appId;
/**
* 商户私钥
*/
@Value("填写自己的商户私钥")
private String privateKey;
/**
* 支付宝公钥
*/
@Value("填写自己的支付宝公钥")
private String publicKey;
/**
* 服务器异步通知页面路径,需要公网能访问到
*/
@Value("http://localhost:8080/ssm/error_url.html")
private String notifyUrl;
/**
* 服务器同步通知页面路径,填写自己的成功页面路径
*/
@Value("填写自己的成功页面路径")
private String returnUrl;
/**
* 签名方式
*/
@Value("RSA2")
private String signType;
/**
* 字符编码格式
*/
@Value("utf-8")
private String charset;
/**
* 支付宝网关
*/
@Value("填写自己的支付网关")
private String gatewayUrl;
public String pay(AliPayBean aliPayBean) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl, appId, privateKey, format, charset, publicKey, signType);
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(returnUrl);
alipayRequest.setNotifyUrl(notifyUrl);
alipayRequest.setBizContent(JSON.toJSONString(aliPayBean));
logger.info("封装请求支付宝付款参数为:{}", JSON.toJSONString(alipayRequest));
String result = alipayClient.pageExecute(alipayRequest).getBody();
logger.info("请求支付宝付款返回参数为:{}", result);
return result;
}
}
|
OrderController类
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
|
@Controller
@RequestMapping("/ali")
public class OrderController {
/**日志对象*/
private static final Logger logger = LoggerFactory.getLogger(OrderController.class);
@Autowired
private PayService payService;
@RequestMapping("/pay")
@ResponseBody
public String alipay(String outTradeNo, String subject, String totalAmount) throws AlipayApiException {
logger.info("商户订单号为{},订单名称为{},付款金额为{}", outTradeNo, subject, totalAmount);
AliPayBean alipayBean = new AliPayBean();
alipayBean.setOut_trade_no(outTradeNo);
alipayBean.setSubject(subject);
alipayBean.setTotal_amount(totalAmount);
return payService.aliPay(alipayBean);
}
@RequestMapping("/success")
@ResponseBody
public String success(){
return "交易成功!";
}
@RequestMapping(value = "/index")
public String payCoin(){
return "zfindex.html";
}
}
|
Pay 类
1
2
3
4
5
6
7
8
9
10
|
@Data
public class Pay {
//订单号
private String outTradeNo;
//名称
private String subject;
//价格
private String totalAmount;
}
|
PayServiceImpl类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Service
public class PayServiceImpl implements PayService {
/**日志对象*/
private static final Logger logger = LoggerFactory.getLogger(PayServiceImpl.class);
@Autowired
private Alipay alipay;
@Override
public String aliPay(AliPayBean aliPayBean) throws AlipayApiException {
logger.info("调用支付服务接口...");
return alipay.pay(aliPayBean);
}
}
|
PayService 接口
1
2
3
|
public interface PayService {
String aliPay(AliPayBean aliPayBean) throws AlipayApiException;
}
|
四、前端页面
index.html
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
<!--<!DOCTYPE html>-->
<!--<html lang="en">-->
<!--<head>-->
<!-- <meta charset="UTF-8">-->
<!-- <title>Title</title>-->
<!--</head>-->
<!--<body>-->
<!--<form action="/ssm/ali/pay" method="post">-->
<!-- 订单号:<input type="text" name="outTradeNo" required><br/>-->
<!-- 订单名称:<input type="text" name="subject" required><br/>-->
<!-- 付款金额:<input type="text" name="totalAmount" required><br/>-->
<!-- 商品描述:<input type="text" name="body"><br/>-->
<!-- <input type="submit" value="下单"> <input type="reset" value="重置">-->
<!--</form>-->
<!--</body>-->
<!--</html>-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- 引入样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div id="app">
<el-form :model="info" label-width="80px">
<el-form-item label="订单号">
<el-input v-model="info.outTradeNo"></el-input>
</el-form-item>
<el-form-item label="商品名称">
<el-input v-model="info.subject"></el-input>
</el-form-item>
<el-form-item label="支付价格">
<el-input v-model="info.totalAmount"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">立即创建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
info: {
outTradeNo:'',
subject: '',
totalAmount: ''
}
},
methods: {
onSubmit() {
var outTradeNo=app.info.outTradeNo
var subject=app.info.subject
var totalAmount=app.info.totalAmount
location.href="/ssm/ali/pay/?outTradeNo="+outTradeNo+"&subject="+subject+"&totalAmount="+totalAmount;
}
}
})
</script>
</body>
</html>
|
error_url.html
1
2
3
4
5
6
7
8
9
10
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>支付失败</h2>
</body>
</html>
|
return_url.html
1
2
3
4
5
6
7
8
9
10
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>支付成功</h2>
</body>
</html>
|
运行结果:输入订单号,名称,价格 注意:不能为汉字
账号密码沙箱里面有
完结