开发者社区> 问答> 正文

#支付宝 RSA2和公钥证书签名验签的区别?

RSA2和公钥证书签名验签的区别?

展开
收起
保持可爱mmm 2020-05-05 16:49:00 2371 0
1 条回答
写回答
取消 提交回答
  • 背景

    目前支付宝推出了新的签名方式,除了使用RSA2普通公钥方式签名外,新增了公钥证书的签名方式,但是2者使用有什么不同呢?

    从公钥设置方式、sdk版本、sdk签名方式、sdk验签方式 一、接口加签方式

    根据应用中“接口加签方式”的“选择加签模式”,进行对应的模式签名。 1、RSA2普通公钥

    RSA2普通公钥签名需选择“选择加签模式”的“公钥”模式。

    普通公钥设置密钥方式详见【如何设置普通公钥】。

    2、公钥证书

    公钥证书签名需选择“选择加签模式”的“公钥证书”模式。

    公钥证书置密钥方式详见【如何设置公钥证书】。

    200325-1.png

    二、sdk版本

    目前新版的sdk都是支持RSA2普通公钥和公钥证书,但是低版本的sdk是只支持RSA2普通公钥的签名方式。

    证书签名SDK版本Java版SDK支持4.4.5.ALL及以上版本。

    证书签名SDK版本php版SDK支持alipay-sdk-PHP-4.1.0及以上版本;

    证书签名SDK版本.Net版SDK支持alipay-sdk-NET-4.0.0及以上版本;

    注:Python、NodeJS还未出证书签名sdk版本,待后续更新。

    三、签名验签方式

    不同语言的RSA2普通公钥和公钥证书签名验签方法不同。

    RSA2普通公钥签名验签方法详见【如何使用RSA2签名验签】。

    公钥证书验签签名验签方法详见【如何使用证书签名验签】。

    四、sdk封装签名方式

    由于第三步的签名验签方法未讲述sdk封装方法类请求的方式,RSA2普通公钥和公钥证书签名方式主要在于初始化方式不同,但是请求参数设置是相同的。

    注意:实例化具体API对应的request类和response类,类名称和接口名称对应。

    如接口名称:alipay.trade.pay,request类:AlipayTradePayRequest,response类:AlipayTradePayResponse

    如接口名称:alipay.trade.app.pay,request类:AlipayTradeAppPayRequest,response类:AlipayTradeAppPayResponse 1、Java语言 (1)RSA2普通公钥签名

    请求示例

    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.pay AlipayTradePayRequest request = new AlipayTradePayRequest(); request.setBizContent("{"out_trade_no":"2018092031012228432"," + ""total_amount":"0.01"," + ""subject":"subject"}"); request.setNotifyUrl("商户外网可以访问的异步地址"); AlipayTradePayResponse response = alipayClient.execute(request); if(response.isSuccess()){ System.out.println("调用成功"); } else { System.out.println("调用失败"); } System.out.println(response.getBody());

    (2)公钥证书签名

    请求示例

    //构造client CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); //设置网关地址 certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); //设置应用Id certAlipayRequest.setAppId(app_id); //设置应用私钥 certAlipayRequest.setPrivateKey(privateKey); //设置请求格式,固定值json 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); //构造client AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.pay AlipayTradePayRequest request = new AlipayTradePayRequest(); request.setBizContent("{"out_trade_no":"2018092031012228432"," + ""total_amount":"0.01"," + ""subject":"subject"}"); request.setNotifyUrl("商户外网可以访问的异步地址"); AlipayTradePayResponse response = alipayClient.certificateExecute(request); if(response.isSuccess()){ System.out.println("调用成功"); } else { System.out.println("调用失败"); } System.out.println(response.getBody());

    (3)请求方法

    //(1)服务端请求返回,RSA2密钥和公钥证书请求方式不同,如当面付 //RSA2密钥请求 response = alipayClient.execute(request); //公钥证书请求请求 response = alipayClient.certificateExecute(request);

    //(2)网站类适用接口请求,RSA2密钥和公钥证书请求方式相同,如手机网站支付、电脑网站支付 response = alipayClient.pageExecute(request);

    //(3)客户端类适用接口请求请求,RSA2密钥和公钥证书请求方式相同,如app支付 response = alipayClient.sdkExecute(request);

    2、php语言 (1)普通公钥签名

    请求示例

    $aop = new AopClient; $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = "app_id"; $aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串'; $aop->format = "json"; $aop->charset = "UTF-8"; $aop->signType = "RSA2"; $aop->alipayrsaPublicKey = '请填写支付宝公钥,一行字符串'; //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay $request = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数 $request->setBizContent("{"body":"我是测试数据"," . ""subject": "App支付测试"," . ""out_trade_no": "20170125test01"," . ""timeout_express": "30m"," . ""total_amount": "0.01"," . ""product_code":"QUICK_MSECURITY_PAY"" . "}"); $request->setNotifyUrl("商户外网可以访问的异步地址"); //这里和普通的接口调用不同,使用的是sdkExecute $response = $aop->sdkExecute($request); //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题 echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。

    (2)公钥证书签名

    $aop = new AopCertClient; $appCertPath = "应用证书路径(要确保证书文件可读),例如:/home/admin/cert/appCertPublicKey.crt"; $alipayCertPath = "支付宝公钥证书路径(要确保证书文件可读),例如:/home/admin/cert/alipayCertPublicKey_RSA2.crt"; $rootCertPath = "支付宝根证书路径(要确保证书文件可读),例如:/home/admin/cert/alipayRootCert.crt";

    $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = "app_id"; $aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串' ; $aop->format = "json"; $aop->charset= "GBK"; $aop->signType= "RSA2";

    //调用getPublicKey从支付宝公钥证书中提取公钥 $aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath); //是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内 $aop->isCheckAlipayPublicCert = true; //调用getCertSN获取证书序列号 $aop->appCertSN = $aop->getCertSN($appCertPath); //调用getRootCertSN获取支付宝根证书序列号 $aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);

    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay $request = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数 $request->setBizContent("{"body":"我是测试数据"," . ""subject": "App支付测试"," . ""out_trade_no": "20170125test01"," . ""timeout_express": "30m"," . ""total_amount": "0.01"," . ""product_code":"QUICK_MSECURITY_PAY"" . "}"); $request->setNotifyUrl("商户外网可以访问的异步地址"); //这里和普通的接口调用不同,使用的是sdkExecute $response = $aop->sdkExecute($request); //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题 echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。

    (3)请求方法

    //RSA2普通公钥和公钥证书请求方法一致。 //服务端请求返回,如当面付 $response = $aop->execute($request); //网站类适用接口请求返回,如手机网站支付、电脑网站支付 $response = $aop->pageExecute($request); //客户类适用接口请求返回,如app支付 $response = $aop->sdkExecute($request);

    3、.net语言 (1)RSA2普通公钥签名

    请求示例

    IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", APPID, APP_PRIVATE_KEY, "json", "1.0", "RSA2", ALIPAY_PUBLIC_KEY, CHARSET, false); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.pay AlipayTradePayRequest request = new AlipayTradePayRequest(); request.BizContent="{"out_trade_no":"2018092031012228432"," + ""total_amount":"0.01"," + ""subject":"subject"}"; request.setNotifyUrl("商户外网可以访问的异步地址"); AlipayTradePayResponse response = client.Execute(request); Console.WriteLine(response.Body);

    (2)公钥证书签名

    请求示例

    //设置证书相关参数 CertParams certParams = new CertParams { AlipayPublicCertPath = "支付宝公钥证书路径", AppCertPath = "商户应用证书路径", RootCertPath = "支付宝根证书路径" }; IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", APPID, APP_PRIVATE_KEY, "json", "1.0", "RSA2", "utf-8", false, certParams);

    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.pay AlipayTradePayRequest request = new AlipayTradePayRequest(); request.BizContent="{"out_trade_no":"2018092031012228432"," + ""total_amount":"0.01"," + ""subject":"subject"}"; request.setNotifyUrl("商户外网可以访问的异步地址"); AlipayTradePayResponse response = client.CertificateExecute(request); Console.WriteLine(response.Body);

    (3)请求方法

    //(1)服务端请求,RSA2密钥和公钥证书请求方式相同,如当面付 //RSA2密钥请求 response = client.Execute(request); //公钥证书请求请求 response = client.CertificateExecute(request);

    //(2)网站类适用接口请求,RSA2密钥和公钥证书请求方式相同如手机网站支付、电脑网站支付 response = client.pageExecute(request);

    //(3)客户端类适用接口请求,RSA2密钥和公钥证书请求方式相同如app支付 response = client.sdkExecute(request);

    2020-05-05 16:49:11
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多