首先去开放平台-沙箱环境 (alipay.com)申请沙箱环境
创建spring boot项目
添加maven
<dependency>
<groupid>com.alipay.sdk</groupid>
<artifactid>alipay-sdk-java</artifactid>
<version>3.0.0</version>
</dependency>
项目架构
yml配置
pay:
APP_ID: 应用ID
GATEWAYURL: 支付宝网关
MERCHANT_PRIVATE_KEY: 商户私钥
ALIPAY_PUBLIC_KEY: 支付宝公钥
RETURN_URL: 页面跳转同步通知页面路径
NOTIFY_URL: 服务器异步通知页面路径
SIGN_TYPE: 签名方式
CHARSET: 字符编码格式
支付配置类
@Configuration
@Data
public class AlipayConfig {
/**
* 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
*/
@Value("${pay.APP_ID}")
public String app_id;
/**
* 商户私钥,您的PKCS8格式RSA2私钥
*/
@Value("${pay.MERCHANT_PRIVATE_KEY}")
public String merchant_private_key;
/**
* 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm对应APPID下的支付宝公钥。
*/
@Value("${pay.ALIPAY_PUBLIC_KEY}")
public String alipay_public_key;
/**
* 服务器异步通知页面路径 需http://格式的完整路径
*/
@Value("${pay.NOTIFY_URL}")
public String notify_url;
/**
* 页面跳转同步通知页面路径 需http://格式的完整路径
*/
@Value("${pay.RETURN_URL}")
public String return_url;
/**
* 签名方式
*/
@Value("${pay.SIGN_TYPE}")
public String sign_type;
/**
*字符编码格式
*/
@Value("${pay.CHARSET}")
public String charset;
/**
* 支付宝网关
*/
@Value("${pay.GATEWAYURL}")
public String gatewayUrl;
}
异步通知和同步通知的区别:
异步通知用来进行订单支付完成之后的操作,例如修改订单状态,或者库存处理等
同步通知用于支付宝支付页面支付成功之后的页面跳转
此处涉及到内网穿透 NATAPP 申请账号并购买免费隧道,配置8080端口,然后按照文档配置本地的穿透工具
启动之后修改同步通知和异步通知的地址
两种支付方式,一种是前往支付宝第三方网关进行支付,页面不需要自己写,只需要传入指定的值,发送请求后返回一个HTML页面,打开自动提交表单,跳转到支付宝官方的支付页面
另一种方式事获取二维码链接,自己写页面盛放二维码进行后续操作
前往支付宝第三方网关支付
@RequestMapping(value = "goAlipay", produces = "text/html; charset=UTF-8")
@ResponseBody
public String goAlipay(String orderNumber,String orderCoupon) throws Exception {
//请求
AlipayTradePagePayModel alipayTradePagePayModel=new AlipayTradePagePayModel();
alipayTradePagePayModel.setBody("商品名称");
alipayTradePagePayModel.setSubject("主题");
//订单号
alipayTradePagePayModel.setOutTradeNo(orderNumber);
//总额
alipayTradePagePayModel.setTotalAmount(orderCoupon);
//订单超时时间
alipayTradePagePayModel.setTimeoutExpress("30m");
alipayTradePagePayModel.setProductCode("FAST_INSTANT_TRADE_PAY");
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getApp_id(), alipayConfig.getMerchant_private_key(), "js