SpringBoot集成支付宝h5支付(移动端和web端,使用内网穿透测试)
文章目录
- 文章目录
1.支付宝H5支付简介2.支付流程介绍3.接入准备4.内网穿透准备5.沙箱环境准备6.SpringBoot整合集成6.1建立工程引入依赖1.pom引入依赖2.配置yml文件3.AlipayProperties文件配置4.创建订单接口5.浏览器测试小结
1.支付宝H5支付简介
支付宝H5支付是一种适用于移动端浏览器的支付方式,用户无需下载支付宝App即可完成支付。适用于手机网页、微信内嵌浏览器等场景。
2.支付流程介绍
商家在网页应用中调用支付宝提供的网页支付接口,接口会调起支付宝客户端内的支付模块,此时会从商家网页应用跳转到支付宝客户端中并开始支付;支付完成后会跳转回商家网页应用内,最后商家展示支付结果。
步骤1:用户在浏览器中访问商家网页应用,选择商品下单、确认购买,进入支付环节,选择支付宝付款,用户点击去支付。
步骤2:进入到支付宝支付路由页面,支付宝处理支付请求,并尝试唤起支付宝客户端。
步骤3:进入到支付宝页面,调起支付宝客户端支付,出现确认支付界面。
步骤4:用户确认收款方和金额,点击立即支付后出现输入密码界面。
步骤5:输入正确密码后,支付宝端显示支付结果。
步骤6:自动回跳到浏览器中,商家根据付款结果个性化展示订单处理结果。
3.接入准备
1.商户需在支付宝开放平台完成注册,申请H5支付权限并获取以下关键信息:
- 应用ID(APPID)
- 支付宝公钥和商户私钥
- 商户签约的PID
本文使用沙箱环境来进行测试演示,具体集成流程与正式环境一样。
2.使用锐通网络内网穿透APP生成外网域名,确保支付宝官方可以访问到我们本地的服务进行回调。
支付宝开放平台地址:https://open.alipay.com/
锐通网络下载地址:http://nexoraweb.com.cn/
解释:什么是沙箱环境?
沙箱环境是协助开发者进行接口开发及主要功能联调的模拟环境,目前仅支持网页/移动应用和小程序两种应用类型。在沙箱完成接口调试后,请务必在正式环境进行完整的功能验收测试。
4.内网穿透准备
输入官网下载地址http://nexoraweb.com.cn进行下载,然后打开软件建立映射填写内网信息最后得到映射地址即可。
5.沙箱环境准备
所需信息清单如下:
- AppID
- 应用私钥
- 支付宝公钥
- 买家账号
- 买家密码
登录支付宝开放平台https://open.alipay.com/
1.首先进入控制台

2.进入控制台如果有企业账号可以直接按照自己需求选择不同类型的产品去创建(但是审核一般比较慢,建议现用沙箱调试),没有企业账号就点击下方沙箱按钮,如下图所示:

3.进入沙箱之后记录一下APPID,然后点击公钥模式后面的查看按钮记录自己的应用私钥和支付宝公钥(赋值保存即可),页面详情如下图所示:

4.然后点击左侧沙箱账号获取买家账号及密码,页面详情如下图所示:

6.SpringBoot整合集成
6.1建立工程引入依赖
1.pom引入依赖
<!-- 支付宝SDK依赖--> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.40.393.ALL</version> </dependency> <!-- 支付宝SDK依赖的日志--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> 2.配置yml文件
spring: application: name: aliPay_demo alipay: appId: 902100015768xxxx #将上一步获取的appId赋值粘贴上去即可 #应用私钥 privateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCnKyJXhfWqlcbYYpu4WO2osnLkn94WXTHGtoRQlRx7AxgI9i8fXQtjWhpUfNQ/k0wWFBidXzWn1DdQQ9Nj7NQiEiE2N3n5mqNgCLE4mJ/So7dMyq5qiDay4PrMXUDKMQ9auVwSgc3doDh2+GfXtLSaCA+5jHQc6/nab3tKQNMgk07Ru4BbN1zrPXe/5iElkfFOAxDWZXMtlhw9wEc5fAg1gdrfrbhDio5iKH3ImKlohSkhwSpigxc88ky5j7Fj6+42s9ol11D1m2PyHRt/ZnyS8S8Yat4emVvxNWyFyuFaNnDOEW7F9XoLS6rRyUZnHva3Pzj7RhfAlsX5WiPwPKK5AgMBAAECggEAUawmTCKbwusISmHq+Kch/eCpd3+PztdbYV18ya4ASy1YydAVd7pKvRChepO+Uw1RCBxrZj/FBCkPmTx6BAEKJ1c6OLXj9woRNfMpOqB+vTfVb0Q68Lt6Fe0LO1t4MxDDEq0rCbO3c8c6rw1wFpgoAHVd0WaIuDSmTo1W7BE91VS0ntA014KWB2hoV7ahFhuJw5o5PMIGPGRpCr/Nr4Z8Dh17YwpiJLDUbM4gMeeExqexxgIqcAv/EhC5TL9pQXvJNlO40zP4V0PXelv5EhD/Yb1LGkQgYuDZEOu6ksNvOg3vUG2JiRdUcrI2ebDHP6bWlklQAilbYsERzJHe5V9frQKBgQD+U5jepgqpGkA/K0JprltGKPaywSIr9MVAoeejtK01HK0B913NRXdqVEO2Ieg55x7ckMudOhrT+agdyXaoa7nqdMlQcHRN4SYmIQNFP1HfeI/n2huLr655TV1SSe4m2aYG/3FhXCxEzgAWC6cim3mlLYEMS6N/YwJCE3hkM4c4QwKBgQCoRLkGbyYWBaiLmChcCLjfS+/0I1s5Wtamo5ImLLDcm0cWYwRksAiHu+fsCYt30784B2CasS24dvsRQXfBOJCXy/NjMCGrpFbOO8MRqahENLgNUkGUuMy+YBodhiFLv4BfM9imrVzob9P0bhBJcx8j6HzHbi7eFVC+N94nxwU3UwKBgQDmE4qAIYYTZQQqIWB7aph36CcFn2LikRTBW7bKinEHU2HQHZBmWymkr4ZyBkqn10Y8E2GgYyhSC9Di4ZbO1mXijLRyaMlOixiP9d2Xj6jpmY/WF6JDxDL62dpKz0b7LnrcacqQYWpK9HFvgCs7S5vIqlnMXcETROaOED8hptv1MQKBgCmI9ScKbptHAEic4XF+UawEwZFA3Pa2Xn+5poy3wVxjE9QJ0v7LmP9wOZpA7OVCJlQ9NfJZQ9Dhxa2HvHi8bqyZklVsfxMwOKEljUwh1cAoRzo6kKeWSiu/6xJYloVtGtHlKVhTOLjDSc1vEaQfv5MMgyhzISx+lHSvs62b6cSzAoGBAPjaeILsfsLIrP6WgRiRBQN1PdW7UgHjA327WepwzeylpTudvAlOz+QAuYaF7sKtchWdnDtomN1JnO6/EKE/sYTQ+zS/kkf3oqTjnLD+z6HkiWh+ERZyLy+MslUuKSq3aLRCtWO0o4+LRl7wJzSR3cu85dVbMII+R2rabgXyxxxx #支付宝公钥 alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxbe6B88UGbMFD1/b6R8AwoftPUrjvvIimLAPTPITfCdD6NYVA/s42IjMHJ6d5vwdXWG/VpRwufG2BpfiDADnxXSZ2sJTBnVj7UUoEutlhGlCs0owWOBQp2xYc89HneAosfZbR1ZaYootY08F0NNQlzaOTFy58JijLeggqv0Ub2BtKx651SM47UeaaIhsIdgTrRIWhYitx+LGsc8qX4yx0cCRyBlSHYi97aSmhvSZT6/U166EreSGV1plWPBMmLn+4sdk3M4tFKPw/eDNJgYqfC2dYNymao2jXMK/CMoX5o9fehkYmWUb+mhPzO91p60I4NTlRBAlGNNcwGsmIoI1UwIDXXXX #支付宝回调地址,将使用锐通网络穿透工具生成的映射地址赋值粘贴上去即可 notifyUrl: 内网穿透生成的外网地址/api/pay/alipay/notify 3.AlipayProperties文件配置
@Data @Configuration @ConfigurationProperties(prefix = "alipay") public class AlipayProperties { private String appId; private String privateKey; private String alipayPublicKey; private String notifyUrl; private String returnUrl; //private String gateway = "https://openapi.alipay.com/gateway.do";//正式环境网关 private String gateway = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";//沙箱环境网关 }4.创建订单接口
@RestController @RequestMapping("api/pay/alipay") public class AliPayController { @Resource private AlipayProperties aliPayProperties; /** * 创建支付订单 * @param tradeNo 必须唯一 * @param price 价格 * @return * @throws Exception */ @GetMapping("/createOrderTest") public String createOrderTest(String tradeNo,int price) throws Exception { //1.先根据前端传入的商品信息和用户信息创建订单 AlipayClient alipayClient = new DefaultAlipayClient( aliPayProperties.getGateway(), aliPayProperties.getAppId(), aliPayProperties.getPrivateKey(), "json", "UTF-8", aliPayProperties.getAlipayPublicKey(), "RSA2" ); AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); request.setNotifyUrl(aliPayProperties.getNotifyUrl()); request.setReturnUrl(aliPayProperties.getReturnUrl()); JSONObject bizContent = new JSONObject(); bizContent.put("out_trade_no", tradeNo); bizContent.put("total_amount", price); bizContent.put("subject", "测试订单"); bizContent.put("product_code", "QUICK_WAP_WAY"); bizContent.put("timeout_express","5m");//设置过期时间 request.setBizContent(bizContent.toJSONString()); String form = alipayClient.pageExecute(request).getBody(); return form; } /** * 回调接口 * @param request * @return * @throws Exception */ @PostMapping("/notify") public String notify(HttpServletRequest request) throws Exception { System.out.println("执行回调notify"); Map<String, String> params = new HashMap<>(); request.getParameterMap().forEach((k, v) -> params.put(k, v[0])); boolean signVerified = AlipaySignature.rsaCheckV1( params, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2" ); if (signVerified) { String tradeNo = params.get("trade_no");//支付宝交易号 String sellerId = params.get("seller_id");//卖家支付宝用户号 String outTradeNo = params.get("out_trade_no");//商户订单号 String tradeStatus = params.get("trade_status");//交易状态(TRADE_SUCCESS表示成功) System.out.println("卖家支付宝用户号: " + sellerId); //通过订单号查询对应订单进行状态更新 if ("TRADE_SUCCESS".equals(tradeStatus)) { return "success"; }else if ("TRADE_FINISHED".equals(tradeStatus)) { return "fail"; } } return "fail"; } /** * 支付完成返回接口 * @return * @throws Exception */ @GetMapping("/return") public String test() throws Exception { return "hello,success"; } }5.浏览器测试
首先去锐通客户端打开对应映射,如下图所示:

启动成功访问http://localhost:8080/api/pay/alipay/createOrderTest?orderNo=TEST202501180099&price=6999(建议最好使用内网穿透技术将本地服务映射到公网使用手机浏览器访问,这里我的外网地址是http://103.27.76.35:10501/api/pay/alipay/createOrderTest?orderNo=TEST202501180099&price=6999)进行测试,其中orderNo必须唯一,实际开发中数据库获取,访问进入支付页面进行测试即可。如下图所示:

由于沙箱环境条件限制只能使用浏览器继续支付,所以我们接下来点击继续浏览器支付跳转下一页面,页面展示如下:

然后这里输入的账号就是前面5.4提到的买家账号(此账号默认给100w用于测试),输入账号密码即可。
小结
集成支付宝h5支付功能主要有两个不可或缺的条件:
1.支付宝商家账号(没有可用沙箱环境测试,但是会有限制),有条件的话建议直接使用正式环境。
2.内网穿透技术,通过此技术可以将本地服务的IP端口暴露到公网,这样支付成功后支付宝官方回调时就可以直接访问到本地服务的接口进行页面衔接跳转。这里推荐锐通网络的内网穿透工具,页面对用户比较友好,操作易上手比较稳定。详细信息介绍参考https://blog.ZEEKLOG.net/m0_58099720/article/details/157103400?fromshare=blogdetail&sharetype=blogdetail&sharerId=157103400&sharerefer=PC&sharesource=m0_58099720&sharefrom=from_link
3.最后,如果有什么问题欢迎在评论区讨论,大家一起进步,祝各位道友早日结成金丹!