目录

支付宝沙箱支付 Java

一、登录支付宝沙箱

旧版

开放平台-沙箱环境 (alipay.com)

(1)获取appid 没有账号的先注册

./1.png

(2)设置RSA2密钥

1、依然是沙箱环境,如下,点击 设置

./2.png

2、选择 公钥,此处的公钥支付宝提供了专门的生产工具,很方便

./3.png

3.选择在线生成即可

./4.png

4.注意公钥,私钥

./5.png

5.将生成的应用公钥拷贝到沙箱环境公钥位置

./6.png

6.点击保存,会生成支付宝公钥,后续开发会说明用在哪里。

./7.png

新版

首先先注册

要想完成支付宝沙箱支付就必须先完成这些设置后才能往后走

点击下面的网址,点击右上角的立即入驻,然后用支付宝账号扫码登陆。然后填写信息,登陆。

支付宝开放平台

./15.png

然后进入平台找到沙箱后点击进入

./16.png

找到左侧沙箱应用点击自定义密钥

./17.png

图3

点击公用后,进入支付宝密钥生成器。如图所示:

./18.png

进入后下载这个应用(支付宝平台)

./19.png

下载好后进入生产密钥

(生成后的密钥记得保存好 后面配置需要用到)

./20.png

生产后复制应用公钥回到支付宝平台界面粘贴,保存修改

./21.png

注意

旧版demo已失效

./23.jpg

新版demo

./24.jpg

以上步骤都完成后接下来继续下载开放平台服务端 SDK(点击此处点击此处),根据自己需要下载相对应语言的Demo 版本。我们是Java,直接下载Java就好(文件路径都设好,别乱下载不然就找不到文件了),也可以直接按照我的下面步骤配置。

./22.jpg

二、项目配置

目录结构

./8.png

导入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;
}

四、前端页面

./9.png

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>

运行结果:输入订单号,名称,价格 注意:不能为汉字

./10.png

./11.png

账号密码沙箱里面有

./12.png

./13.png

./14.png

完结