背景
目前支付宝推出了新的签名方式,除了使用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);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。