1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 支付宝公钥证书支付示例

支付宝公钥证书支付示例

时间:2021-10-21 03:04:35

相关推荐

支付宝公钥证书支付示例

支付宝公钥证书支付示例

支付宝平台仅提供了普通公钥签名方式的电脑支付DEMO(下载),并未提供使用公钥证书的电脑支付DEMO,在阅读了老版的SDK之后,自己编写了这个DEMO。

效果图

支付测试页面

支付宝默认支付页面

前置支付生成的支付二维码,用于嵌在商品页面。

开发前的准备

创建支付应用

登录支付宝开放平台,创建新的应用。依次点击”创建应用“ --> ”网页&移动应用“–>”支付接入“,根据页面提示,补充完整所需信息。

添加支付能力

生成公钥证书

使用阿里支持提供的公钥证书在线生成工具生成公钥证书。

密钥长度推荐选择RAS2,密钥格式分为JAVA适用和非JAVA适用两种,本文中使用的PHP,所以选择了非JAVA适用。

点击”生成CSR“按钮,会弹出新的窗口用来填写创建证书文件所需的信息。点击”生成CSR并保存“按钮,会自动下载一个压缩包文件,这其中包含了三个文件:应用公钥应用私钥CSR文件

至此,离证书生成还有一步之遥。回到支付宝开放平台,并进入刚刚创建的支付应用,点击左侧的”应用信息“菜单,设置接口加签方式。

在这里选择公钥证书,并上传刚刚通过加密工具生成的CSR文件。

CSR证书验通过后,可以看到如下图所示的三个证书下载链接。

保存好这三份证书文件,以及通过密钥工具生成的应用公钥和私钥

验证密钥证书是否匹配

通常情况下是可以跳过这一步的。在测试阶段如果遇到类似错误提示密钥不匹配时,可以按照支付宝官方文档指导来验证密钥证书是否匹配。

下载服务器端SDK

PHP SDK(老版) 下载

编写DEMO

待上面所有准备工作完成后,我们就可以真刀实枪的开始编写测试DEMO了。

支付测试页面

我们需要先编写效果图中的支付测试页面,用于灵活录入支付所需的一些参数,如商户订单号、订单名称、商品描述、订单金额等。

<body text=#000000 bgColor="#ffffff" leftMargin=0 topMargin=4><header class="am-header"><h1>支付宝电脑网站支付(公钥证书)支付体验入口页</h1></header><div id="main"><form name=alipayment action=pagepay.php method=post target="_blank"><div id="body1" name="divcontent"><dl class="content"><dt>商户订单号 Out Trade No :</dt><dd><input type="text" id="WIDout_trade_no" name="WIDout_trade_no" /></dd><hr class="one_line"><dt>订单名称 Subject :</dt><dd><input type="text" id="WIDsubject" name="WIDsubject" value="Payment order for Learning Mall course"/></dd><hr class="one_line"><dt>付款金额 Amount:</dt><dd><input type="text" id="WIDtotal_amount" name="WIDtotal_amount" value="0.01"/></dd><hr class="one_line"><dt>商品描述 Body:</dt><dd><input type="text" id="WIDbody" name="WIDbody" value="Payment Testing"/></dd><hr class="one_line"><dt>支付网关 Payment Gateway:</dt><dd><input type="text" id="gateway" name="gateway" value="/gateway.do" /></dd><hr class="one_line"><dt>通知地址 Notify URL:</dt><dd><input type="text" id="notify_url" name="notify_url" value="" /></dd><hr class="one_line"><dt>回调地址 Return URL:</dt><dd><input type="text" id="return_url" name="return_url" value="" /></dd><hr class="one_line"><dt>支付宝公钥根路径 Root Cert Path:</dt><dd><input type="text" id="root_cert_path" name="root_cert_path" value="/Users/cmao/Sites/alipay-sdk-php-all-master/cert/alipayRootCert.crt" /></dd><hr class="one_line"><dt>支付宝公钥证书路径 Public Cert Path:</dt><dd><input type="text" id="alipay_cert_path" name="alipay_cert_path"value="/Users/cmao/Sites/alipay-sdk-php-all-master/cert/alipayCertPublicKey_RSA2.crt" /></dd><hr class="one_line"><dt>应用公钥证书路径 App Public Cert Path:</dt><dd><input type="text" id="app_cert_path" name="app_cert_path" value="/Users/cmao/Sites/alipay-sdk-php-all-master/cert/appCertPublicKey_002142621183.crt" /></dd><hr class="one_line"><dt>生成支付二维码 Generate QR Code:</dt><dd><input type="checkbox" id="qr_pay_mode" name="qr_pay_mode" value="4"/><span class="note-help">如果勾选,表示生成支付二维码,否则会跳转到支付宝默认的支付页面。</span></dd><hr class="one_line"><dt></dt><dd id="btn-dd"><span class="new-btn-login-sp"><button class="new-btn-login" type="submit" style="text-align:center;">付 款</button></span><span class="note-help">如果您点击“付款”按钮,即表示您同意该次的执行操作。</span></dd></dl></div></form></div></body><script language="javascript">function GetDateNow() {var vNow = new Date();var sNow = "";sNow += String(vNow.getFullYear());sNow += String(vNow.getMonth() + 1);sNow += String(vNow.getDate());sNow += String(vNow.getHours());sNow += String(vNow.getMinutes());sNow += String(vNow.getSeconds());sNow += String(vNow.getMilliseconds());document.getElementById("WIDout_trade_no").value = sNow;}GetDateNow();</script>

网页支付

整个代码分为三部分内容:

创建AopClient实例并初始化。创建API请求对象并设置request参数。发起请求并处理响应或异常。

<?phprequire_once '../aop/AopCertClient.php';require_once '../aop/request/AlipayTradePagePayRequest.php';//商户订单号,商户网站订单系统中唯一订单号,必填$out_trade_no = trim($_POST['WIDout_trade_no']);//订单名称,必填$subject = trim($_POST['WIDsubject']);//付款金额,必填$total_amount = trim($_POST['WIDtotal_amount']);//商品描述,可空$body = trim($_POST['WIDbody']);//支付宝根证书路径$rootCertPath = trim($_POST['root_cert_path']);//支付宝公钥证书路径$alipayCertPath = trim($_POST['alipay_cert_path']);//应用证书路径$appCertPath = trim($_POST['app_cert_path']);// 阿里支付网关$gateway = $_POST['gateway'] ? trim($_POST['gateway']): '/gateway.do';$aop = new AopCertClient ();// 支付应用APP ID$aop->appId = '002142621183';// 阿里支付网关$aop->gatewayUrl = $gateway;//返回数据格式$aop->format='json';//签名类型$aop->signType='RSA2';//是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内$aop->isCheckAlipayPublicCert = true;//调用getCertSN获取证书序列号$aop->appCertSN = $aop->getCertSN($appCertPath);//调用getRootCertSN获取支付宝根证书序列号$aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);//调用getPublicKey从支付宝公钥证书中提取公钥$aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);//应用私钥$aop->rsaPrivateKey = 'YOUR PRIVATE KEY';//实例化具体API对应的request类$request = new AlipayTradePagePayRequest();//通知地址$request->setNotifyUrl(trim($_POST['notify_url']));//回调地址$request->setReturnUrl(trim($_POST['return_url']));//设置业务参数$request->setBizContent("{" .($_POST['qr_pay_mode'] ? "\"qr_pay_mode\":\"4\",\"qrcode_width\":\"100\"," : "") ."\"out_trade_no\":\"" . $out_trade_no ."\"," ."\"total_amount\":\"" . $total_amount . "\"," ."\"subject\":\"" . $subject . "\"," ."\"body\":\"" . $body . "\","."\"product_code\": \"FAST_INSTANT_TRADE_PAY\""."}");//生成签名$aop->generateSign($request);echo $aop->pageExecute($request);

完成支付测试页面和网页支付的代码后,如果你的证书、私钥都正确的话,应该是可以跳转到支付宝默认支付页面进行扫码支付了(如下图)。

这种PC扫码支付的方式为跳转支付,阿里开放平台同时还提供了前置支付。

前置支付

前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体分为以下几种:

0:订单码-简约前置模式,对应 iframe 宽度不能小于600px,高度不能小于300px;1:订单码-前置模式,对应iframe 宽度不能小于 300px,高度不能小于600px;3:订单码-迷你前置模式,对应 iframe 宽度不能小于 75px,高度不能小于75px;4:订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小。

//设置业务参数$request->setBizContent("{" .($_POST['qr_pay_mode'] ? "\"qr_pay_mode\":\"4\",\"qrcode_width\":\"100\"," : "") ."\"out_trade_no\":\"" . $out_trade_no ."\"," ."\"total_amount\":\"" . $total_amount . "\"," ."\"subject\":\"" . $subject . "\"," ."\"body\":\"" . $body . "\","."\"product_code\": \"FAST_INSTANT_TRADE_PAY\""."}");

这里的qr_pay_mode参数指定了支付方式,更多电脑网页支付参数看这里。

以下是qr_pay_mode参数设置为4的支付二维码截图,开发者可以将这个二维码嵌到商品页面中。

遇到的问题

alipay_root_cert_sn为空

在确保证书路径配置正确的情况下,这个问题极大可能是因为www-data对存放证书的目录没有正确访问权限造成的。通过修改目录访问权限可解决此问题。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。