一、创建应用
使用沙箱环境,可以直接忽略这里,这里只是顺带介绍如何创建应用。
1、进入支付宝开放平台 支付宝开放平台
2、完善信息
3、接入应用
支付宝使用的加密方式
1、对称加密 - 不安全
即加密和解密用同一种算法(钥匙),比如发送方给接受方要发送一串文字,但是不能让人知道,所以需要加密,将加密后的字符串通过网络传输,给到接收方,接收方收到秘闻,用同一种算法获取明文。因此只要知道了这种算法(钥匙),在网络传输中截取到,就可以随意解密,这种方式不安全。
2、非对称加密
即加密时用算法A(秘钥A),解密的时候用算法B(秘钥B),即使在网络传输截取到密文,由于不知道秘钥B,也无法获取明文信息,这个相对较安全。但是知道秘钥B了,也不安全,但是不能模拟完全的通信。接受方要给发送方返回信息,使用秘钥C,而发送方要获取接收方返回的信息,也需要通过秘钥D来解密。
这种方式,只要缺少一种一把秘钥,都无法模拟完整通信。
第一个流程 - 发送方给接受方发数据:
秘钥A自己藏起来不暴露给其他人,但是要让接受方解密,需要把秘钥B告诉接收方。这里的秘钥A就是私钥,秘钥B就是公钥,私钥和公钥是相对的。
第二个流程,则C就是私钥,D就是公钥。
3、支付宝中的使用 - 非对称加密
商户使用自己的私钥给订单信息进行加密并附带一个sign签名来防止中途传输数据篡改,只要这个订单信息有一点变化,这个签名也会变。支付宝这边通过商户提供的公钥来对签名进行验证,如果订单信息中途被人修改,那么这个签名也会发生变化,这个商户公钥来验证就不会通过。比如,传递的信息是说支付100,中途被拦截修改成10000,那么这个签名就会发生改变,验签不通过,后面的业务无法执行。
同样,支付宝这边支付成功了,需要告诉商户,返回一个消息也会附带sign签名,如果中途被拦截到修改了返回的信息,这个签名也会发生变化,商户这边使用支付宝提供的秘钥来验证这个签名,也不会通过。比如,传递的信息说是支付成功,中途被拦截到将其修改成失败,签名也发生变化,验签也不会通过,用户就不会再次支付。
沙箱环境
1、找到沙箱环境 沙箱环境地址
2、创建公钥,下载开发助手
安装开发助手(注意:路径不要有空格)
3、生成秘钥
// 文件地址 - 直接点 打开文件位置 即可
C:\Users\LCY\Documents\支付宝开放平台开发助手\CSR
配置公钥:
官方Demo
1、下载官方Demo 官方Demo下载地址
2、使用Eclipse导入Demo,配置相关信息
3、运行项目
http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/
4、使用提供的商家账号和买家账号
5、支付
SpringBoot整合支付宝沙箱环境
1、引入依赖 - 旧版本SDK
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.28.ALL</version>
</dependency>
2、根据Demo创建一个Template
这个Template的作用是配置支付宝相关信息,且提供一个支付的API(根据官方Demo进行配置)
/**
* @ClassName AliPayTemplate
* @Description 根据支付宝官方Demo提取出来的Template,旧版SDK
* 旧版Demo下载地址: https://opendocs.alipay.com/open/270/106291
* @Author 柳成荫
* @Date 2021/3/23
*/
@Component
@Data
public class AliPayTemplate {
/** 在支付宝创建的应用ID */
@Value("${pay.alibaba.appid}")
private String appId;
/** 商户私钥 */
@Value("${pay.alibaba.merchantPrivateKey}")
private String merchantPrivateKey;
/** 支付宝公钥 - 查看地址: https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥 */
@Value("${pay.alibaba.alipayPublicKey}")
private String alipayPublicKey;
// 服务器[异步通知]页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
/** 支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息 */
@Value("${pay.alibaba.notifyUrl}")
private String notifyUrl;
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
/** 同步通知,支付成功,一般跳转到成功页 */
@Value("${pay.alibaba.returnUrl}")
private String returnUrl;
/** 签名方式 */
@Value("${pay.alibaba.signType}")
private String signType;
/** 字符编码格式 */
@Value("${pay.alibaba.charset}")
private String charset;
/** 订单失效时间 - 30分钟 */
@Value("${pay.alibaba.timeout}")
private String timeout;
/** 支付宝网关; https://openapi.alipaydev.com/gateway.do */
@Value("${pay.alibaba.gatewayUrl}")
private String gatewayUrl;
/**
* 支付
* @param vo 支付信息
* @return 响应页面
* @throws AlipayApiException
*/
public String pay(PayVo vo) throws AlipayApiException {
// 1、根据支付宝的配置生成一个支付客户端
AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl,
appId, merchantPrivateKey, "json",
charset, alipayPublicKey, signType);
// 2、创建一个支付请求 - 设置请求参数
AlipayTradePagePayRequest aliPayRequest = new AlipayTradePagePayRequest();
aliPayRequest.setReturnUrl(returnUrl);
aliPayRequest.setNotifyUrl(notifyUrl);
// 商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = vo.getOutTradeNo();
// 付款金额,必填
String total_amount = vo.getTotalAmount();
// 订单名称,必填
String subject = vo.getSubject();
// 商品描述,可空
String body = vo.getBody();
aliPayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"timeout_express\":\""+timeout+"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
// 会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面
return alipayClient.pageExecute(aliPayRequest).getBody();
}
}
3.1、application.properties
根据自己的情况,完成配置。
# Thymeleaf的配置
spring.thymeleaf.cache=false
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
# 在支付宝创建的应用ID
pay.alibaba.appid=
# 商户私钥
pay.alibaba.merchantPrivateKey=
# 支付宝公钥 - 查看地址: https://openhome.alipay.