SpringBoot集成支付宝h5支付(移动端和web端,使用内网穿透测试)

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.最后,如果有什么问题欢迎在评论区讨论,大家一起进步,祝各位道友早日结成金丹!

Read more

【记录】Copilot|Github Copilot重新学生认证通过方法(2025年7月,包括2FA和认证材料、Why are you not on campus)

【记录】Copilot|Github Copilot重新学生认证通过方法(2025年7月,包括2FA和认证材料、Why are you not on campus)

文章目录 * 前言 * 步骤 * 最重要的一步 前言 事实上,Github Copilot马上就要开源了,我原本的认证过期了。但是在我体验了众多的代码补全工具实在是太难用了之后,我觉得一天也等不了了,就去再一次认证了学生认证。 这次严格了很多,要求巨无敌多,这里写一下新认证要干的事情。 一口气认证了八次的含金量谁懂,把要踩的坑全踩完了。。 步骤 (如果你是第一次认证还要额外添加一下自己的学校邮箱,这里我就略过不提了) 在所有的步骤之前,最好确保你的本人就在学校或者在学校附近。当你出现了报错You appear not to be near any campus location for the school you have selected.时,会非常难通过。 而其他的报错可以按我下文这种方式通过。 (对于部分学校,比如华科大)双重认证Two-factor authentication要打开:跳转这个网站https://github.com/settings/security,然后点下一步开启认证,

By Ne0inhk
【汉化中文版】OpenClaw(Clawdbot/Moltbot)第三方开源汉化中文发行版部署全指南:一键脚本/Docker/npm 三模式安装+Ubuntu 环境配置+中文汉化界面适配开源版

【汉化中文版】OpenClaw(Clawdbot/Moltbot)第三方开源汉化中文发行版部署全指南:一键脚本/Docker/npm 三模式安装+Ubuntu 环境配置+中文汉化界面适配开源版

OpenClaw这是什么? OpenClaw(曾用名 Clawdbot / Moltbot)是一个开源的个人 AI 助手平台(GitHub 120k+ Stars),可以通过 WhatsApp、Telegram、Discord 等聊天软件与 AI 交互。简单说就是:在你自己的机器上运行一个 AI 助手,通过常用聊天软件跟它对话。 forks项目仓库 :https://github.com/MaoTouHU/OpenClawChinese 文章目录 * OpenClaw这是什么? * 汉化效果预览 * 环境要求 * 安装方式 * 方式 A:一键脚本(推荐新手) * 方式 B:npm 手动安装 * 方式 C:Docker 部署(服务器推荐) * 首次配置 * 运行初始化向导 * 安装守护进程(

By Ne0inhk

Telegram机器人Token和ChatID获取教程

# 创建自己的机器人和Token: 【1】添加好友 @BotFather 【2】输入【 /start 】 -【 /newbot 】,给新机器人自定义起名(可中文),必须以bot结尾,不能和别人重复 【3】起名新建成功后会输出Use this token to access the HTTP API,就是你这个机器人的Token # UserID的获取: 【1】好友添加机器人 @getuseridbot 【2】输入 /start ,即可获得自己的UserID。 # ChatID的获取【群组or频道】: 【1】群组or频道添加机器人 @get_id_bot 【2】输入 /my_id@get_id_bot ,即可获得-100开头的Chat ID : -1001818202301。 # 机器人测试命令 使用实际的

By Ne0inhk
彻底解决 Stable Diffusion WebUI 启动报错:AttributeError: ‘MessageFactory’ object has no attribute ‘GetProto

彻底解决 Stable Diffusion WebUI 启动报错:AttributeError: ‘MessageFactory’ object has no attribute ‘GetProto

彻底解决 Stable Diffusion WebUI 启动报错:AttributeError: ‘MessageFactory’ object has no attribute ‘GetPrototype’ Stable Diffusion web UI sd-webui-roop 【技术分享】ComfyUI中protobuf版本兼容性问题的优雅解决方案:猴子补丁实战 告别环境崩溃:ONNX 与 Protobuf 版本兼容性指南 一、问题背景 最近在使用 Stable Diffusion WebUI(v1.10.1)时,安装了 sd-webui-roop 插件后,启动时出现了一个非常典型的 Protobuf 版本冲突错误: AttributeError: 'MessageFactory' object has no attribute '

By Ne0inhk