1、natapp注册安装
对接之前需要先申请natapp
https://natapp.cn
内网穿透,方便本地调试效果。
我这边是购买了一个月的通道费(免费也可以,但是地址总是变化)
2、配置natapp
3、支付宝沙箱环境申请
申请沙箱
进入
https://open.alipay.com/develop/sandbox/app
控制台,
下载密钥生成客户端
生成密钥
保留好公钥和私钥
搭建工程
配置支付宝公钥信息
alipay:
# 支付宝公钥
alipay_public_key: xxx
编写支付宝支付回调接口
@Slf4j
@RestController
@CrossOrigin("*")
@RequestMapping("/api/v1/alipay/")
public class AliPayController {
@Value("${alipay.alipay_public_key}")
private String alipayPublicKey;
@RequestMapping(value = "alipay_notify_url", method = RequestMethod.POST)
public String aliPayNotify(HttpServletRequest request) throws AlipayApiException {
log.info("支付宝支付消息回调,消息接收 {}", request.getParameter("trade_status"));
if (!"TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
return "false";
}
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
params.put(name, request.getParameter(name));
}
String tradeNo = params.get("out_trade_no");
String gmtPayment = params.get("gmt_payment");
String alipayTradeNo = params.get("trade_no");
String sign = params.get("sign");
String content = AlipaySignature.getSignCheckContentV1(params);
boolean checkSignature = AlipaySignature.rsa256CheckContent(content, sign, alipayPublicKey, "UTF-8");
// 支付宝验签
if (!checkSignature) {
return "false";
}
// 验签通过
log.info("支付回调信息:{}",JSON.toJSONString(params) );
return "success";
}
}
测试用例
@Slf4j
public class AliPayTest {
// 应用ID
public static String app_id = "szzz";
//商户私钥
public static String merchant_private_key = "xxx";
// 商户公钥
public static String alipay_public_key = "xxx";
//服务器异步通知回调地址
public static String notify_url = "http://xxxxx.natapp1.cc/api/v1/alipay/alipay_notify_url";
// 支付成功回调地址,必须外网可以正常访问
public static String return_url = "https://blog.youkuaiyun.com/weixin_46522411/article/details/145901139";
// 沙箱环境
public static String gatewayUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
// 签名方式
public static String sign_type = "RSA2";
public static String charset = "utf-8";
private AlipayClient alipayClient;
@Before
public void init() {
this.alipayClient = new DefaultAlipayClient(gatewayUrl,
app_id,
merchant_private_key,
"json",
charset,
alipay_public_key,
sign_type);
}
@Test
public void test_aliPay_pageExecute() throws AlipayApiException {
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl(notify_url);
request.setReturnUrl(return_url);
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "test2025022700000000");
bizContent.put("total_amount", "100");
bizContent.put("subject", "测试商品");//商品名称
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
String html = alipayClient.pageExecute(request).getBody();
log.info("支付宝返回index.html:{}", html);
}
}
付款页面
测试方法执行成功之后,会返回一个html的字符串,把对应字符串使用浏览器打开即可得到如下页面
之后 进入支付宝控制台,找到【沙箱账号】
在html页面输入购方账号信息,结算,输入交易密码
之后,会自动跳转到回调页面。