一、前期准备

1、支付宝开放平台沙箱账号,用于测试


应用公钥需要使用支付宝第三方工具生成,最好在本地备份好,公钥以及配对的密钥

2、javasdk的maven仓库

javasdk

3、内网穿透,使内网能够被 支付宝的服务器访问

支付成功后支付宝需要回调咱们服务器的端口,必须保证自己的服务器能被外网访问
穿透教程

二、流程图

主要流程:

  1. 用户下单请求商户系统
  2. 商户系统构造支付请求,发送给支付宝
  3. 支付宝展示支付信息,用户支付
  4. 支付结果由支付宝回调给商户创建好的接口
  5. 商户根据支付结果业务操作,并在最后将订单信息返回给用户

三、代码编写

1、依赖导入
springboot thymeleaf alipa-sdk-java

![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p3LXN0YXIvbXlGaWd1cmViZWQvbWFzdGVyL2ltZy8yMDE5MTIxMTE0NDc1OS5wbmc?x-oss-process=image/format,png)

2、创建请求公共参数的类 AlipayConfig


public class AlipayConfig {// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,开发时使用沙箱提供的APPID,生产环境改成自己的APPIDpublic static String APP_ID = "2016101600700789";  //沙箱的//public static String APP_ID = "2019120669659570";// 商户私钥,您的PKCS8格式RSA2私钥public static String APP_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCFOj7P1DzSVD2j/DxZrLg3i9siUn47m6xL2yaZZprDNb3UjyNEt31B/q4hdhZ7StJVBx9AEfSsceXzOizbRJgdAboR6XSz66bE9pI3k/Ef2TmSc4v+cEysCKF/Mg4t8Y+uCWpOak+r/K4ZNBla2u45gU1vPcvOzf/uvJiTXmSYbBndKUMCICkF0RbHLOjhMFN8a0Nu0IiCSuGFl8iMSnL9czKnGWT6k5luwHsvxh0ei+lW2V9NZyP56reSylhO8RmOihsDKep7Y4JdNRyGNGzjkiaqGKzbcGU2a/Zx9ztSmo7tzOLVK3eDZEiOX4nBqa0HqczpYEg7S+kYwkIAXT7nAgMBAAECggEANufPNRWRz1i6Ype0Q3zEGtg/gkCfF2/LrSNvH+9CPssqJayr60j3jTgpiU7CayNl1Xbu8Re1T1BNZVUHYYI+ck3g4jrlRrUKcMfxcIg+6lI6wNlvy3d6kbeo3uPBJjwUa7QjpJd5qDalhWuMO35YiUh5oivEj8EkBb6h3rIbIRlrrsjFXN60RJXbQlulj6Cm1xNvzehhr34pSIrEZr1wbyy0bRq/YOpZ0XhnCrpWktZoIXirIQ3DUNu2NQ9PSUoJAaEYdk3DkKc+r+ARM99U1ZLRii1WWDDECZXmf66lKtPun09+obUe8Ly34+7DUsg0xZhpXcBWg0wR/WeWX7vz8QKBgQC+rB2ZsJGfoL4SkMtXJw7atG+ZiGQEILkoBH+CVhgj6ZYdEIy6Dc4NS7o5n/Am14hGmbCdMYSJZkCsypmDjhX7sDzeHQUl0E06aSN0qyotLzWuIDfl90SJL42/lyX4CniBFWJFXv6nPOQmR6JEDB07FjN1/gOgrZSrXagr2ookyQKBgQCy36Q0QVa3sZUFyKbH3VmlN9f1wHiO9crtrP94VAkpbvCCWof2O7z2az9F2EZmhwpbK1PhAFx0IHlSqvH6HuWT89Xi0DCPfbALbuQyaQoIm6K0QvPyVb1SNW0W9tMTGVZtUXaHpmwL+w5qoK6zojLGYMOzs31yblizniPhNVGOLwKBgDmFfQyPeu8YNB8vtVhefRm3k29S+TFRmeobqUftpyy2XEX6Zyn93iqerNiTioR9QyxhUymo9Z3pzhsSp8tLQxCB82rigFoPBC1Z6Ita08d71YrpR1PGC9QDF5U0CQ1SQ1ZV2CaraNGVChMOS0KSEQNxSCcRcZC4rQAhqglIzaIZAoGAJEacu4hAuPJHwauGv2PRqWMg5hMJoByS8g6ypMmOLhv0pMsNZc+JrAPmChkpdeOPIxwvX6M+HML1N+G5PzuC3bWGu//yyTb5O+haWSraQRKnNZ2acZwX0BNLs2uNNQNfdr4dprcGlItuygsaQw3y9C5togUVvN5KGOtKZYL1rjsCgYEAtNwjD9q963DUKDpoAZFCZClCtd8cxUsv8yPAZndWpgujtkOblYn8tQvxx/9yWPJC8NUahnMLrPI36YgAwB5Gs0csU0p2s80otTk3++oInrzTxCYuNlF+HT1RKzJ+JDOxVjJpBu91DJ4OnIhfDIPG8GGr+mtf2bg0sidz7HoL6ng=";// public static String APP_PRIVATE_KEY ="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCai3umtojYHJNn3ZbvUivIarG8kGHzWoGbJkuB8Ppo4nKhBmDHXCeO712jrEx4frQMUpoOx85NTmrZS8w96b3JDyt10KYEFNhm/W5CoNcxqAy8tDExiQRlxEoU0rSLNrTzgIRgfZW+uRC34T270itjh59St6U/9fd6y0oThV+PPRcKuZMZg8Qv3LKHYdHxwMyaoo+GT15N76/WYxSOZy4c7njaDo5C62okFdwHK8TzeTJ9y+OqeSuW/YevLxSfnTt1yOtQiIfx2oOOBsFqsqQ+uNvCSpDMl6r8F9LyeVm5lvxGTrzdz+odmyRGUkIfxVZAeSoqrwUSXsmceLvdurcjAgMBAAECggEASY/ZNLqwGoZHl+n+/T2Uv5ohrgrfxPEwvgQVbu2glCotu/4INPzli4Dehpjt8XEGDNOIpz5uMZgA/hu5RUMsZjbFThgZ3dl6RFOflzFuHSHLpkrzG4wHvtUXGiBNdfJ9YWasHC3LCHSYw54AP5XDt2WH7dyiWPagbR+0y+PxX4FMRiVVpjqloRKQqSW/gV+Y1ka8nHvUgU0IyJbi9ZZGbjEz409hWmTExmCuVwCdV/Tdq5q1PDiQHOtkgSf6UVCjMB4Ey5Y1Zn2E9/l7h2fDvZgYXCIwkFnPyNf+3cMnydvS22bks1M9PFp33bPVrV1F3DVltY9d7o8AXxqnFSlp0QKBgQDJbMA+AmpAvn2fUSptVwth39srxFuIY2Cqwx7jApLBeMlfqfw5aY7B6jbMhoIRtKVCy3b6KR7URT9sVqFYrKG2er99WARmHRnMh5vNxQBzrq+hqz5v5WxH9xjh4mHKSPBx4ti6ODGiQjv+wugntpBif45wHubgTUlaowp3uDT4mwKBgQDEawoukIcpMNFigTpmPp+R033xZAz9CyJCVuX8vfgfTMHsQNfngh5FNtCWMpIcrVei6cvCWD+cJqeVuV6LEbUxvqK+OY1bNoZnhnN1K6OjcyziYK//TSf0lHzBy7Uiy3l06youlRt/in3LualY3EDdtx/fUe4Lj244Nj2Cm3pQGQKBgQCiZFg1ZjMN0cZr/L8s+gGGPjlwdtWpBx33bmpncTqqWtxXkS91hiH/OvpFOKiC59ZZHLrmguKFFvNEQC/C0yNpgFsEDkM1pH6ZRDeb1RlBKvQUboBfLGN5PcFE1AQtV1LrLo22zPlPLQE7qx4KbojHsLlAsdlHu2fJeCtHTC8AwwKBgAWnBu38HseirgPlsCaNGs55haBSvsTxcxTxp0C0vtU3wkToQM5awkA/qZUI84d7vY/kpoZ7P6lgu2XlpcDey5YY5FoREe5UDV4hUmVG0ji78ci5+5afQ80YENcK47WSoXYp5lbc16O9+ozIVQVHoV5ADNzCYNVYVVWsyexeSRDRAoGBAJEa+g3rfVEKDzCXA+EgkTDphwEJyVH2csV9cGFLUnPv7fJgsTCj1QSE6PYHddCChKDBuJ5Yw1VhmqBch3Y4bcyV36hybO+vqzUP3AW1LVeu/NAhd3qRULoaiG5dhKJ28RWMZWr7IP1+xA58y/TbUpHdBhvOmvzopiXKe0SgWeSc";// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public static String ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkE5K/L+l166zCpgLZ5EQRf9f32lNII8xtIJzTiBJaRgYAb2HnW3ZAEnpLNeWl8s5PxWsa6tNtqlrjSG8smNHDmbgF9pF1pLjhbCoe1tMizeuUvX6wypnPH3k2dM5Z4ffyLyvXw8rqO28CUegNLnDtc7U6dq5YhSlntTph3DB5EKL6iNSCs8PtblKwAA108I5beV8lvV75QkkXMU1jdpbA013swBAptyLxTsb/NoUB4eUmjr+uwrhavHoWbolFID2v9MuZ0GYb7TpiBEQSns+VaHi7pJpYXsL+bwSoteKAD+cG2vH8NI5HggMn3eXH6hOFtZ5jsm4NOZ0WgKOjo38UwIDAQAB";//public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhvCnEvUMjsa7N1CybrtIdMY74o1JVyspZqv5Q5yj/8uyaE5LSG+7hFhQZpkJgHFNdKJsICfEKpK95MoKAm9uOV4+p7R7i7FMjVKh8yX6bf4auQXQLa3KeTJ/GSQpw1Z+5cSivyzBb2v+d4dt9MgJj04j6cCo2g9wjYsQ/wpRn/BMdDtA7nUaKfa15gJLz4q/1MYlIjALjnMeXIJXqZdDvBLuQ3JMEAgv6jfFxbU6U71L6ayA1OFdc1RFUrz4SXryOk9Ogoz77/DWCF4fcCZenx/zsBhTUXbl5GDy6/KFeMoU2WkVhFC9N/kG5aAiUTihjHQI3w3APAGAbJZkFJg/iwIDAQAB";// 异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://gojw.xyz/notify";// 同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问(其实就是支付成功后返回的页面)public static String return_url = "http://gojw.xyz/return";// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String CHARSET = "utf-8";// 支付宝网关,public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";// 日志输出地方public static String log_path = "C:\\";//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑/*** 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)* @param sWord 要写入日志里的文本内容*/public static void logResult(String sWord) {FileWriter writer = null;try {writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");writer.write(sWord);} catch (Exception e) {e.printStackTrace();} finally {if (writer != null) {try {writer.close();} catch (IOException e) {e.printStackTrace();}}}}
}

3、支付控制层PayController


@Controller
public class PayController {//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID, AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.sign_type);@RequestMapping("/pay")@ResponseBodypublic String payController(String WIDout_trade_no,String WIDsubject,String WIDtotal_amount,String WIDbody) {//创建支付请求//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = WIDout_trade_no;//付款金额,必填String total_amount =WIDtotal_amount;//订单名称,必填String subject = WIDsubject;//商品描述,可空String body = WIDbody;alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","+ "\"total_amount\":\"" + total_amount + "\","+ "\"subject\":\"" + subject + "\","+ "\"body\":\"" + body + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求String form = "";try {form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单} catch (AlipayApiException e) {e.printStackTrace();}return  form;}@ResponseBody@RequestMapping("/dingdanLook")public String dingdanChaxun(){//查看订单信息//设置请求参数AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();alipayTradeQueryRequest.setBizContent("{" +"    \"out_trade_no\":\"201503s240440010101002\"  " +//商户订单号"}"  );String body="";try {body = alipayClient.execute(alipayTradeQueryRequest).getBody();} catch (AlipayApiException e) {e.printStackTrace();}return body;}@ResponseBody@PostMapping("/notify")                   //异步验签接口public String notifyer(HttpServletRequest request) throws AlipayApiException {boolean b = mysignVerified(request);if (b){System.out.println("异步验签成功");//修改数据库订单状态return "success";}else {System.out.println("异步验签失败");return "failure";}
}@GetMapping(value = "/return")            //同步验签接口public String returner(HttpServletRequest request) throws AlipayApiException {boolean b = mysignVerified(request);if (b){System.out.println("同步验签成功-跳转到成功后页面");//修改数据库订单状态return "/success";}else {System.out.println("同步验签失败-跳转到充值页面让用户重新充值");return "/error";}}/**   验签方法* */public boolean mysignVerified(HttpServletRequest request) throws AlipayApiException {Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = iter.next();String[] values = requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");params.put(name, valueStr);}//String out_trade_no = request.getParameter("out_trade_no");// 商户订单号return AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.sign_type); //调用SDK验证签名}@RequestMapping("/")public String toTest(){return "index";}
}

4、前台页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/pay" method="post">订单号:<input type="text" name="WIDout_trade_no" required><br/>订单名称:<input type="text" name="WIDsubject" required><br/>付款金额:<input type="text" name="WIDtotal_amount" required><br/>WIDbody:<input type="text" name="WIDbody"><br/><input type="submit" value="下单"> <input type="reset" value="重置">
</form>
</body>
</html>

支付宝支付整体流程,包括验签【同步】【异步】相关推荐

  1. APP接入支付宝支付完整流程及踩坑记录(含服务端)

    本篇主要讲解APP接入支付宝支付完整流程,包含服务端,内容稍长 要接入支付宝支付,需要将APP在支付宝平台创建应用,提交审核,并进行商户签约以获得支付能力 详细参阅官方文档https://docs.o ...

  2. python 支付宝接口_python调用支付宝支付接口流程

    项目演示: 一.输入金额 二.跳转到支付宝付款 三.支付成功 四.跳转回自己网站 在使用支付宝接口的前期准备: 1.支付宝公钥 2.应用公钥 3.应用私钥 4.APPID 5.Django 1.11. ...

  3. 微信支付V3版本回调+验签流程

    本文主要是接前面2篇微信V3支付参数准备和微信V3支付整合进项目中的后续之微信支付后的回调. 一.回调验签流程介绍 二.核心流程操作 本文主要是接前面2篇微信V3支付参数准备和微信V3支付整合进项目中 ...

  4. 新版支付宝WAP支付成功回调接口验签失败问题解决办法

    支付宝旧版回调验签使用的是  AlipayNotify.verify(params),新版本采用的是AlipaySignature.rsaCheckV1,AlipaySignature类在新版SDK包 ...

  5. iOS之“支付宝支付”开发流程

    支付宝快捷支付的主要步骤: 先与支付宝签约,获得商户ID(partner)和账号ID(seller); 下载相应的公钥私钥文件(加密签名用); 下载支付宝SDK; 生成订单信息; 调用支付宝客户端,由 ...

  6. 支付宝怎么提交html表单提交,支付宝支付全流程

    支付宝沙箱环境 蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境.沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考"沙箱支持产品列表&q ...

  7. 微信支付生成签名和验签SDK源码分析

    目录 一.签名分析 1.1 流程分析 1.构造签名串 2.计算签名值 3.设置请求头 二.源码级别分析 二.获取平台证书分析 三.验签分析 3.1 验签使用场景: 3.2 验证流程: 1.获取微信平台 ...

  8. APP接入支付宝支付申请流程

    打开蚂蚁金服平台地址:https://auth.alipay.com/,注册企业账号,角色通常为自研开发者 登录企业账号,进行企业信息认证 开发中心--网页&移动应用--支付接入,创建新的移动 ...

  9. [另类方式破解]支付宝的小程序sign验签参数算法

    前段时间想到支付宝的一个做任务领集分宝的小程序- 挺好的,想要做一个获取到所有任务,然后全自动做任务的工具,抓包发现有sign验签,于是有了本帖 抓完才发现,整个小程序是用https传输数据的. 另类 ...

最新文章

  1. #圆的周长和面积面向对象_数学实验 | 圆的面积公式推导
  2. PS5 发布,揭秘真假难辨的虚拟和现实
  3. supermap iobect .net 7.1.2 图例的拆分
  4. 一个指针的引用引发的血案
  5. Geany包含中文运行报错解决办法
  6. Memcached缓存实例
  7. js进阶 9-14 js如何实现下拉列表多选移除
  8. Spring MVC:表单处理卷。 5 –选择,选项,选项标签
  9. 《Python Cookbook 3rd》笔记(5.6):字符串的 I/O 操作
  10. 请求地址操作中的(int*)
  11. 信息学奥赛一本通 1381:城市路(Dijkstra)
  12. 小菜面试 String 篇 之 统计一个字符串中数字,字母,的个数
  13. 7价 半导体掺杂_半导体物理学(刘恩科第七版) 全套课件.ppt
  14. python 加速运算
  15. 大数据分析技术有哪些
  16. mysql left用法
  17. Linux安装7z压缩软件记录
  18. Splatter Painting题目代码
  19. Linux内核I/O报错信息中hostbyte与driverbyte含义
  20. 初用DB2 UDB V8.2(Stinger)制作CLR存储过程

热门文章

  1. 区块链和区块链联盟_您可能对区块链有误解。 让我来帮助您修复它们。
  2. office安装报错:1935安装程序集组件发生错误
  3. 最优控制理论 六、拉格朗日乘子法和KKT条件
  4. #距离#JZOJ 3256 BZOJ 3170 洛谷 3964 松鼠聚会
  5. 2022年山东省安全员C证特种作业证考试题库模拟考试平台操作
  6. 39.超市微信促销活动5
  7. 腾讯云windows 2008 服务器无法登录,可能是你需要的答案
  8. 017 连续之一点连续、区间连续;间断之可去间断点、跳跃间断点
  9. PTA 07-图6 旅游规划
  10. Linux clamav杀毒