支付宝支付

开发主要分为三个步骤:一、生成私钥公钥。二、建立应用。三、沙箱环境。四、接口开发

1、生成私钥公钥

1.1、下载支付宝开发者助手

下载密钥生成工具

1.2、生成普通密钥方式

1、根据开发语言选择密钥格式和密钥长度。

说明:

  • 新建应用请务必使用 RSA2 密钥长度 即 2048 位。详情请参见 开放平台证书升级指南。
  • 目前已使用 RSA 密钥长度即 1024 位密钥长度的应用仍然可以正常调用接口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5xy7p55C-1647161550156)(练习.assets/image-20210604141400789.png)]

2、点击 生成密钥,工具会自动生成商户应用公钥(public key)和应用私钥(private key)。随后点击 打开密钥文件路径

3、在弹出的 RSA密钥 文件夹下即可找到生成的公私钥文件。

4、登录 开发者中心控制台

如果没有入驻的话,先入驻:

这里就已经入驻了。

1.3、沙箱环境

回到沙箱应用控制台,点击这个地方设置公钥(注意不是公钥证书哦,我们用的不是证书的方式):

https://openhome.alipay.com/platform/appDaily.htm?tab=info

配置密钥

打开刚刚生成的公钥的文件夹

复制到这里来

点击保存

在这里需要注意两个地方:

  • 沙箱环境下的支付宝网关
  • 配置好自己的公钥

沙箱账号

1.4、配置签名

1、打开支付宝开放平台开发助手,左侧导航栏选择 签名,输入或选择以下参数。

请求参数:若使用公钥证书模式签名,在拼接待签名字符串时需添加解析出来的 应用公钥证书 SN(app_cert_sn)和 支付宝根证书 SN(alipay_root_cert_sn)。

  • 获取方法:获取所有支付宝开放平台的 post 内容,不包括字节类型参数,如文件、字节流,剔除 sign 字段,剔除值为空的参数;按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推;将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串。
  • 参数示例(以电脑网站支付为例)
app_id=2016101800718925&biz_content={"out_trade_no":"20150519815610100992007","product_code":"FAST_INSTANT_TRADE_PAY","total_amount":88.88,"subject":"Iphone6 16G","body":"Iphone6 16G"}&charset=utf-8&format=json&method=alipay.trade.page.pay&sign_type=RSA2&timestamp=2020-10-13 09:58:50&version=1.0
    • 关键参数说明

      配置参数 描述 示例值
      appid APPID 即创建应用后生成。 详情参见 [创建应用](https://opendocs.alipay.com/open/200/105310#查看 APPID)。
      charset 请求和签名使用的字符编码格式,支持 GBK 和 UTF-8 开发者根据实际工程编码配置。
      format 参数返回格式,只支持 json。 json
      sign_type 商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。 RAS2
  • 应用私钥:必须与应用 ID 中上传的应用公钥是匹配的,详情参见 如何检验 RSA2 密钥是否匹配、如何检验密钥证书是否匹配。

  • 字符集:RSA 签名支持字符集 UTF-8 和 GBK。

  • 签名方式:新建应用请务必使用支持 RSA2 即 2048 位。(目前已使用 RSA 密钥长度即 1024 位密钥长度的应用仍然可以正常调用接口,详情请参见 系统公告 >《开放平台接口签名方式升级公告》)。

2、点击按钮 开始签名,输出 待签名内容(经过格式处理后,最终要签名的内容)及 签名(sign)。同时把签名的详细过程打印到 txt 文件《签名步骤》,文件保存在工具存放目录的 RSA 密钥 文件夹下,点击按钮 查看签名生成步骤 即可打开 txt 文件查看。

复制私钥

粘贴

3、点击 查看签名生成步骤,可以查看详细处理流程。

2、springboot集成支付宝【1】

2.1、依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>2.0.2</version></dependency>
</dependencies>

只有基本的web、lombok、支付宝的sdk依赖,下面介绍一下我的项目结构:

2.2、编写支付页面和回调页面

在index.html编写如下代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>确认订单</title>
</head>
<body><div>您的订单信息如下,请确认无误后支付:<br/>xxxxxxxxxx省略订单信息xxxxxxxxxx<form><button type="submit">确认支付</button></form></div>
</body>
</html>

在return.html编写以下代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>支付成功</title>
</head>
<body><div>您已成功购买此商品,感谢您的支持</div>
</body>
</html>

2.3、搭建内网穿透

利用花生壳搭建内网穿透

2.4、配置Spring Boot项目&初始化支付宝SDK

在application.yml配置文件,将公钥、私钥、APPID、支付宝的网关、页面回调、接口回调等信息配置进来:

alipay:# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,开发时使用沙箱提供的APPID,生产环境改成自己的APPIDappId: 换成你自己的APPID# 商户私钥,您的PKCS8格式RSA2私钥privateKey: 换成你自己的私钥,支付宝开发助手生成的私钥# 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。publicKey: 注意:这里是你自己的支付宝的公钥   # 支付网关配置,这一项是写死的,正式环境是 openapi.alipay.comgateway: openapi.alipaydev.com# 支付成功之后的回调页面,只是一个友好页面。主要换成你自己映射的临时域名returnUrl: http://内网穿透域名/return.html# 支付成功的接口回调notifyUrl: http://内网穿透域名/pay/fallback

新版本的SDK 把大部分操作都封装到了Factory类中,但是Factory类在使用之前需要我们配置一下参数,且全局配置一次即可,所以我们把这部分代码拿到ProjectInit类中,在项目启动时执行一次:

package com.example.springbootzfb.zfb;import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;/***  项目初始化** @author wangziyang* @date 2020-09-08* */
@Component
public class ProjectInit implements ApplicationRunner {//应用id@Value("${alipay.appId}")private String appId;//私钥@Value("${alipay.privateKey}")private String privateKey;//公钥@Value("${alipay.publicKey}")private String publicKey;//支付宝网关@Value("${alipay.gateway}")private String gateway;//支付成功后的接口回调地址,不是回调的友好页面,不要弄混了@Value("${alipay.notifyUrl}")private String notifyUrl;/*** 项目初始化事件*/@Overridepublic void run(ApplicationArguments args) throws Exception {//初始化支付宝SDKFactory.setOptions(getOptions());System.out.println("**********支付宝SDK初始化完成**********");}private Config getOptions() {//这里省略了一些不必要的配置,可参考文档的说明Config config = new Config();config.protocol = "https";config.gatewayHost = this.gateway;config.signType = "RSA2";config.appId = this.appId;// 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中config.merchantPrivateKey = this.privateKey;//注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可config.alipayPublicKey = this.publicKey;//可设置异步通知接收服务地址(可选)config.notifyUrl = notifyUrl;return config;}
}

再次启动项目:

2.5、编写下单支付接口

既然要下单,肯定少不了传参,所以我们这里简单的声明一个PaymentBO类:

package com.example.springbootzfb.zfb;import lombok.Data;import java.math.BigDecimal;/***  发起支付时的参数* */
@Data
public class PaymentBO {//省略其他的业务参数,如商品id、购买数量等//商品名称private String subject;//总金额private BigDecimal total = BigDecimal.ZERO;
}

然后在OrderUtil编写如下代码:

package com.example.springbootzfb.zfb;import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;public class OrderUtil {/*** 根据时间戳生成订单号     **/public static String getOrderNo() {DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");LocalDateTime localDateTime = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();return df.format(localDateTime);}
}

接下来,继续看文档:

按照文档描述,我们只需要Factory.Payment.Page.pay就可以发起一个支付请求,比之前还是简洁了不少,其他操作都封装好了。所以我们在PayService编写以下代码:

package com.example.springbootzfb.zfb;import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePayResponse;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.math.BigDecimal;/***  支付宝支付,业务实现** @author wangziyang* @date 2020-09-08* */
@Service
public class PayService {//支付成功后要跳转的页面@Value("${alipay.returnUrl}")private String returnUrl;/***  下单支付* */public Object pay (PaymentBO bo) throws Exception {//从存储介质(如MySQL、Redis)查询商品信息、总金额等敏感信息//…………省略相关代码,这里直接赋值…………bo.setSubject("测试商品");bo.setTotal(new BigDecimal(10.00));//调用sdk,发起支付AlipayTradePagePayResponse response = Factory.Payment//选择网页支付平台.Page()//调用支付方法,设置订单名称、我们自己系统中的订单号、金额、回调页面.pay(bo.getSubject() , OrderUtil.getOrderNo(), bo.getTotal().toString() , returnUrl);//这里的response.body,就是一个可以直接加载的html片段,// 这里为了简单我直接返回这个片段,前端直接return response.body;}
}

再往下,编写PayController:

package com.example.springbootzfb.zfb;import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import java.util.Map;/***  支付宝支付,控制器** @author wangziyang* */
@RestController
@RequestMapping(value = "/pay")
@AllArgsConstructor
public class PayController {private PayService payService;/***  下单支付* */@GetMapping(value = "/confirm" , produces = {"text/html;charset=UTF-8"})public Object pay (@RequestParam(required = false) PaymentBO bo) throws Exception {//这个接口其实应该是post方式的,但是我这里图方便,直接以get方式访问,//且返回格式是text/html,这样前端页面就能直接显示支付宝返回的html片段//真实场景下由post方式请求,返回code、msg、data那种格式的标准结构,让前端拿到data里的//html片段之后自行加载//由于我这里并没有真正的传参数,所以象征性的new一下,避免空指针bo = new PaymentBO();return payService.pay(bo);}/***  支付成功的回调* */@PostMapping(value = "/fallback")public Object fallback (HttpServletRequest request) {Map map = request.getParameterMap();System.out.println("进入了回调");return null;}
}

2.6、支付测试

在index.html页面做如下修改,点击支付的时候访问我们的/pay/confirm接口:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>确认订单</title>
</head>
<body><div>您的订单信息如下,请确认无误后支付:<br/>xxxxxxxxxx省略订单信息xxxxxxxxxx<form enctype="multipart/form-data" action="/pay/confirm" method="get"><button type="submit">确认支付</button></form></div>
</body>
</html>

运行项目,点击确认支付就看到了以下页面(有时候下面的页面会提示有钓鱼风险,换一个浏览器就好,或者关了浏览器重来,这个无解):

这里需要下载手机支付宝,是沙箱版的

然后用刚刚下的沙箱版支付宝,登录进去,账号、密码如下:


2.7、下单支付的定制化参数

上面是最简单的支付。大家可以在API文档看到,下单支付还有很多参数可选,如订单描述、商品类型、订单商品列表的具体信息等等……


公共参数就不用说了,Factory都为我们封装好了;但是下面的业务请求参数,也就是公共参数里的biz_content,如何传呢?pay()方法只提供了基本的4个参数,那可选的请求参数怎么传呢?

对于这个问题,新版的SDK指出需要由我们自己扩展,方式在SDK说明中有:

这个还是挺简单的,就是往Map里放参数,最后通过optional或batchOptional方法进行设置:

所以在这里我就不展示了,大家下去自己扩展就行

2.8、支付完成的回调

前面的回调只是在页面上回显信息,我们需要提供一个接口,供支付宝调用,接收支付宝传来的参数。

首先,我们看文档,看支付宝都返回了哪些信息:

参数有很多,我就不一一列出了。主要的参数是商户订单号(即我们自己生成的订单号)和交易状态, 我们根据订单号是否交易成功,进行后面的业务逻辑,比如给用户加积分、将订单状态变为已支付、发送业务短信、通知商家接单……等等。

参数很多,所以我就不新建实体类了,简单的用Map接一下,在PayController新增以下接口(注意是post方式):

package com.example.springbootzfb.zfb;import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import java.util.Map;/***  支付宝支付,控制器** @author wangziyang* */
@RestController
@RequestMapping(value = "/pay")
@AllArgsConstructor
public class PayController {private PayService payService;/***  下单支付* */@GetMapping(value = "/confirm" , produces = {"text/html;charset=UTF-8"})public Object pay (@RequestParam(required = false) PaymentBO bo) throws Exception {//这个接口其实应该是post方式的,但是我这里图方便,直接以get方式访问,//且返回格式是text/html,这样前端页面就能直接显示支付宝返回的html片段//真实场景下由post方式请求,返回code、msg、data那种格式的标准结构,让前端拿到data里的//html片段之后自行加载//由于我这里并没有真正的传参数,所以象征性的new一下,避免空指针bo = new PaymentBO();return payService.pay(bo);}/***  支付成功的回调* */@PostMapping(value = "/fallback")public Object fallback (HttpServletRequest request) {Map map = request.getParameterMap();System.out.println("进入了回调");return null;}
}

然后在配置文件,将notifyUrl的配置加上:

然后再重新支付一下,我打个断点看一下Map中接到的参数:

可以看到,我们已经接收到了支付宝传来的参数,接下来就是根据自己的业务进行处理了,笔者这里就不再往下写了。

如果想再次进行确认,也可调用下面这个接口,查询订单状态:

文档到这里就全部完成了。

SpringBoot支付宝支付-PC电脑支付相关推荐

  1. Django学习记录10——Django使用支付宝付款(电脑支付,手机网页支付,面对面扫码)

    目录 一.注册支付宝开放平台账号 1.注册 2.创建公私秘钥 2.项目中添加公私密钥 二.生成二维码 1.安装模块等 2.模块的结构 3.电脑支付 4.手机支付 5.面对面扫码(真二维码支付) 三.小 ...

  2. 支付宝沙箱环境 电脑支付

    项目场景: java语言,jdk1.8也可以使用 .支付宝沙箱环境电脑支付. 电脑端生成二维码,手机端扫描支付 AlipayConfig: APP 中接收数据代码: package com.hc;/* ...

  3. php支付宝pc收银台,支付宝支付-PC电脑网站支付

    支付产品全面升级(更新时间:2017/05/05 ),若您使用的是老接口,请移步老版本即时到账文档. 支持沙盒环境的测试 1.有图有真相 使用手机扫码进行支付 i统一收单下单并支付页面接口alipay ...

  4. 支付宝支付-PC电脑网站支付

    支付产品全面升级(更新时间:2017/05/05 ),若您使用的是老接口,请移步老版本即时到账文档. 支持沙盒环境的测试 此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 htt ...

  5. python 网页版支付宝 api_Python接入支付宝进行PC端支付

    1.  支付宝开放平台登录,使用支付宝账号登录 2.选择沙箱模式 [支付宝提供了测试环境] 3.支付宝开发者文档 4.电脑网站支付 5.因为官方并没有提供Python语言的SDK,但是在github上 ...

  6. 支付宝注册企业支付pc端支付接口

    前面忽略注册部分了....很简单的,搞的时候忘记截图了....不好意思哈,尽量用法人去注册,非常快,两个小时左右就ok了,否则的话要2到3天!要有营业执照,身份证正反面,地址最后和营业执照一致!然后你 ...

  7. SpringBoot+支付宝:实现沙箱支付全过程

    1.引入所需依赖 <!--支付依赖--><dependency><groupId>com.alipay.sdk</groupId><artifac ...

  8. springboot 支付宝支付(电脑网站)

    springboot 支付宝支付(电脑支付) 应用:在电脑网页端使用支付宝支付 官方文档:https://opendocs.alipay.com/open/270 ****************** ...

  9. 支付宝支付(2) 电脑网站支付(SpringBoot+沙箱环境+Alipay Easy SDK)

    一.前言 支付宝支付(1) 电脑网站支付(SpringBoot+沙箱环境) Alipay Easy SDK 文档 Alipay Easy -> https://github.com/alipay ...

最新文章

  1. 2022-2028年中国装配式装修行业市场研究及前瞻分析报告
  2. Ubuntu18.04下无法进入图形界面、无法调整分辨率、无法重装显卡驱动问题的解决方式
  3. EnterpriseLibrary2.0系列文章及下载
  4. 人人可以理解的区块链100问
  5. Web前端:11个让你代码整洁的原则
  6. nlp 财务提取_RPA,智慧财务时代的“珍妮纺织机”来了?
  7. Java操作HBase
  8. 中国计算机学会通讯杂志,何积丰. Cyber-physical systems [J]. 中国计算机学会通讯, 2010, 6(1): 25-29....
  9. cisco3550交换机限速配置
  10. N1刷音乐服务器系统,NAS也要发烧-Melco N1A音乐服务器
  11. “蔚小理”将齐聚港股!蔚来申请在港IPO,计划3月10日上市 9个月亏损近19亿元...
  12. html算命源码,index.html
  13. 史上最全40道dubbo面试题
  14. 计算机文字处理员,计算机文字录入处理员
  15. java 集合练习题2
  16. 《单片机原理及应用(魏洪磊)》第七章第10题
  17. android代码禁用软键盘,Android 禁用软键盘
  18. tsm ANS0326E问题处理
  19. Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)
  20. 《Windows驱动开发技术详解》学习笔记

热门文章

  1. python——三国演义 制作词云
  2. 【180623】VC++台球游戏
  3. MITSUMI美上美(SIQ-02FVC3)拨盘编码器硬件连接及stm32f103zet6正交解码测试
  4. 骨传导耳机发声原理是什么,如何选购骨传导耳机
  5. 去了家新公司,技术总监不让用 IntelliJ IDEA想离职了
  6. AI画师技术又精进了? AI画师三维版试玩——Dreamfields和DreamFusion向文本生成3D模型领域进发
  7. 582个专业,1281个本科院校,你会如何选择?
  8. 计量经济学及Stata应用 第二章 Stata入门
  9. UE4_4.26虚拟纹理(RVT)与Megascan景观融合
  10. 计算机软件保护现状,计算机软件保护问题探讨