第三步:使用应用私钥生成请求签名

本步骤向您介绍了开发者分别在选择普通公钥、公钥证书两种签名方式下,如何对请求内容进行签名,并对支付宝返回的内容进行验签。

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

以 JAVA 语言为例,签名和验签的过程大致为:

  1. 生成签名方(通常为商户)首先对参数放入一个字符串数组 signFields,把参数和值放入一个对象或 map 中,使用 JSONObject 把这个对象转化成 json 对象。然后构建签名原文,在构建签名原文时,我们需把参数按照字典(比如a,b,c)顺序排序,具体排序方法直接调用 JAVA 的 Arrays.sort 方法。 然后使用 RSA 的私钥对签名原文进行签名。
  2. 验签方(通常为开放平台的服务端):和生产签名方一样先生成签名原文,然后使用 RAS 的公钥生成签名方传入的签名,把签名原文对生成签名方传入的签名进行验证,验证结果为 true 则说明验证成功,否则未通过。

支付宝开放平台 SDK 封装了签名和验签过程,只需配置账号及密钥参数即可,强烈建议使用。

SDK 下载地址

说明: 文中代码部分以 JAVA 语言演示,其他语言请参考各自 SDK。

普通公钥方式

以下介绍了开发者如何把以下内容配置在代码中,对请求内容进行签名,并对支付宝返回的内容进行验签:

  • APPID
  • 应用私钥 (private key)
  • 支付宝公钥(alipay public key)

使用开放平台 SDK 接入

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

AlipayClient alipayClient = new DefaultAlipayClient(gateway,app_id,private_key,"json",charset,alipay_public_key,sign_type);

未使用开放平台 SDK

如果未使用开放平台SDK,需要自行实现签名过程,参考此处流程

公钥证书方式

以下介绍了开发者如何把以下内容配置在代码中,对请求内容进行签名,并对支付宝返回的内容进行验签:

  • APPID
  • 应用私钥 (private key)
  • 应用公钥证书(public key cert)
  • 支付宝公钥(alipay public key)
  • 支付宝公钥证书(alipay public key cert)
  • 支付宝根证书(alipay root cert)

使用开放平台 SDK 接入

如果你当前已经使用了服务端SDK,请注意:

  • 当前仅Java版SDK(4.4.2.ALL及以上版本)支持证书签名方式,其他语言SDK还未支持。
  • Java版SDK 4.4.2.ALL中并没有对APP支付场景添加证书支持,若业务使用到该场景,请下载4.4.5.ALL及以上版本的SDK。

开放平台 SDK 封装了签名实现,只需在创建 DefaultAlipayClient 对象时,设置请求网关 (gateway),应用 id (app_id),应用私钥 (private_key),应用公钥证书路径(app_cert_path 文件绝对路径),支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径),支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径),编码格式 (charset),签名类型 (sign_type)即可,报文请求时会自动进行签名。

//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(gateway);
certAlipayRequest.setAppId(app_id);
certAlipayRequest.setPrivateKey(privateKey);
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset(charset);
certAlipayRequest.setSignType(sign_type);
certAlipayRequest.setCertPath(app_cert_path);
certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path);
certAlipayRequest.setRootCertPath(alipay_root_cert_path);
DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

//发送API请求
AlipayRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryResponse response =  alipayClient.certificateExecute(request);

未使用开放平台 SDK

如果未使用开放平台SDK,需要自行实现签名过程,参考此处流程

onlineServer