支付宝官方教程: 第三步:使用应用私钥生成请求签名
【使用一门APP开发平台的用户可以不用查看这一步】
本步骤向您介绍了开发者分别在选择普通公钥、公钥证书两种签名方式下,如何对请求内容进行签名,并对支付宝返回的内容进行验签。 简而言之,签名的过程即生成签名方(通常为支付宝客户端)将传送的消息用私钥加密的过程;验签则是指验签方(通常为开放平台的服务端)使用公钥对消息进行验证的过程。 以 JAVA 语言为例,签名和验签的过程大致为: - 生成签名方(通常为商户)首先对参数放入一个字符串数组 signFields,把参数和值放入一个对象或 map 中,使用 JSONObject 把这个对象转化成 json 对象。然后构建签名原文,在构建签名原文时,我们需把参数按照字典(比如a,b,c)顺序排序,具体排序方法直接调用 JAVA 的 Arrays.sort 方法。 然后使用 RSA 的私钥对签名原文进行签名。
- 验签方(通常为开放平台的服务端):和生产签名方一样先生成签名原文,然后使用 RAS 的公钥生成签名方传入的签名,把签名原文对生成签名方传入的签名进行验证,验证结果为 true 则说明验证成功,否则未通过。
支付宝开放平台 SDK 封装了签名和验签过程,只需配置账号及密钥参数即可,强烈建议使用。 说明: 文中代码部分以 JAVA 语言演示,其他语言请参考各自 SDK。 普通公钥方式以下介绍了开发者如何把以下内容配置在代码中,对请求内容进行签名,并对支付宝返回的内容进行验签: - APPID
- 应用私钥 (private key)
- 支付宝公钥(alipay public key)
使用开放平台 SDK 接入开放平台 SDK 封装了签名实现,只需在创建 DefaultAlipayClient 对象时,设置请求网关 (gateway),应用 id (app_id),应用私钥 (private_key),编码格式 (charset),支付宝公钥 (alipay_public_key),签名类型 (sign_type)即可,报文请求时会自动进行签名。 [backcolor=rgba(228, 228, 228, 0.75)]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,请注意: 开放平台 SDK 封装了签名实现,只需在创建 DefaultAlipayClient 对象时,设置请求网关 (gateway),应用 id (app_id),应用私钥 (private_key),应用公钥证书路径(app_cert_path 文件绝对路径),支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径),支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径),编码格式 (charset),签名类型 (sign_type)即可,报文请求时会自动进行签名。 [backcolor=rgba(228, 228, 228, 0.75)]//构造clientCertAlipayRequest 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,需要自行实现签名过程,参考此处流程。
|