支付宝密钥工具同步验签教程

支付宝密钥工具同步验签教程

支付宝开放平台密钥工具不但可以生成密钥(应用公钥、应用私钥),也可以核查自验签结果。本文主要介绍同步响应验签过程。

操作指导

  1. 打开支付宝开放平台密钥工具,左侧导航栏选择 同步验签
  2. 填入返回内容与支付宝公钥,选择签名方式与字符集后,点击按钮 开始验签。工具会从报文中提取出签名值(sign 参数),并对报文做格式处理生成最终验签的字符串(待验签串)。
  1. 点击 开始验签 获取验签结果。

支付宝密钥签名教程

支付宝密钥签名教程

开发者可通过 签名 功能手动进行加签操作。生成 签名(sign)后,开发者可与自己代码中请求生成的信息进行对比,了解数据是否正确。

注意:暂仅支持新版 OpenAPI 网关接口签名,不支持老版 MAPI 网关接口签名。

加签原理

  1. 获取所有支付宝开放平台的 post 内容,不包括字节类型参数,如文件、字节流,剔除 sign 字段,剔除值为空的参数;
  2. 按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推;
  3. 将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串。

操作指引

请求参数

打开 密钥工具,左侧导航栏选择 签名,输入传入开放平台的 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":""}

参数说明

配置参数描述示例值
appidAPPID 创建应用后生成。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 位密钥长度的应用仍然可以正常调用接口,详情可查看 开放平台接口签名方式升级公告)。

开始签名

  1. 输入请求参数及应用私钥后点击按钮 开始签名,输出 待签名内容(经过格式处理后,最终要签名的内容)及 签名(sign)。

支付宝密钥格式转换教程

支付宝密钥格式转换教程

可通过格式转换区分密钥的格式类型。

操作指引

  1. 打开支付宝开放平台密钥工具,左侧导航栏选择 格式转换
  2. 填入商家应用私钥,或者点击 从文件导入,读取私钥文件中的内容。
  3. 点击 转换 可进行 PKCS8 格式和 PKCS1 格式私钥的相互转换。

  1. 点击 生成公钥并打开文件位置 即可获取应用公钥。

支付宝密钥匹配教程

支付宝密钥匹配教程

校验应用私钥和应用公钥是否匹配。

操作指引

  • 打开支付宝开放平台密钥工具,左侧导航栏选择 密钥匹配
  • 填入商家应用私钥,或者点击 从文件导入 读取私钥文件中的内容。支持输入 2048 位的 RSA2 私钥(PKCS8/PKCS1 格式)。
  • 填入商家应用公钥,或者点击 从文件导入 读取公钥文件中的内容。
  • 点击 公私钥匹配 按钮,即可查看填入的应用公钥和应用私钥是否匹配。

支付宝开放平台密钥工具生成密钥或 CSR 文件

支付宝开放平台密钥工具生成密钥或 CSR 文件

您可以通过本文了解如何使用支付宝开放平台密钥工具生成密钥或 CSR 文件:

  • 密钥方式:生成 RSA 密钥对(应用公钥、应用私钥)
  • 证书方式:生成 RSA 密钥对(应用公钥、应用私钥)以及公钥证书申请 CSR 文件(在线申请应用公钥证书需要)

注意事项

  • 应用私钥(private key)需填写到代码中供签名时使用。生成的私钥需妥善保管,避免遗失,不要泄露。
  • 应用公钥(public key)需上传到支付宝开放平台。
  • 密钥和应用(APPID)一一对应,即开发者需要为名下的每个应用分别设置密钥,且不同应用的密钥不能混用。
  • RSA2 加密算法默认生成格式为 PKCS8,如需 PKCS1 格式,可使用 格式转换

密钥方式

本步骤指引以 MAC_OSX 界面为例。

  1. 加签方式选择密钥后,选择加密算法。
  1. 点击 生成密钥 按钮,工具会自动生成应用公钥(public_key)和应用私钥(private_key)。
  1. 点击 打开文件位置,在文件夹中即可找到生成的公私钥文件。

证书方式

本步骤指引以 MAC_OSX 界面为例。

  1. 选择加签方式为 证书 后,输入 组织/公司

  1. 注意:
  • 组织/公司:名称一定要和支付宝开放平台应用主账号的名称保持一致,否则会导致后续步骤中上传 CSR 证书文件校验失败。
  • 沙箱环境下配置 CSR 公钥证书时,若沙箱账号为:
  • 2020 年 07 月 24 日前获取的沙箱账号,组织/公司 需固定填写 沙箱环境
  • 2020 年 07 月 24 日后获取的沙箱账号,组织/公司 需填写沙箱商家账号,例如:沙箱商家账号为 xxx@sandbox.com,组织/公司就需要配置成 xxx@sandbox.com
  1. 点击 生成CSR文件 后,点击 打开文件位置,在对应的文件夹里可以看到 3 个文件:应用公钥、应用私钥,及 .csr 格式的应用公钥证书申请文件。

密钥工具下载:支付宝开放平台密钥工具可以生成应用公钥、应用私钥、CSR 文件,并提供密钥匹配、格式转换、签名、同步验签、异步验签等功能。

支付宝开放平台密钥工具可以生成应用公钥、应用私钥、CSR 文件,并提供密钥匹配、格式转换、签名、同步验签、异步验签等功能。

支付宝开放平台密钥工具可以生成应用公钥、应用私钥、CSR 文件,并提供密钥匹配、格式转换、签名、同步验签、异步验签等功能。

工具下载

  • Windows(请不要安装在含有空格的目录路径下,否则会导致公私钥乱码的问题)
  • MAC_OSX

注意:MAC 系统安装密钥工具时可能会提示 无法打开“支付宝开放平台密钥工具”,因为Apple无法检查其是否包含恶意软件。解决方案见下文。

  • 方案一:系统偏好设置 > 安全性与隐私 > 通用中启用该应用。
  • 方案二:按住 Control 键点击应用, 然后打开,这样会把应用增加到白名单中许可执行。

功能列表

功能说明
生成密钥生成应用公钥、应用私钥和公钥证书申请 CSR 文件。支持 RSA2 、SM2 签名算法。
密钥匹配校验应用私钥和应用公钥是否匹配。
格式转换实现应用私钥在 PKCS8 和 PKCS1 的格式转换,可以通过私钥找到对应的公钥。
签名使用商家应用私钥对请求参数做签名。
同步验签对支付宝同步响应内容做验签。
异步验签对支付宝异步通知内容做验签。

支付宝获取 PID

支付宝获取 PID

简介

PID(合作者身份 ID)是商家与支付宝签约后,商家获得的支付宝商家唯一识别码。

获取

由于身份不同获取方式不同,以下分别介绍商家获取自己与服务商获取商家 PID 的方式。

商家获取

  1. 登录 开放平台 点击右上角进入 账户中心
  1. 进入 密钥管理 中的 mapi网关产品密钥 页面,以 2088 开头的 ID 即为合作伙伴身份 PID。

服务商获取

服务商获取商家的 PID,需要使用 获取会员信息,调用 alipay.system.oauth.token(换取授权访问令牌)  接口。

支付宝pageExecute() 方法如何生成 url 链接?

支付宝pageExecute() 方法如何生成 url 链接?

网站类的接口(例如手机网站支付、电脑网站支付)接口的请求使用 pageExecute() 方式进行请求默认为 POST 方式请求,即生成 form 表单,GET 方式请求生成 url 链接。

注意

  • 该 pageExecute() 方法生成 url 链接的为 Alipay SDK(老版)接口请求方法。
  • Alipay Easy SDK(新版)目前只支持输出 form表单,不支持打印出 url 链接。

不同语言请求方式不同,如下:

  • Java 示例代码:
//post方式请求,生成form表单
response= alipayClient.pageExecute(alipayRequest).getBody();
//get方式请求,即生成url链接
response = alipayClient.pageExecute(alipayRequest,"GET").getBody();
  • PHP 示例代码:
//post方式请求,生成form表单
$result = $aop->pageExecute($reques);
//get方式请求,即生成url链接
$result = $aop->pageExecute($request,"GET");
  • .Net 示例代码:
    注意:.Net 开发语言 GET 必须大写,不支持小写,并且设置在第三个参数位置。
//post方式请求,生成form表单
response= client.pageExecute(request);
//get方式请求,即生成url链接
response = client.pageExecute(request,"", "GET");
  • Python 示例代码:
//post方式请求,生成form表单
response = client.page_execute(request)

//get方式请求,即生成url链接
response = client.page_execute(request,http_method="GET")
  • NodeJS 示例代码:
    注意:post 方式请求时,调用 setMethod 并传入 post,则返回 from 表单(不调用 setMethod 默认为 post 请求)。
//post方式请求,生成form表单(无需设置调用setMethod)
const formData = new AlipayFormData();

//get方式请求,即生成url链接(需调用setMethod并传入get)
const formData = new AlipayFormData();
formData.setMethod('get');

支付宝服务端如何接收通知及验签?

支付宝服务端如何接收通知及验签?

以支付接口接收通知并处理为例。

Java 调用示例

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异步验签示例

php语言公钥与公钥证书验签方法相同。
$aop = new AopClient;
$aop->alipayrsaPublicKey = '请填写支付宝公钥/支付宝公钥证书路径';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");

C#调用示例

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 签发的证书?

当前开放平台支持根 CA 列表:

机构名称电子认证服务机构简称证书主题名称密钥算法证书生效时间(GMT)证书失效时间(GMT)
浙江蚂蚁小微金融服务集团股份有限公司蚂蚁CAAnt Financial Certification Authority R1RSA40962018/3/21 13:482038/2/28 13:48
中金金融认证中心有限公司CFCACFCA ACS CARSA40962015/9/23 3:242035/9/28 3:24
北京天威诚信电子商务服务有限公司天威诚信iTrusChina Class 3 Root CA – G3RSA20482013/4/18 9:362033/4/18 9:36
北京天威诚信电子商务服务有限公司天威诚信iTrusChina Class 2 Root CA – G3RSA20482013/4/18 9:392033/4/18 9:39
国家根ROOTCAROOTCASM22012/7/14 3:112042/7/7 3:11

使用公钥证书签名方式下,为什么请求参数中必须设置支付宝根证书 SN(alipay_root_cert_sn)?

使用公钥证书签名方式下,为什么请求参数中必须设置支付宝根证书 SN(alipay_root_cert_sn)?

对动态下载的支付宝公钥证执行的证书校验过程中需要使用到支付宝根证书。但公钥证书的变更有可能是由于根证书的变更导致,若根证书未更新,则会引起公钥证书更新失败,导致商家验签失败。为降低该风险,支付宝开放平台强制要求证书签名模式的商家同时携带当前使用的支付宝根证书 SN,开放平台可基于该根证书 SN 统计未及时更新支付宝根证书的商家。

支付宝使用公钥证书签名方式下,为什么开放平台网关的响应报文需要携带支付宝公钥证书 SN(alipay_cert_sn)?

支付宝使用公钥证书签名方式下,为什么开放平台网关的响应报文需要携带支付宝公钥证书 SN(alipay_cert_sn)?

开发者上传自己的应用公钥证书后,开放平台会为开发者应用自动签发支付宝公钥证书供开发者下载,用来对开放平台网关响应报文做验签。

但是支付宝公钥证书可能因证书到期或者变更 CA 签发机构等原因,可能会重新签发证书。在重新签发前,开放平台会在门户上提前提醒开发者支付宝应用公钥证书变更时间。

但为避免开发者因未能及时感知支付宝公钥证书变更而导致验签失败,开放平台提供了一种支付宝公钥证书无感知升级机制,具体流程如下:

  1. 开放平台网关在响应报文中会多返回支付宝公钥证书 SN。
  2. 开放平台网关提供根据 SN 下载对应支付宝公钥证书的 API 接口。
  3. 开发者在验签过程中,先比较本地使用的支付宝公钥证书 SN 与开放平台网关响应中 SN 是否一致。若不一致,可调用支付宝公钥证书下载接口下载对应 SN 的支付宝公钥证书。
  4. 对下载的支付宝公钥证书执行证书链校验,若校验通过,则用该证书验签。
    说明:基于该机制可实现支付宝公钥证书变更时开发者无感知,当前开放平台提供的 SDK 已基于该机制实现对应功能。若开发者未通过 SDK 接入,须自行实现该功能。

支付宝使用公钥证书签名方式下,为什么请求参数中必须应用公钥证书 SN(app_cert_sn)?

支付宝使用公钥证书签名方式下,为什么请求参数中必须应用公钥证书 SN(app_cert_sn)?

当前开放平台支持两种签名模式:公钥模式、公钥证书模式,开放平台网关会根据请求参数中是否存在应用公钥证书 SN(app_cert_sn)来判断当前请求是使用公钥模式还是公钥证书模式。

若开发者选择了公钥证书签名模式,上传了应用公钥证书,并使用该公钥对应的私钥加签,但请求参数中未携带应用公钥证书 SN。开放平台网关收到请求后,会认为该请求使用公钥签名模式,将导致网关验签失败。

另外,开发者也一定要确保自己用来加签的私钥、请求参数中应用公钥证书 SN 的值、上传到开放平台的应用公钥证书必须是匹配的,否则网关会验签失败。

使用公钥证书签名方式下, 请求参数中需要携带应用公钥证书 SN(app_cert_sn)、支付宝根证书 SN(alipay_root_cert_sn),这里的 SN 是指什么?

使用公钥证书签名方式下, 请求参数中需要携带应用公钥证书 SN(app_cert_sn)、支付宝根证书 SN(alipay_root_cert_sn),这里的 SN 是指什么?

这里的 SN 是指基于开放平台提供的计算规则,动态计算出来的公钥证书序列号,与 X.509 证书中内置的序列号(serialNumber)不同。具体的计算规则如下:

  1. 解析 X.509 证书文件,获取证书签发机构名称(name)以及证书内置序列号(serialNumber)。
  2. 将 name 与 serialNumber 拼接成字符串,再对该字符串做 MD5 计算。可查看 开放平台 SDK 源码中的 AlipaySignature.getCertSN 方法实现。
/** 
    * 获取证书序列号 
    * @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 网关接口签名处理上有何区别?

支付宝开放平台 OpenAPI 网关接口和支付宝 mapi 网关接口签名处理上有何区别?

开放平台接口网关地址是 open.alipay.com,mapi 网关地址是 mapi.alipay.com

签名专区描述的内容是针对 OpenAPI 网关接口的签名和验签方法。如果是 mapi 网关接口,签名规则有所区别,详情可查看 签名与验签

和支付宝交换公钥是什么意思?

和支付宝交换公钥是什么意思?

开发者私钥由开发者自行保管,把对应公钥提供给支付宝。相应的,支付宝提供自己的公钥给开发者,这称为交换公钥。

开发者使用开发者私钥对请求内容签名,支付宝收到请求后,会使用开发者公钥进行验签,验签通过证明信息来源可靠并且未篡改。

支付宝发送给开发者的数据中,支付宝也会使用自己的私钥进行签名。商家收到后,使用支付宝公钥验签,验签通过证明是支付宝发送的消息,并且未篡改。