第一步、开通支付宝开放平台账户 https://open.alipay.com/
第二步、选择沙箱环境,按照官方文档操作即可 https://opendocs.alipay.com/common/02kkv7
进入沙箱控制台 https://open.alipay.com/develop/sandbox/app
第三步、配置接口的加密方式,选择自定义密钥
商户生成一对应用公钥和应用私钥,应用私钥商户需要自行保管,用于支付时的加密操作,应用公钥需要上传给支付宝用于对商户的支付进行验证。同时支付宝也会根据商户上传的应用公钥生成一对支付宝应用公钥和私钥,其中支付宝私钥用于对支付结果进行加密,支付宝公钥交给商户用于对支付结果的验证,支付宝私钥则由支付宝秘密保管,不对外公开。
将生成的应用公钥填入沙箱控制台的接口加密配置中,保存后支付宝沙箱会根据填入的应用公钥生成一个支付宝公钥
整合进项目
1、引入依赖:
参考官网:https://opendocs.alipay.com/open/54/103419
通用版,需要jdk1.6+
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.35.45.ALL</version>
</dependency>
简化版,需要jdk1.8+
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>2.2.0</version>
</dependency>
推荐使用通用版
配置参数,使用自定义配置动态配置
@Getter
@Setter
@Component
@PropertySource("classpath:/pay/alipay.properties")
@ConfigurationProperties(prefix = "alipay")
public class AliPayProperties {
/**
* 在支付宝中注册的应用ID
*/
private String appId;
/**
* 开发者应用私钥,由开发者自己生成
*/
private String privateKey;
/**
* 支付宝公钥,由支付宝生成
*/
private String publicKey;
/**
* 支付宝网关(固定)
*/
private String serverUrl;
/**
* 服务器异步支付结果通知页面路径,必须外网可以正常访问
*/
private String notifyUrl;
/**
* 页面跳转同步通知页面路径,必须外网可以正常访问 商户可以自定义同步跳转地址
*/
private String returnUrl;
/**
* 参数返回格式,只支持 JSON 格式(固定)
*/
private String format;
/**
* 编码集,支持 GBK/UTF-8
*/
private String charset;
/**
* 生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐使用 RSA2。
*/
private String signType;
}
// @PropertySource 和 @ConfigurationProperties
// 组合使用,可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。也就是从默认的应用配置文件取值改为从指定文件取值
// alipay.properties 中的内容使用 Unicode 编码
alipay.properties 中的配置内容如下:
alipay.appId=\u5E94\u7528\u7F16\u53F7
alipay.privateKey=\u5E94\u7528\u79C1\u94A5
alipay.publicKey=\u652F\u4ED8\u5B9D\u516C\u94A5\uFF0C
alipay.serverUrl=\u652F\u4ED8\u5B9D\u652F\u4ED8\u7F51\u5173\uFF0C\u6C99
alipay.notifyUrl=https://openapi.alipaydev.com/gateway.do
alipay.returnUrl=https://openapi.alipaydev.com/gateway.do
alipay.format=\u652F\u4ED8\u5B9D\u516C\u94A5\u8BC1\u4E66
alipay.charset=\u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66
alipay.signType=\u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66
配置阿里支付操作代理对象:
@Configuration
public class AliPayConfig {
@Bean
@SneakyThrows
public AlipayClient alipayClient(AliPayProperties properties) {
AlipayConfig config = new AlipayConfig();
config.setAppId(properties.getAppId());
config.setPrivateKey(properties.getPrivateKey());
config.setAlipayPublicKey(properties.getPublicKey());
config.setServerUrl(properties.getServerUrl());
config.setFormat(properties.getFormat());
config.setCharset(properties.getCharset());
config.setSignType(properties.getSignType());
return new DefaultAlipayClient(config);
}
}
简单测试:
@Autowired
private AlipayClient alipayClient;
@Autowired
private AliPayProperties properties;
@Test
public void aliPayTest() throws AlipayApiException {
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
// 商户订单号,必填
model.setOutTradeNo("123456789");
// 付款金额,必填
model.setTotalAmount("2023");
// 订单商品名称,必填
model.setSubject("商品SKU,魅族20");
// 商品描述,可空
model.setBody("PC支付测试");
request.setBizModel(model);
// 设置支付结果消息通知地址
request.setNotifyUrl(properties.getNotifyUrl());
// 设置支付之后的重定向地址
request.setReturnUrl(properties.getReturnUrl());
request.setBizContent("{\"out_trade_no\":\""+ model.getOutTradeNo() +"\","
+ "\"total_amount\":\""+ model.getTotalAmount() +"\","
+ "\"subject\":\""+ model.getSubject() +"\","
+ "\"body\":\""+ model.getBody() +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
System.out.println(response.getBody());
}
将打印的内容复制到一个html文件中,然后打开,效果如下: