支付宝的沙箱支付要比微信简单许多
支付宝沙箱地址
https://open.alipay.com/platform/appDaily.htmhttps://open.alipay.com/platform/appDaily.htm 获取私钥与支付宝公钥
第一步设置完应用公钥后后可以在第二步中得到支付宝的公钥
然后将支付宝公钥与应用私钥保存
web在线加密密钥
MiniU 研发工作台MiniU 研发工作台https://miniu.alipay.com/keytool/create
引入maven依赖
支付宝官方sdk
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.20.19.ALL</version>
</dependency>
设置支付宝支付的一些参数
配置文件
@Component
@ConfigurationProperties(prefix = "payment.alipay")
public class AliPayConfig {
/**
* 对应支付宝Appid
*/
private String appId;
/**
* 对应支付宝私钥
*/
private String privateKey;
/**
* 对应公钥
*/
private String publicKey;
/**
* 签名方式(RSA/RSA2)
*/
private String signType = "RSA2";
/**
* 编码格式
*/
private String charset = "UTF-8";
/**
* 支付宝支付服务器
*/
private String gatewayUrl = "https://openapi.alipay.com/gateway.do";
/**
* 支付宝支付服务器(沙箱)
*/
private String sandboxGatewayUrl = "https://openapi.alipaydev.com/gateway.do";
/**
* 服务器异步通知地址
*/
private String notifyUrl;
/**
* 服务器跳转地址
*/
private String returnUrl;
/**
* 开启沙箱
*/
private boolean sandbox = false;
public String getGatewayUrl() {
if (sandbox) {
return getSandboxGatewayUrl();
}
return gatewayUrl;
}
public void setGatewayUrl(String gatewayUrl) {
this.gatewayUrl = gatewayUrl;
}
//get and set
}
properties
此处公钥应填写支付宝公钥
此处私钥应填写应用私钥
支付服务
接口
public interface AlipayService {
/**
* 支付方法
*
* @param orderNo 订单编号
* @param subject 名称
* @param amount 订单金额
* @return 支付宝生成的字符串格式的form表单
*/
String alipay(String orderNo, String subject, String amount);
}
实现类
/**
* 支付宝支付服务层
*
* @author TanChengjin
*/
@Service
public class AlipayServiceImpl implements AlipayService {
private final static Logger logger = LoggerFactory.getLogger(AlipayServiceImpl.class);
@Autowired
private AliPayConfig aliPayConfig;
@Override
public String alipay(String orderNo, String subject, String amount) {
String form = "";
//生成alipay客户端
System.out.println(aliPayConfig.getGatewayUrl());
DefaultAlipayClient client = new DefaultAlipayClient(aliPayConfig.getGatewayUrl(), aliPayConfig.getAppId(), aliPayConfig.getPrivateKey(), "json", aliPayConfig.getCharset(), aliPayConfig.getPublicKey(), aliPayConfig.getSignType());
//设置客户端请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(aliPayConfig.getReturnUrl());
alipayRequest.setNotifyUrl(aliPayConfig.getNotifyUrl());
alipayRequest.setBizContent("{" +
" \"out_trade_no\":\"" + orderNo + "\"," +
" \"total_amount\":" + amount + "," +
" \"subject\":\"" + subject + "\"," +
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
try {
//返回一个form表单
form = client.pageExecute(alipayRequest).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
logger.error("发起支付宝支付错误: {}", e.getMessage());
throw new SystemException("支付失败");
}
return form;
}
}
支付宝执行client.pageExecute(alipayRequest).getBody(); 会返回一个字符串格式的form表单
在控制器中调用支付服务并将form表单输出到浏览器
String alipayForm = alipayService.alipay(shopOrder.getOrderNo(), "测试商品", shopOrder.getTotalAmount().toString());
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write(alipayForm);
writer.flush();
writer.close();