1.引入支付宝sdk文件。
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.1.0</version>
</dependency>
2. 写好配置文件properties,这里重点强调,支付接口中调用的是支付宝公钥而非商户公钥,如果写错会导致验签失败
#alipay
#支付接口
ias.pay.alipay.payUrl=https://openapi.alipay.com/gateway.do
#支付成功回调接口
ias.pay.alipay.notifyUrl=
# 商户ID
ias.pay.alipay.appId=
#编码格式
ias.pay.alipay.charset=UTF-8
#商户私钥
ias.pay.alipay.appPrivateKey=
#支付宝公钥
ias.pay.alipay.publicKey=
ias.pay.alipay.timeoutExpress=30m
#签名加密方式
ias.pay.alipay.signType=RSA2
3.调起支付测试用例。里面的payProp为properties文件的配置项目
@Autowired
private PayProp payProp;
@Test
public void createPay() {
// 实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(payProp.getAlipay().getPayUrl()
, payProp.getAlipay().getAppId()
, payProp.getAlipay().getAppPrivateKey()
, "json"
, payProp.getAlipay().getCharset()
, payProp.getAlipay().getPublicKey()
, payProp.getAlipay().getSignType());
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试Java");
model.setOutTradeNo(SequenceUtils.genId()+"");
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(payProp.getAlipay().getNotifyUrl());
try {
// 这里和普通的接口调用不同,使用的是sdkExecute,生成支付号
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if(response.isSuccess()){
//这里返回response.getBody()给支付宝
}
log.info(response.getBody());// 就是orderString
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
4.付款成功,支付宝回调验证签名,完成支付
@RequestMapping(value="alipay/notify")
@SneakyThrows
public String alipay(@RequestBody String callback) {
log.debug("支付宝支付回调为:{}", callback);
//解析出url参数中的键值对转化为Map
Map<String, String> map = HttpUtil.ParamRequest(callback);
if(StringUtil.equals(map.get("trade_status"), "TRADE_SUCCESS")) {
//支付宝验签
boolean signVerified = AlipaySignature.rsaCheckV1(map, payProp.getAlipay().getPublicKey(), payProp.getAlipay().getCharset(), payProp.getAlipay().getSignType());
if(signVerified) {
log.info("支付宝回调签名认证成功");
log.info("支付宝支付完成!!!");
}
}
return "success";
}