下一篇 SpringBoot + Vue 结合支付宝支付(2)-- 项目搭建
⽀付能⼒、⽀付扩展、资⾦能⼒、⼝碑能⼒、营销能⼒、会员能⼒、⾏业能⼒、安全能⼒、基础能⼒
应⽤场景、准⼊条件、计费模式
https://open.alipay.com/
step1:
step2:
step3:
电脑网站支付介绍: https://opendocs.alipay.com/open/270/105898
直接使用沙箱提供的开发参数,无需进行应用的创建、绑定、上线和签约
# 支付宝支付相关参数
# 应用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 进行内网穿透
首先我们点击进入沙箱环境设置 https://open.alipay.com/develop/sandbox/app
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nriSz6OW-1654511449599)(https://note.youdao.com/yws/public/resource/06fc2d22a87ef9e6d68a0346a60471d2/xmlnote/337814BA05B14457AE58FF2EB099454E/30228)]
然后我们就可以直接填写 APPID 和 商家 PID、支付宝网关
而接口加签方式也已经为我们都配置了,只需要我们点击查看即可获取到应用私匙与支付宝公匙填入我们的配置文件
然后我们对接口内容也可以进行对称加密,点击设置,点击生成新密钥即可获得
此时我们就只需要在开发时配置 授权回调地址 即可
我们可以对商家和买家的账号信息进行设置,支付时使用买家账号即可
我们需要下载沙箱版的支付宝app来方便我们进行测试,我们可以使用手机支付宝扫一扫即可下载
我们需要使用买家账号在沙箱app上进行登录
支付宝开放平台的应用管理体系,使用了公私钥的机制,商家可在支付宝开放平台 密钥管理 中设置应用的 接口加签方式 中为自身应用配置 公钥/公钥证书 防止数据篡改,以此来保障商家应用和支付宝交互的安全性。
公钥: 即 应用公钥(public_key),开发者通过支付宝工具自行生成的公钥信息。获取详情可查看 生成密钥。
私钥:即 应用私钥(private_key),开发者通过支付宝工具自行生成的私钥信息。获取详情可查看 生成密钥。
支付宝公钥:开发者在开放平台配置 应用公钥 后由支付宝生成,供开发者验证来自支付宝的同步、异步信息签名。获取详情可查看 获取支付宝公钥。
公钥证书:即 应用公钥证书,开发者在开放平台上传 CSR 文件后由支付宝自动生成,供开发者下载使用。获取详情可查看 获取证书。
支付宝根证书:开发者在开放平台上传 CSR 文件后,由支付宝生成供开发者下载后验证来自支付宝的同步、异步信息签名。获取详情可查看 获取证书。
CSR 文件:CSR 即证书签名请求(Certificate Signing Request),CSR 文件是申请 公钥证书 时所需要的一个数据文件。获取详情可查看 生成密钥。
支付宝开放平台支持使用 公钥、公钥证书 两种签名方式,两种方式区别及选择说明如下:
商家在应用中使用自己的 私钥 对消息加签之后,消息和签名会传递给支付宝,支付宝则使用应用的 公钥/公钥证书 验证消息的真实性(来自于合法应用的真实消息)。
对于支付宝返回消息给商家应用的情形,应用则使用支付宝的 支付宝公钥 或 支付宝公钥证书及支付宝根证书 等来验证返回消息的真实性。
注意:
支付宝开放平台开发助手生成密钥主要使用 RSA2 、国密和 RSA 三种签名算法。签名主要包含两个过程:摘要和非对称加密。
首先对需要签名的数据做摘要(类似于常见的 MD5)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果,详情可查看 What is a Digital Signature?、数字签名是什么?。
**说明:**新建应用只支持 RSA2 签名方式(安全能力高于 RSA),目前已使用 RSA 签名方式的应用仍然可以正常调用接口,详情可查看 开放平台证书升级指南。
签名算法 | 标准签名算法 | 描述 |
---|---|---|
RSA2 | SHA256WithRSA | 强制要求 RSA 密钥的长度至少为 2048。 |
RSA | SHA1WithRSA | 对 RSA 密钥的长度不限制,推荐使用 2048 位以上。 |
注意:
通过 支付宝开放平台开发助手 生成密钥之后,可使用支付宝开放平台 SDK 、支付宝开放平台研发助手及自行实现三种方式进行签名。
这里主要介绍 使用支付宝 SDK 签名方式下通过 公钥 对请求内容进行签名。
以 Java 语言为例,签名和验签的过程请参见下方。
Collections.sort
方法)。然后将所有参数拼接起来,去掉 key 或 value 为空的参数,并用 &
连接,组成签名原文。最后使用 RSA 的私钥对签名原文进行签名。true
则验证成功,否则验证未通过。支付宝开放平台 SDK 封装了签名和验签过程,只需配置应用信息及密钥参数即可,建议使用。详情可查看 SDK 下载地址。
说明: 文中代码部分以 Java 语言演示,其它语言请查看各自 SDK。
请根据需要确定加签方式,以下介绍公钥与公钥证书两种签名方法。
公钥方式是指开发者将 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);
这里介绍如何在选择公钥方式下,通过支付宝开放平台 SDK验签方法。
说明:
支付宝开放平台 SDK 封装了签名和验签过程,开发者只需配置应用信息及密钥参数,建议首选。详情可查看 服务端 SDK。
开放平台 SDK 封装了同步返回验签实现,只需在创建 DefaultAlipayClient
对象时设置以下参数,同步返回报文时会自动进行验签。
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);
某些情况下(例如扫码支付成功时),支付宝会给商家发送异步通知。 如果某商家设置的通知地址为 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)-- 项目搭建