SpringBoot + Vue 结合支付宝支付(1)-- 准备工作

下一篇 SpringBoot + Vue 结合支付宝支付(2)-- 项目搭建

1、能力地图

⽀付能⼒、⽀付扩展、资⾦能⼒、⼝碑能⼒、营销能⼒、会员能⼒、⾏业能⼒、安全能⼒、基础能⼒

2、电脑网站支付产品介绍

应⽤场景、准⼊条件、计费模式

3、接入准备

1、开放平台账号注册

https://open.alipay.com/

step1:

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第1张图片

step2:

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第2张图片

step3:

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第3张图片

2、常规接入流程

电脑网站支付介绍: https://opendocs.alipay.com/open/270/105898

  • 创建应⽤:选择应⽤类型、填写应⽤基本信息、添加应⽤功能、配置应⽤环境(获取⽀付宝公钥、应⽤公钥、应⽤私钥、⽀付宝⽹关地址,配置接⼝内容加密⽅式)、查看 APPID
  • 绑定应⽤:将开发者账号中的APPID和商家账号PID进⾏绑定
  • 配置秘钥:即创建应⽤中的“配置应⽤环境”步骤
  • 上线应⽤:将应⽤提交审核
  • 签约功能:在商家中⼼上传营业执照、已备案⽹站信息等,提交审核进⾏签约

3、沙箱接入流程

直接使用沙箱提供的开发参数,无需进行应用的创建、绑定、上线和签约

  • 沙箱环境配置:https://opendocs.alipay.com/common/02kkv7
  • 沙箱版⽀付宝的下载和登录:https://open.alipay.com/platform/appDaily.htm?tab=tool

配置参数文件

# 支付宝支付相关参数

# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,开发时使用沙箱提供的APPID,生产环境改成自己的APPID
alipay.app-id=

# 商户PID,卖家支付宝账号
alipay.seller-id=

# 支付宝网关
alipay.gateway-url=https://openapi.alipaydev.com/gateway.do

# 商户私钥,您的PKCS8格式RSA2私钥
alipay.merchant-private-key=

# 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
alipay.alipay-public-key=

# 接口内容加密秘匙,对称秘匙
alipay.content-key=

# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问(其实就是支付成功后返回的页面)
alipay.return-url=http://localhost:8080/#/success

# 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
# 注意:每次重新启动ngork,都需要根据实际情况修改这个配置
alipay.notify-url=


通知地址配置可以查看 使用 ngrok 进行内网穿透

1、设置沙箱应用

首先我们点击进入沙箱环境设置 https://open.alipay.com/develop/sandbox/app

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nriSz6OW-1654511449599)(https://note.youdao.com/yws/public/resource/06fc2d22a87ef9e6d68a0346a60471d2/xmlnote/337814BA05B14457AE58FF2EB099454E/30228)]

然后我们就可以直接填写 APPID商家 PID支付宝网关

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第4张图片

而接口加签方式也已经为我们都配置了,只需要我们点击查看即可获取到应用私匙支付宝公匙填入我们的配置文件

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第5张图片

然后我们对接口内容也可以进行对称加密,点击设置,点击生成新密钥即可获得
SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第6张图片

此时我们就只需要在开发时配置 授权回调地址 即可

2、沙箱账号配置

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第7张图片

1、沙箱账号

我们可以对商家和买家的账号信息进行设置,支付时使用买家账号即可

2、沙箱app

我们需要下载沙箱版的支付宝app来方便我们进行测试,我们可以使用手机支付宝扫一扫即可下载

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第8张图片

我们需要使用买家账号在沙箱app上进行登录

2、签名与验签介绍

支付宝开放平台的应用管理体系,使用了公私钥的机制,商家可在支付宝开放平台 密钥管理 中设置应用的 接口加签方式 中为自身应用配置 公钥/公钥证书 防止数据篡改,以此来保障商家应用和支付宝交互的安全性。

1、名词解释

公钥:应用公钥(public_key),开发者通过支付宝工具自行生成的公钥信息。获取详情可查看 生成密钥。

私钥:应用私钥(private_key),开发者通过支付宝工具自行生成的私钥信息。获取详情可查看 生成密钥

支付宝公钥:开发者在开放平台配置 应用公钥 后由支付宝生成,供开发者验证来自支付宝的同步、异步信息签名。获取详情可查看 获取支付宝公钥

公钥证书:应用公钥证书,开发者在开放平台上传 CSR 文件后由支付宝自动生成,供开发者下载使用。获取详情可查看 获取证书

支付宝根证书:开发者在开放平台上传 CSR 文件后,由支付宝生成供开发者下载后验证来自支付宝的同步、异步信息签名。获取详情可查看 获取证书

CSR 文件:CSR 即证书签名请求(Certificate Signing Request),CSR 文件是申请 公钥证书 时所需要的一个数据文件。获取详情可查看 生成密钥

2、签名方式选择说明

支付宝开放平台支持使用 公钥公钥证书 两种签名方式,两种方式区别及选择说明如下:

  • 企业开发者若涉及 资金类支出接口 接入,必须使用 公钥证书 方式。
  • 个人开发者不涉及到资金类接口,建议使用 公钥 方式进行加签。
  • 在报文签名场景下,报文接受方使用发送方的公钥进行报文验签,该功能两种签名方式都可以实现。
  • 公钥证书签名方式引入了 CA 机构对公钥持有者进行身份识别,保证该证书所属实体的真实性,以实现报文的抗抵赖。
  • 公钥证书签名方式下,开放平台支持通过上传 CSR 文件的方式给开发者在线签发应用公钥证书,新的开放平台 RSA 验签和签名工具支持生成 CSR 文件。

3、加签、验签机制说明

商家在应用中使用自己的 私钥 对消息加签之后,消息和签名会传递给支付宝,支付宝则使用应用的 公钥/公钥证书 验证消息的真实性(来自于合法应用的真实消息)。

对于支付宝返回消息给商家应用的情形,应用则使用支付宝的 支付宝公钥支付宝公钥证书及支付宝根证书 等来验证返回消息的真实性。

SpringBoot + Vue 结合支付宝支付(1)-- 准备工作_第9张图片

注意

  • 商家应用必须保障应用私钥的安全性,从而才能保障应用和和支付宝交互的安全性。
  • 公钥证书模式中上传的文件,无论是 CSR 文件或者开发者自己申请的公钥证书文件,必须和用户本地代码中加密的应用私钥是匹配的,否则会导致支付宝开放平台验签失败。

4、签名算法说明

支付宝开放平台开发助手生成密钥主要使用 RSA2 、国密和 RSA 三种签名算法。签名主要包含两个过程:摘要和非对称加密。

首先对需要签名的数据做摘要(类似于常见的 MD5)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果,详情可查看 What is a Digital Signature?、数字签名是什么?。

**说明:**新建应用只支持 RSA2 签名方式(安全能力高于 RSA),目前已使用 RSA 签名方式的应用仍然可以正常调用接口,详情可查看 开放平台证书升级指南。

签名算法 标准签名算法 描述
RSA2 SHA256WithRSA 强制要求 RSA 密钥的长度至少为 2048。
RSA SHA1WithRSA 对 RSA 密钥的长度不限制,推荐使用 2048 位以上。

注意:

  • 协议参数:开放平台的报文标准中,sign_type 参数用于指定签名算法,若使用 SHA256WithRSA 签名算法则在报文中需要指定 sign_type=RSA2,若开发者使用开放平台 SDK,详情可查看 数据签名。
  • 避免公私钥混用:不同签名算法的签名密钥是隔离的。由于同时提供了两套签名算法,若选择了特定的签名算法,请保证使用对应的私钥签名,同时使用对应的支付宝公钥进行验签。

3、数据签名

1、简介

通过 支付宝开放平台开发助手 生成密钥之后,可使用支付宝开放平台 SDK 、支付宝开放平台研发助手及自行实现三种方式进行签名。

这里主要介绍 使用支付宝 SDK 签名方式下通过 公钥 对请求内容进行签名。

  • **签名:**即生成签名方(通常为支付宝客户端)将传送的消息用私钥加密的过程。
  • **验签:**指验签方(通常为开放平台的服务端)使用公钥对消息进行验证的过程。

1、原理介绍

以 Java 语言为例,签名和验签的过程请参见下方。

  1. 生成签名方(通常为商家)首先将所有参数和值放入一个map 中,并按照 key 值升序排列(调用Collections.sort 方法)。然后将所有参数拼接起来,去掉 key 或 value 为空的参数,并用 & 连接,组成签名原文。最后使用 RSA 的私钥对签名原文进行签名。
  2. 验签方(通常为开放平台的服务端):获取响应中的签名原文和签名,然后使用 RSA 的公钥通过签名原文验证该签名,验证结果为 true 则验证成功,否则验证未通过。

支付宝开放平台 SDK 封装了签名和验签过程,只需配置应用信息及密钥参数即可,建议使用。详情可查看 SDK 下载地址。

说明: 文中代码部分以 Java 语言演示,其它语言请查看各自 SDK。

2、使用支付宝 SDK 签名(推荐)

请根据需要确定加签方式,以下介绍公钥与公钥证书两种签名方法。

1、公钥方式

公钥方式是指开发者将 APPID、应用私钥(private key)、支付宝公钥(alipay public key) 配置在代码中对请求内容进行签名,并对支付宝返回的内容进行验签的方法。

开放平台 SDK 封装了签名实现,只需在创建 DefaultAlipayClient 对象时,设置请求网关(gateway)、应用 ID(app_id)、应用私钥(private_key)、编码格式(charset)、支付宝公钥(alipay_public_key)、签名类型(sign_type)即可,报文请求时会自动进行签名。

AlipayConfig alipayConfig = new AlipayConfig();
//设置网关地址
alipayConfig.setServerUrl(gateway);
//设置应用ID
alipayConfig.setAppId(app_id);
//设置应用私钥
alipayConfig.setPrivateKey(private_key);
//设置请求格式,固定值json
alipayConfig.setFormat("json");
//设置字符集
alipayConfig.setCharset(charset);
//设置支付宝公钥
alipayConfig.setAlipayPublicKey(alipay_public_key);
//设置签名类型
alipayConfig.setSignType(sign_type);
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);

4、数据验签

1、简介

这里介绍如何在选择公钥方式下,通过支付宝开放平台 SDK验签方法。

说明:

  • 公钥方式与自行实现验签加签模式下,同步返回与异步返回的验签方法和报文格式有所不同,详情可查看下方说明。
  • 文中代码部分以 Java 语言演示,其它语言请查看各自 SDK。

2、使用支付宝 SDK 验签

支付宝开放平台 SDK 封装了签名和验签过程,开发者只需配置应用信息及密钥参数,建议首选。详情可查看 服务端 SDK。

1、公钥方式

1、同步返回验签

开放平台 SDK 封装了同步返回验签实现,只需在创建 DefaultAlipayClient 对象时设置以下参数,同步返回报文时会自动进行验签。

  • 请求网关 (gateway)
  • 应用 ID (app_id)
  • 应用私钥 (private_key)
  • 编码格式 (charset)
  • 支付宝公钥 (alipay_public_key)
  • 签名类型 (sign_type)
AlipayConfig alipayConfig = new AlipayConfig();
//设置网关地址
alipayConfig.setServerUrl(gateway);
//设置应用ID
alipayConfig.setAppId(app_id);
//设置应用私钥
alipayConfig.setPrivateKey(private_key);
//设置请求格式,固定值json
alipayConfig.setFormat("json");
//设置字符集
alipayConfig.setCharset(charset);
//设置支付宝公钥
alipayConfig.setAlipayPublicKey(alipay_public_key);
//设置签名类型
alipayConfig.setSignType(sign_type);
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
2、异步通知验签

某些情况下(例如扫码支付成功时),支付宝会给商家发送异步通知。 如果某商家设置的通知地址为 https://api.xx.com/receive_notify.htm,对应接收到通知的示例如下:

https://api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大乐透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00¬ify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA&charset=utf-8¬ify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838¬ify_id=4a91b7a78a503640467525113fb7d8bg8e

开放平台 SDK 提供了 AlipaySignature.verifyV1 方法,可以使用该方法对通知报文验签。

/**
* @param params    待验签的从支付宝接收到的参数Map
* @param publicKey 支付宝公钥
* @param charset   参数内容编码集
* @param signType  指定采用的签名方式,RSA、RSA2、SM2
* @return true:验签通过;false:验签不通过
* @throws AlipayApiException
*/
public static boolean verifyV1(Map<String, String> params, String publicKey, String charset, String signType)

注意: 生活号异步通知需要使用 AlipaySignature.verifyV2 方法,会保留 sign_type 参数参与验签。

/**
* @param params    待验签的从支付宝接收到的参数Map
* @param publicKey 支付宝公钥
* @param charset   参数内容编码集
* @param signType  指定采用的签名方式,RSA、RSA2、SM2
* @return true:验签通过;false:验签不通过
* @throws AlipayApiException
*/
public static boolean verifyV2(Map<String, String> params, String publicKey,
                                   String charset, String signType)

下一篇 SpringBoot + Vue 结合支付宝支付(2)-- 项目搭建

你可能感兴趣的:(开发,spring,boot,java,vue.js)