10
06月
2025
1:pom.xml 引入
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
2:PC端扫码支付 代码示例
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no =orCode;
//付款金额,必填
int total_amount =payOrderModels.get(0).getPaynum();
//订单名称,必填
String subject = "支付";
//商品描述,可空
String body = "支付";
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAY_URL,
AlipayConfig.APP_ID, AlipayConfig.MERCHANT_PRIVATE_KEY,
"json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//alipayRequest.setReturnUrl("http://xxx/mobile/czcgts.html"); //设置同步回调通知
alipayRequest.setNotifyUrl("https://xxx:8008/api/alipay/pay_notify"); //设置异步回调通知
//设置支付参数
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no",out_trade_no);
// bizContent.put("total_amount",total_amount);
bizContent.put("total_amount",0.01);
bizContent.put("subject",subject);
bizContent.put("product_code","FAST_INSTANT_TRADE_PAY");
bizContent.put("qr_pay_mode","4");
bizContent.put("qrcode_width",190);
alipayRequest.setBizContent(bizContent.toJSONString());
//请求
String result = null;
try {
result = alipayClient.pageExecute(alipayRequest).getBody();
System.out.println("alipay pcPay result--"+result);
response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
response.getWriter().write(result);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
回调地址方法:
/**
* pc native支付
* 异步回调函数
* @param request
* @return
* @throws IOException
*/
@PostMapping(value = "pay_notify")
public String pay_notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("alipay native 支付完成进入异步通知");
Map<String, String> reqObject = convertRequestParamsToMap(request);
String out_trade_no=reqObject.get("out_trade_no");
System.out.println("alipay native out_trade_no--"+out_trade_no);
Map<String,String> parMap=new HashMap<>();
String trade_status= reqObject.get("trade_status");
System.out.println("alipay native --"+trade_status);
try {
boolean signVerified = AlipaySignature.rsaCheckV1(reqObject, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE);
//无论同步异步都要验证签名
if(signVerified){
if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
//处理自己系统的业务逻辑,如:将支付记录状态改为成功,需要返回一个字符串success告知支付宝服务器
} else {
//支付失败不处理业务逻辑
return "failure";
}
}else {
//签名验证失败不处理业务逻辑
return "failure";
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "failure";
}
}
3:手机端h5支付代码示例:
// 付款金额,必填
String total_amount=String.valueOf(payOrderModels.get(0).getPaynum());
// String total_amount="0.01";
//自定义参数,可空
String passback_params = orCode;
// 商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no =orCode;
// 商品描述,可空
String body = "订单支付";
// 订单名称,必填
String subject = "订单支付";
// 超时时间 可空
String timeout_express="2m";
// 销售产品码 必填
String product_code="QUICK_WAP_WAY";
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
//调用RSA签名方式
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APP_ID, AlipayConfig.MERCHANT_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGN_TYPE);
AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(out_trade_no);
model.setSubject(subject);
// model.setTotalAmount(total_amount);
model.setTotalAmount(String.valueOf(0.01));
model.setBody(body);
model.setTimeoutExpress(timeout_express);
model.setProductCode(product_code);
model.setPassbackParams(URLEncoder.encode(passback_params,"UTF-8"));
alipay_request.setBizModel(model);
// 设置异步通知地址
alipay_request.setNotifyUrl("http://xxx:8008/api/alipay/hpay_notify");
// 设置同步地址
alipay_request.setReturnUrl("http://xxx/mobile/czcgts.html");
// form表单生产
String form = "";
try {
// 调用SDK生成表单
form = client.pageExecute(alipay_request).getBody();
System.out.println(" hPay form--"+form);
response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
回调地址方法:
/**
* 支付宝h5支付
* 异步回调
* @param request
* @return
* @throws IOException
*/
@PostMapping(value = "hpay_notify")
public String hpay_notify(HttpServletRequest request,HttpServletResponse response) throws Exception {
System.out.println("alipay 支付完成进入异步通知");
Map<String, String> reqObject = convertRequestParamsToMap(request);
String out_trade_no=reqObject.get("out_trade_no");
String trade_status= reqObject.get("trade_status");
System.out.println("alipay out_trade_no--"+out_trade_no);
System.out.println("alipay trade_status--"+trade_status);
try {
boolean signVerified = AlipaySignature.rsaCheckV1(reqObject, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE);
//无论同步异步都要验证签名
if(signVerified){
if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
//处理自己系统的业务逻辑,如:将支付记录状态改为成功,需要返回一个字符串success告知支付宝服务器
} else {
//支付失败不处理业务逻辑
return "failure";
}
}else {
//签名验证失败不处理业务逻辑
return "failure";
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "failure";
}
}
上一篇: JAVA RSA加密解密 工具类
下一篇: 若依框架 多数据库类型分页