本博客相关代码: GITEE:https://gitee.com/hcshow/alipay-demo 准备工作 注册真正的支付宝账号 在百度搜索支付宝开放平台搜索到的网址:https://open.alipay.com/dev/workspace/ 用真正的支付宝账号登录
本博客相关代码:
GITEE:https://gitee.com/hcshow/alipay-demo
准备工作
注册真正的支付宝账号
在百度搜索支付宝开放平台 搜索到的网址:https://open.alipay.com/dev/workspace/
用真正的支付宝账号登录
选择沙箱环境
打开沙箱应用页面 在控制台中查看到APPID:
沙箱账号 这个账号一会项目启动起来,支付时会使用到
启用系统默认密钥
查看
具体编码工作
第一步:创建SpringBoot项目,添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--阿里支付easy版--> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-easysdk</artifactId> <version>2.2.0</version> </dependency>第二步:修改application.yml
server: port: 80 servlet: context-path: /wego alipay: #阿里支付 appId: 2021000118674150 #应用私钥 appPrivateKey: #支付宝公钥 alipayPublicKey: notifyUrl:其中: notifyUrl是成功之后,阿里巴巴将支付结果回传到我们自己项目中的url的地址,此时需要网络穿透,请参看博客:内网穿透工具 netapp
第三步:读取alipay配置文件的配置类:AlipayConfig
@Getter @Setter @Component @ConfigurationProperties(prefix = "alipay") public class AlipayConfig { private String appId; private String appPrivateKey; private String alipayPublicKey; private String notifyUrl; @PostConstruct public void init(){ Config options = getOptions(); options.appId = this.appId; options.merchantPrivateKey=this.appPrivateKey; options.alipayPublicKey = this.alipayPublicKey; options.notifyUrl = this.notifyUrl; Factory.setOptions(options); System.out.println("支付宝初始化成功!"); } private Config getOptions(){ Config config = new Config(); config.protocol="https"; config.gatewayHost="openapi.alipaydev.com"; config.signType="RSA2"; return config; } }第四步:定义支付相关的控制器:AlipayController
@RestController @RequestMapping("/v1/alipay") public class AlipayController { //http://localhost/wego/v1/alipay/pay?subject=aabbcc&tradeNo=1001&totalAmount=8888 @GetMapping(value = "/pay", produces = "text/html;charset=utf-8") String pay(String subject, String tradeNo, String totalAmount) { AlipayTradePagePayResponse response = null; //发起API调用 try { response = Factory.Payment.Page().pay(subject, tradeNo, totalAmount, ""); } catch (Exception e) { System.err.println("支付时遇到异常:"); e.printStackTrace(); } System.out.println(response.getBody()); return response.getBody(); } @PostMapping("/notify") String payNotify(HttpServletRequest request) throws Exception { System.out.println("pay notify"); String tradeStatus = request.getParameter("trade_status"); System.out.println(tradeStatus); if ("TRADE_SUCCESS".equals(tradeStatus)) { System.out.println("支付宝异步回调"); 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"); //支付宝验签 if (Factory.Payment.Common().verifyNotify(params)) { System.out.println("交易名称:" + params.get("subject")); System.out.println("交易状态:" + params.get("trade_status")); System.out.println("支付宝交易凭证号:" + params.get("trade_no")); System.out.println("商户订单号:" + params.get("out_trade_no")); System.out.println("交易金额:" + params.get("total_amount")); System.out.println("买家在支付宝唯一ID:" + params.get("buyer_id")); System.out.println("买家付款时间:" + params.get("gmt_payment")); System.out.println("买家付款金额:" + params.get("buyer_pay_amount")); //更新订单为已支付 //.... } } return "success"; } }第五步:运行程序测试
- 打开edge浏览器(不要使用chrome),在其中输入:http://localhost/wego/v1/alipay/pay?subject=aabbcc&tradeNo=1021&totalAmount=8888,之后自支打开下图右边的网页
按图所示输入用户名和密码,单击提交:
- 输入支付密码 单击确认支付:
- 自动跳转到页面: 此时在IDEA控制台中会看到:
拓展
上述实现在准备工作中,采用的是系统默认密钥,也可以采用自定义密钥的方式:
第一步:下载支付宝开放平台开发助手
下载地址:https://opendocs.alipay.com/open/02kipk 下载之后默认安装,之后打开,生成密钥:
改成自定义密钥的方式