在Spring Boot中集成支付宝Native支付需要以下步骤:
注册支付宝账号并创建应用程序,然后获取应用程序的appid、私钥和公钥。 在Spring Boot项目中添加alipay-sdk依赖:
<groupId>com.alipay.sdk\</groupId>
<artifactId>alipay-sdk-java\</artifactId>
<version>4.11.0.ALL\</version>
</dependency>
创建一个AlipayClient对象,用于调用支付宝的接口。AlipayClient的创建需要传入以下参数:appid、私钥、公钥、格式类型、字符编码、支付宝网关和加密类型。
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
public class AlipayUtil {
private String appid = "xxxxx";
private String privateKey = "xxxxx";
private String publicKey = "xxxxx";
private String format = "json";
private String charset = "UTF-8";
private String gatewayUrl = "<https://openapi.alipay.com/gateway.do>";
private String signType = "RSA2";
public AlipayClient getAlipayClient() {
return new DefaultAlipayClient(gatewayUrl, appid, privateKey, format, charset, publicKey, signType);
}
}
创建一个支付页面,在页面中调用支付宝的接口生成订单信息,并返回到页面。
@RequestMapping("alipay")
public String alipay(Model model) throws AlipayApiException {
// 创建AlipayClient对象
AlipayClient alipayClient = alipayUtil.getAlipayClient();
// 创建AlipayTradeWapPayRequest对象,并设置支付宝支付页面的参数
AlipayTradePayRequest payRequest = new AlipayTradePayRequest();
payRequest.setNotifyUrl(payConfig.getNotifyUrl());
// 设置订单信息
AlipayTradePayModel payModel = new AlipayTradePayModel();
// 商户订单号,需要保证在商户端不重复,建议用UUID生成
payModel.setOutTradeNo("xxxxx");
// 订单总金额,单位为元,精确到小数点后两位
payModel.setTotalAmount("0.01");
// 订单标题
payModel.setSubject("xxxxx");
// 订单描述
payModel.setBody("xxxxx");
// 销售产品码,与支付宝签约的产品码名称
payModel.setProductCode("NATIVE");
// 设置订单参数
payRequest.setBizModel(payModel);
// 调用支付宝的接口生成支付信息
AlipayTradePayResponse response = alipayClient.execute(payRequest);
if (response.isSuccess()) {
String qrCode = response.getQrCode();
model.addAttribute("qrCode", qrCode);
return "pay/alipay";
} else {
// 抛出异常或者进行其他处理
throw new Exception("支付宝生成订单失败");
}
}
```
扫码支付完成后支付宝会调用notifyUrl指定的接口。在接口中验证订单的有效性,并进行相关操作,例如给用户加钱等。
@PostMapping("alipay/notify")
public String alipayNotify(HttpServletRequest request) throws AlipayApiException {
// 获取支付宝POST过来反馈信息
Map\<String, String> params = new HashMap\<String, String>();
Map\<String, String\[]> requestParams = request.getParameterMap();
for (String key : requestParams.keySet()) {
String\[] values = requestParams.get(key);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values\[i] : valueStr + values\[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(key, valueStr);
}
// 调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(),
alipayConfig.getCharset(), alipayConfig.getSignType());
if (signVerified) {
// 验证通过后进行相关操作
String outTradeNo = params.get("out_trade_no");
String tradeNo = params.get("trade_no");
String totalAmount = params.get("total_amount");
// ...
// 返回success表示接收成功
return "success";
} else {
// 返回failure表示接收失败
return "failure";
}
}
以上是集成支付宝Native支付的步骤。具体实现中需要注意的细节可以参考支付宝官方文档和样例代码。