1.沙箱地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
记录APPID
查看商家和买家信息
网站支付文档地址:
alipay.trade.wap.pay(手机网站支付接口2.0) | API
支付宝开发助手文档地址:
下载开发助手,生成公钥私钥
将私钥放入代码配置类中,应用公钥放到下图沙箱环境配置中:
保存设置后,获取支付宝公钥,加入代码配置中:
引入maven配置
com.alipay.sdkalipay-sdk-java4.10.218.ALL
样例代码配置:
public class AlipayConfig {
/**
* 支付宝网关地址 TODO
*/
public static final String PAY_GATEWAY="https://openapi.alipaydev.com/gateway.do";
/**
* 支付宝 APPID
*/
public static final String APPID="这是APPID,在沙箱应用的信息配置页面";
/**
* 应用私钥
*/
public static final String APP_PRI_KEY = "这里写上应用的私钥,就是开发助手生成的那个私钥";
/**
* 支付宝公钥
*/
public static final String ALIPAY_PUB_KEY = "这是支付宝公钥,就是在沙箱环境里面,设置好应用公钥保存设置后,下方展示的支付宝公钥";
/**
* 签名类型
*/
public static final String SIGN_TYPE="RSA2";
/**
* 字符编码
*/
public static final String CHARSET="UTF-8";
private AlipayConfig(){
}
private volatile static AlipayClient instance = null;
/**
* 返回参数格式
*/
public static final String FORMAT="json";
/**
* 单例模式获取, 双重锁校验
* @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<>();
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("666.66"));
content.put("subject", "水杯");
content.put("body", "好看的水杯");
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("调用失败");
}
}
浏览器输入地址测试:
ip:port/xxx/test_pay
输入沙箱环境中的沙箱买家账号和登录密码
点击确认付款,输入买家支付密码 。然后完成支付。
以下是关于支付成功后的接口回调部分
支付宝回调接口沙箱环境配置:
1.见 小米球内网穿透配置 文章。
2.沙箱环境配置回调接口
3.代码配置中增加回调配置
4.回调代码段
@PostMapping("alipay")
public String alipayCallback(HttpServletRequest request, HttpServletResponse response){
//将异步通知中收到的所有参数存储到map中
Map<String,String> paramsMap = convertRequestParamsToMap(request);
log.info("支付宝回调通知结果:{}",paramsMap);
//调用SDK验证签名
try {
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.ALIPAY_PUB_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE);
if(signVerified){
JsonData jsonData = productOrderService.handlerOrderCallbackMsg(ProductOrderPayTypeEnum.ALIPAY,paramsMap);
if(jsonData.getCode() == 0){
//通知结果确认成功,不然会一直通知,八次都没返回success就认为交易失败
return "success";
}
}
} catch (AlipayApiException e) {
log.info("支付宝回调验证签名失败:异常:{},参数:{}",e,paramsMap);
}
return "failure";
}