支付宝密钥工具同步验签教程
支付宝开放平台密钥工具不但可以生成密钥(应用公钥、应用私钥),也可以核查自验签结果。本文主要介绍同步响应验签过程。
操作指导
- 打开支付宝开放平台密钥工具,左侧导航栏选择 同步验签。
- 填入返回内容与支付宝公钥,选择签名方式与字符集后,点击按钮 开始验签。工具会从报文中提取出签名值(sign 参数),并对报文做格式处理生成最终验签的字符串(待验签串)。
- 点击 开始验签 获取验签结果。
支付宝密钥工具同步验签教程
支付宝开放平台密钥工具不但可以生成密钥(应用公钥、应用私钥),也可以核查自验签结果。本文主要介绍同步响应验签过程。
支付宝密钥签名教程
开发者可通过 签名 功能手动进行加签操作。生成 签名(sign)后,开发者可与自己代码中请求生成的信息进行对比,了解数据是否正确。
注意:暂仅支持新版 OpenAPI 网关接口签名,不支持老版 MAPI 网关接口签名。
&
字符连接起来,此时生成的字符串为待签名字符串。打开 密钥工具,左侧导航栏选择 签名,输入传入开放平台的 post 内容(不包括字节类型参数,如文件、字节流,剔除 sign 字段,剔除值为空的参数)。
注意:若使用 公钥证书 模式签名,在拼接待签名字符串时需添加解析出来的 应用公钥证书 SN(app_cert_sn)和 支付宝根证书 SN(alipay_root_cert_sn)。
timestamp=2019-01-01 08:09:33&method=alipay.trade.create &app_id=20135234674&sign_type=RSA2&biz_content={"total_amount":"10.08", "buyer_id":"2088123456781234", "discount_amount":""}
配置参数 | 描述 | 示例值 |
appid | APPID 创建应用后生成。 | 2021*********807 |
method | 接口名称 | alipay.trade.create |
charset | 请求和签名使用的字符编码格式,支持 GBK 和 UTF-8。 | 实际开发编码配置。 |
format | 参数返回格式,只支持 JSON。 | JSON |
sign_type | 商家生成签名字符串所使用的签名算法类型,目前支持 RSA2。 | RSA2 |
biz_content | 请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档。 | – |
开发者需填入应用私钥,查看密钥/证书。
注意:必须与应用 ID 中上传的应用公钥是匹配的,详情可查看 如何检验 RSA2 密钥是否匹配、如何检验密钥证书是否匹配。
RSA2 签名支持字符集 UTF-8 和 GBK。
新建应用请务必使用支持 RSA2 即 2048 位。(目前已使用 RSA 密钥长度即 1024 位密钥长度的应用仍然可以正常调用接口,详情可查看 开放平台接口签名方式升级公告)。
支付宝密钥格式转换教程
可通过格式转换区分密钥的格式类型。
支付宝密钥匹配教程
校验应用私钥和应用公钥是否匹配。
支付宝开放平台密钥工具生成密钥或 CSR 文件
您可以通过本文了解如何使用支付宝开放平台密钥工具生成密钥或 CSR 文件:
本步骤指引以 MAC_OSX 界面为例。
本步骤指引以 MAC_OSX 界面为例。
xxx@sandbox.com
,组织/公司就需要配置成 xxx@sandbox.com
。支付宝开放平台密钥工具可以生成应用公钥、应用私钥、CSR 文件,并提供密钥匹配、格式转换、签名、同步验签、异步验签等功能。
支付宝开放平台密钥工具可以生成应用公钥、应用私钥、CSR 文件,并提供密钥匹配、格式转换、签名、同步验签、异步验签等功能。
注意:MAC 系统安装密钥工具时可能会提示 无法打开“支付宝开放平台密钥工具”,因为Apple无法检查其是否包含恶意软件。解决方案见下文。
支付宝获取 APPID
APPID 相当于应用的身份证号,是支付宝分配给开发者的应用 ID,只有应用创建后才可以获取。
请登录 支付宝开放平台 找到对应应用,名称下数字串即为 APPID,后续可用于 OpenAPI 调用等操作。
支付宝获取 PID
PID(合作者身份 ID)是商家与支付宝签约后,商家获得的支付宝商家唯一识别码。
由于身份不同获取方式不同,以下分别介绍商家获取自己与服务商获取商家 PID 的方式。
服务商获取商家的 PID,需要使用 获取会员信息,调用 alipay.system.oauth.token(换取授权访问令牌) 接口。
支付宝pageExecute() 方法如何生成 url 链接?
网站类的接口(例如手机网站支付、电脑网站支付)接口的请求使用 pageExecute() 方式进行请求默认为 POST 方式请求,即生成 form 表单,GET 方式请求生成 url 链接。
注意:
不同语言请求方式不同,如下:
//post方式请求,生成form表单 response= alipayClient.pageExecute(alipayRequest).getBody(); //get方式请求,即生成url链接 response = alipayClient.pageExecute(alipayRequest,"GET").getBody();
//post方式请求,生成form表单 $result = $aop->pageExecute($reques); //get方式请求,即生成url链接 $result = $aop->pageExecute($request,"GET");
//post方式请求,生成form表单 response= client.pageExecute(request); //get方式请求,即生成url链接 response = client.pageExecute(request,"", "GET");
//post方式请求,生成form表单 response = client.page_execute(request) //get方式请求,即生成url链接 response = client.page_execute(request,http_method="GET")
//post方式请求,生成form表单(无需设置调用setMethod) const formData = new AlipayFormData(); //get方式请求,即生成url链接(需调用setMethod并传入get) const formData = new AlipayFormData(); formData.setMethod('get');
支付宝服务端如何接收通知及验签?
以支付接口接收通知并处理为例。
Java 异步验签示例
//获取支付宝POST过来反馈信息 Map< String , String > params = new HashMap < String , String > (); Map requestParams = request.getParameterMap(); for(Iterator iter = requestParams.keySet().iterator();iter.hasNext();){ String name = (String)iter.next(); String[] values = (String [])requestParams.get(name); String valueStr = ""; for(int i = 0;i < values.length;i ++ ){ valueStr = (i==values.length-1)?valueStr + values [i]:valueStr + values[i] + ","; } //乱码解决,这段代码在出现乱码时使用。 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put (name,valueStr); } //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。 //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) boolean flag = AlipaySignature.rsaCheckV1 (params,alipaypublicKey, "UTF-8","RSA2");
Java异步验签示例(证书)
//获取支付宝POST过来反馈信息 Map<String,String> params = new HashMap<String,String>(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext ();) { String name = ( String )iter.next(); String[] values = (String[])requestParams.get(name); String valueStr=""; for(int i = 0;i < values.length; i++){ valueStr = (i== values.length-1)?valueStr+values[i]:valueStr+values[i] + ","; } //乱码解决,这段代码在出现乱码时使用。 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name,valueStr); } //切记alipayPublicCertPath是支付宝公钥证书路径,请去open.alipay.com对应应用下载。 //boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType) boolean flag = AlipaySignature.rsaCertCheckV1(params,alipayPublicCertPath,"UTF-8","RSA2");
PHP异步验签示例
php语言公钥与公钥证书验签方法相同。 $aop = new AopClient; $aop->alipayrsaPublicKey = '请填写支付宝公钥/支付宝公钥证书路径'; $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
C#异步验签示例
验签方法中 keyFromFile 必传 false,否则验签失败。
// 获 取 支 付 宝 POST 过 来 通 知 消 息 , 并 以 “参 数 名 = 参 数 值 ” 的 形 式 组 成 数 组 // request 回 来 的 信 息 组 成 的 数 组 public Dictionary<string,string> GetRequestPost() { int i = 0 ; IDictionary<string,string> sArray = new IDictionary<string,string>(); NameValueCollection coll; // Load Form variables into NameValueCollection variable . coll = Request.Form ; //Get names of all forms into a string array . String[] requestItem = coll.AllKeys; for (i = 0;i < requestItem.Length ; i++) { sArray.Add( requestItem[i], Request.Form[requestItem[i]]); } return sArray ; } // 切 记 alipaypublickey 是 支 付 宝 的 公 钥 , 请 去 open .alipay .com 对 应 应 用 下 查 看 。 // bool RSACheckV1 ( IDictionary < string , string > parameters , string alipaypublicKey , string charset , string signType , bool keyFromFile ) bool flag = AlipaySignature.RSACheckV1(GetRequestPost(),alipaypublicKey,"UTF-8","RSA2",false);
C#异步验签示例(证书)
// 获 取 支 付 宝 POST 过 来 通 知 消 息 , 并 以 “参 数 名 = 参 数 值 ” 的 形 式 组 成 数 组 // request 回 来 的 信 息 组 成 的 数 组 public Dictionary<string,string> GetRequestPost() { int i = 0 ; IDictionary<string,string> sArray = new IDictionary<string,string>(); NameValueCollection coll; // Load Form variables into NameValueCollection variable . coll = Request.Form ; //Get names of all forms into a string array . String[] requestItem = coll.AllKeys; for (i = 0;i < requestItem.Length ; i++) { sArray.Add( requestItem[i], Request.Form[requestItem[i]]); } return sArray ; } // 切 记 alipayPublicCertPath 是 支付宝公钥证书路径 , 请 去 open .alipay .com 对 应 应 用 下 查 看 。 // bool RSACheckV1 ( IDictionary < string , string > parameters , string alipayPublicCertPath , string charset , string signType) bool flag = AlipaySignature.RSACertCheckV1(dics, alipayPublicCertPath, "UTF-8", "RSA2");
支付宝当前开放平台支持哪些权威 CA 签发的证书?
当前开放平台支持根 CA 列表:
机构名称 | 电子认证服务机构简称 | 证书主题名称 | 密钥算法 | 证书生效时间(GMT) | 证书失效时间(GMT) |
浙江蚂蚁小微金融服务集团股份有限公司 | 蚂蚁CA | Ant Financial Certification Authority R1 | RSA4096 | 2018/3/21 13:48 | 2038/2/28 13:48 |
中金金融认证中心有限公司 | CFCA | CFCA ACS CA | RSA4096 | 2015/9/23 3:24 | 2035/9/28 3:24 |
北京天威诚信电子商务服务有限公司 | 天威诚信 | iTrusChina Class 3 Root CA – G3 | RSA2048 | 2013/4/18 9:36 | 2033/4/18 9:36 |
北京天威诚信电子商务服务有限公司 | 天威诚信 | iTrusChina Class 2 Root CA – G3 | RSA2048 | 2013/4/18 9:39 | 2033/4/18 9:39 |
国家根 | ROOTCA | ROOTCA | SM2 | 2012/7/14 3:11 | 2042/7/7 3:11 |
使用公钥证书签名方式下,为什么请求参数中必须设置支付宝根证书 SN(alipay_root_cert_sn)?
对动态下载的支付宝公钥证执行的证书校验过程中需要使用到支付宝根证书。但公钥证书的变更有可能是由于根证书的变更导致,若根证书未更新,则会引起公钥证书更新失败,导致商家验签失败。为降低该风险,支付宝开放平台强制要求证书签名模式的商家同时携带当前使用的支付宝根证书 SN,开放平台可基于该根证书 SN 统计未及时更新支付宝根证书的商家。
支付宝使用公钥证书签名方式下,为什么开放平台网关的响应报文需要携带支付宝公钥证书 SN(alipay_cert_sn)?
开发者上传自己的应用公钥证书后,开放平台会为开发者应用自动签发支付宝公钥证书供开发者下载,用来对开放平台网关响应报文做验签。
但是支付宝公钥证书可能因证书到期或者变更 CA 签发机构等原因,可能会重新签发证书。在重新签发前,开放平台会在门户上提前提醒开发者支付宝应用公钥证书变更时间。
但为避免开发者因未能及时感知支付宝公钥证书变更而导致验签失败,开放平台提供了一种支付宝公钥证书无感知升级机制,具体流程如下:
支付宝使用公钥证书签名方式下,为什么请求参数中必须应用公钥证书 SN(app_cert_sn)?
当前开放平台支持两种签名模式:公钥模式、公钥证书模式,开放平台网关会根据请求参数中是否存在应用公钥证书 SN(app_cert_sn)来判断当前请求是使用公钥模式还是公钥证书模式。
若开发者选择了公钥证书签名模式,上传了应用公钥证书,并使用该公钥对应的私钥加签,但请求参数中未携带应用公钥证书 SN。开放平台网关收到请求后,会认为该请求使用公钥签名模式,将导致网关验签失败。
另外,开发者也一定要确保自己用来加签的私钥、请求参数中应用公钥证书 SN 的值、上传到开放平台的应用公钥证书必须是匹配的,否则网关会验签失败。
使用公钥证书签名方式下, 请求参数中需要携带应用公钥证书 SN(app_cert_sn)、支付宝根证书 SN(alipay_root_cert_sn),这里的 SN 是指什么?
这里的 SN 是指基于开放平台提供的计算规则,动态计算出来的公钥证书序列号,与 X.509 证书中内置的序列号(serialNumber)不同。具体的计算规则如下:
/** * 获取证书序列号 * @param certPath X.509证书文件路径 * @return 返回证书序列号 * @throws AlipayApiException */ public static String getCertSN ( String certPath )
说明:开放平台支持开发者上传自己找第三方权威 CA 签发的证书,而证书文件中内置序列号只能保证同一家签发机构签发的证书不重复。所以不支持直接使用证书文件中内置的序列号。
老应用公钥证书如何更换成新公钥证书?、
开发者登录开放平台,在应用 加签方式 设置页面,选择 公钥证书 方式,再在该页面中通过 上传 CSR 文件在线生成证书 或 上传已申请证书 两种方式设置应用新应用公钥证书。详情可查看 开放平台证书升级指南。
注意:
上传新应用公钥证书后,开放平台将为老应用公钥证书保留 7 天有效期(若在这 7 天内老证书到期,以老证书自身过期时间点为准),超过 7 天后老证书将不可用。开发者务必在更新证书后 7 天时间内,更换接入开放平台网关代码中的应用公钥证书,否则 7 天后开放平台网关将验签失败。
原使用公钥签名方式的应用如何升级公钥证书签名方式?
开发者登录开放平台,在应用 加签方式 设置页面,选择 公钥证书 方式,再在该页面中通过 上传 CSR 文件在线生成证书 或 上传已申请证书 两种方式设置应用的公钥证书。详情可查看 开放平台证书升级指南。
注意:对于从 公钥 变更到 公钥证书 签名方式的应用,在变更 7 日内允许开发者撤销证书回退到 公钥 模式;变更一周后不允许再回退到原模式。开发者调用支付宝网关的代码也需要升级,否则变更 7 日后原来的 公钥 模式接入会被支付宝网关拦截而无法成功调用。
开放平台支持的公钥、公钥证书两种签名方式有什么区别?
在报文签名场景下,报文接受方使用发送方的公钥进行报文验签,该功能两种签名方式都可以实现。而证书签名方式的优势在于引入了 CA 机构对公钥持有者进行身份识别,保证该证书所属实体的真实性,以实现报文的抗抵赖。
支付宝开放平台 OpenAPI 网关接口和支付宝 mapi 网关接口签名处理上有何区别?
开放平台接口网关地址是 open.alipay.com
,mapi 网关地址是 mapi.alipay.com
。
签名专区描述的内容是针对 OpenAPI 网关接口的签名和验签方法。如果是 mapi 网关接口,签名规则有所区别,详情可查看 签名与验签。
和支付宝交换公钥是什么意思?
开发者私钥由开发者自行保管,把对应公钥提供给支付宝。相应的,支付宝提供自己的公钥给开发者,这称为交换公钥。
开发者使用开发者私钥对请求内容签名,支付宝收到请求后,会使用开发者公钥进行验签,验签通过证明信息来源可靠并且未篡改。
支付宝发送给开发者的数据中,支付宝也会使用自己的私钥进行签名。商家收到后,使用支付宝公钥验签,验签通过证明是支付宝发送的消息,并且未篡改。