我们可以定义一个成功返回的配置类
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class PayUrlConfig {
/**
* 支付成功页面跳转
*/
@Value("${alipay.success_return_url}")
private String alipaySuccessReturnUrl;
/**
* 支付成功,回调通知
*/
@Value("${alipay.callback_url}")
private String alipayCallbackUrl;
}
当然,配置文件需要添加
#支付宝配置 alipay: #支付成功的跳转页面 success_return_url: https://xdclass.net #支付宝通知回调接口 callback_url: https://xdclass.net
重点,重头戏,我们在支付宝支付申请到的各种参数,放入进去,只需要修改TODO的位置
package net.xdclass.config;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
public class AlipayConfig {
/**
* 支付宝网关地址 TODO
*/
public static final String PAY_GATEWAY="https://openapi.alipaydev.com/gateway.do";
/**
* 支付宝 APPID TODO
*/
public static final String APPID="2016092000555936";
/**
* 应用私钥 TODO
*/
public static final String APP_PRI_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCPULg2k9ugRE3tGQXLTg6Ez7mtpsei9bmHiHomwJ3lxZ19jR6R/BcG9r5UnCDvRl5gKJ4uVAA4Tvf4M+5e3d+0fiC+Mchcg9p5hv1GJvrsmSup3yWFZ4PNKyh0Qdz/yOWNoKo1Ya1IOQ3uIYPz0tpQuBPs3TZjcTsYxVWs6fbChB2Lbo9dxUcFWC7nWOq2ZD9DLa+P0lPMMGOWo41CBumCzn4JrbbQ9cXPdMc33HUO1J9XqRGpmxH1y0idNt9Qcne+QrskMzisBip9YLbdN0hNzJVyqKXBDUVV8OQBPFruD0SDaVf85Ue+k0Moz16LOD6D58tFViL/sLJOElwlFR3vAgMBAAECggEAXl037jfNFOnkpYkkV4k95hUgnUaDjLlfP+6M/5c0YGaOHG0fA+CJCPzOtcdXqDUdTxNvk/Gbc3gLrlIDUlOlSKMDzDfbRY9L+1j2y4o/DiqMpX1Yp05RanZQXLxBV+pfu7FeYWe/QR7QHUvUJmdfeGa8N+owNaoIz3afwwsKf2ia3D+I8tR8/fboeBcvkqLnW5GuM9ISUkDC+tLxWytigmT+n3w+KqEErhbKrJQTTQswvw8H/W362lI8URoZB23FFv1RlqtHVDARlLEnunpWI5dugA8++i0TCvn+dhK7f5e+SYn4wnm8utZYW7I75wOo57lGGwVtyFx7KjRj04R4gQKBgQDzEn0XxHAynKW2EuhC/9Nom3tgZorlIQkX5+gt1cpHG9eR1UMV55oWL9s7ROtbnE0pgCmXl4T3H0sem4n14ZXr0QkrngDro0uULl67j9dmj4uB9FcqDFqhsatTquSJWTSWKZwfIDVfwTqHJu6RTM8qCwWHkk7ALfbxB/VEesV8pQKBgQCW8AGq79HmpJGXZm3zr581A898mG3WrPBORYZuDT2xORLSvVJwFO5v16Eu6DklBWE4dmVU+lIj5qeEQYTLnnidvlHnfdyx17TDRcjEFaTinBjpltIzamYOGC/dsmicOPPAqazvgn+AZ4tO1j8zzDlV5lBihd+P62NbSjKmqcmIAwKBgQCUXGeP1y1oJuaaICY1prIhuizu5QfH3IcRWVIEj+X7ywmjkFh3CTqqaiFUprdE3jzWpMw+I5RbxXTzRJpLQppgKeGABtum96+MzVSzBJPDnL/Y3QtKtemnoarh0X/WOWV4dgM9mEobnPQdQ+z/MLONhNamLe31LNj5uxK/7nOVpQKBgEswXjRP6Uky+8/m16kH+JBJSKfxqu3BEqh7G99guzW4j7bpVtK8qpaOXR3n0uetSWP+HrZ5SEfYE+TfWo6wb7ds4pIl8bWqFcMc1UlQ2uWECyj519aDDznANMAEqvX/rPVx0NMzN964Nf5c3fkop/sxkyOxOtAP21vTl23MsLcPAoGBAMIQXMp1+6NEEbgcW9P1oG/SdDgOYm4yp8LVtjsdPk7hKqhgdO6ip+LOSBs28vQqJTsi8hgHlMTnR1IarbBrcTP91Sar9DDtu5iOM62lknNtf0+Og5xOkNyNP/E9Gh7zYbQIfhBKS0tAJlwIvfHBJNoRPnaaY+KvluvbVWNxvkcW";
/**
* 支付宝公钥 TODO
*/
public static final String ALIPAY_PUB_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk8OPeu/Bhbxr8chgRXnDSm0FDMZoK3r/qLLzqbv+L2/mYTLxHKw5U3c5XPHXar5SVWRp+IgLsZdTfYeZ+jYFmY+dTYk8mG8GXc1uYwHFADcWQAcR4KA3cbxiaubg7g//ECEhwA5CmaosjJ2p8UAz4j7cDB37TDON7oGMFbkXnSBlGhj5oy6rxdUXS+KeG9YmRPkQU3x3ljK37RRLFhwPPRR218IGDCmCtnI5ddKEq1hMAPnYmKNezerxSGGxxIaggt+sDwN1S3GNNSU7AelLPuvNEza49KaQijsBJpaLKUvqt5KO4IVfvPCmRsIFe7KzgdEmjygIY81qXacPzopJIQIDAQAB";
/**
* 返回参数格式
*/
public static final String FORMAT="json";
/**
* 签名类型
*/
public static final String SIGN_TYPE="RSA2";
/**
* 字符编码
*/
public static final String CHARSET="UTF-8";
/**
* 构造函数私有化
*/
private AlipayConfig(){
}
/*
volatile 与下面进行双重锁校验
*/
private volatile static AlipayClient instance = null;
/**
* 单例模式获取, 双重锁校验
* @return
*/
public static AlipayClient getInstance(){
if(instance==null){
synchronized (AlipayConfig.class){
if(instance == null){
instance = new DefaultAlipayClient(PAY_GATEWAY,APPID,APP_PRI_KEY,FORMAT,CHARSET,ALIPAY_PUB_KEY,SIGN_TYPE);
}
}
}
return instance;
}
}
接下来就是发起请求的测试了
/**
* 测试支付方法
*/
@GetMapping("test_pay")
public void testAlipay(HttpServletResponse response) throws AlipayApiException, IOException {
HashMap<String,String> content = new HashMap<>();
//商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
String no = UUID.randomUUID().toString();
log.info("订单号:{}",no);
content.put("out_trade_no", no);
content.put("product_code", "FAST_INSTANT_TRADE_PAY");
//订单总金额,单位为元,精确到小数点后两位
content.put("total_amount", String.valueOf("111.99"));
//商品标题/交易标题/订单标题/订单关键字等。 注意:不可使用特殊字符,如 /,=,& 等。
content.put("subject", "杯子");
//商品描述,可空
content.put("body", "好的杯子");
// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
content.put("timeout_express", "5m");
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setBizContent(JSON.toJSONString(content));
request.setNotifyUrl(payUrlConfig.getAlipayCallbackUrl());
request.setReturnUrl(payUrlConfig.getAlipaySuccessReturnUrl());
AlipayTradeWapPayResponse alipayResponse = AlipayConfig.getInstance().pageExecute(request);
if(alipayResponse.isSuccess()){
System.out.println("调用成功");
String form = alipayResponse.getBody();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(form);
response.getWriter().flush();
response.getWriter().close();
} else {
System.out.println("调用失败");
}
}
本文作者为DBC,转载请注明。