支付宝支付
<h1>概览</h1>
<h2>名词解释</h2>
<blockquote>
<p>沙箱环境</p>
</blockquote>
<pre><code>蚂蚁沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑,
在开发者应用上线审核前,开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调通工作,从而帮助开发者在应用上线审核完成后,能更快速、更顺利的进行线上调试和验收工作。</code></pre>
<p>请参考 <a href="https://opendocs.alipay.com/open/200/105311/" title="沙箱环境使用说明">沙箱环境使用说明</a>。</p>
<blockquote>
<p>签名</p>
</blockquote>
<p>即生成签名方(通常为支付宝客户端)将传送的消息用私钥加密的过程</p>
<blockquote>
<p>验签</p>
</blockquote>
<p>指验签方(通常为开放平台的服务端)使用公钥对消息进行验证的过程。</p>
<blockquote>
<p>AES</p>
</blockquote>
<p>高级加密标准(Advanced Encryption Standard,缩写:AES),是目前对称密钥加密中比较通用的一种加密方式。速度快,安全级别高,支持128、192、256、512位密钥的加密。</p>
<p>请参考 <a href="https://opendocs.alipay.com/open/common/104567" title="AES 加密说明">AES 加密说明</a>。</p>
<blockquote>
<p>APPID</p>
</blockquote>
<p>支付宝分配给开发者的应用 ID,是应用的唯一标示,只有应用创建后才可以获取,详见 <a href="https://opendocs.alipay.com/open/200/105310#%E6%9F%A5%E7%9C%8B%20APPID" title="查看 APPID">查看 APPID</a>。</p>
<blockquote>
<p>公钥证书</p>
</blockquote>
<p>支付宝开放平台提供对 X.509 格式证书的支持,开发者上传证书后,后续在和支付宝开放平台交互过程中支付宝会尝试使用该证书进行报文验签;资金类接口必须使用公钥证书模式加签。详见 <a href="https://opendocs.alipay.com/open/291/105971#%E5%85%AC%E9%92%A5%E8%AF%81%E4%B9%A6%E6%96%B9%E5%BC%8F" title="生成公钥证书说明">生成公钥证书说明</a>。</p>
<blockquote>
<p>ISV</p>
</blockquote>
<p>ISV(Independent Software Vendors) ,意为“独立软件开发商”或“系统服务商”。在小程序中,ISV 通常扮演代理商户开发或运营生活号,小程序和 网页&移动应用 的角色。</p>
<blockquote>
<p>异步通知</p>
</blockquote>
<pre><code>商家或系统服务商(ISV)在接入支付和部分其他功能(如转账和红包功能)时,当商户完成请求部分 API 后,支付宝会将该操作的变更信息(如订单信息的变更),沿着商户在接口请求参数中所传入的异步通知地址 notify_url,通过 POST 请求的形 式将结果作为参数通知到商户系统。</code></pre>
<p>不同的产品会有不同的异步通知,详情可参见具体接入文档。以当面付能力为例,参考<a href="https://opendocs.alipay.com/open/194/103296" title="当面付的异步通知">当面付的异步通知</a>;您还可以参考<a href="https://opensupport.alipay.com/support/helpcenter/193/201602472200?ant_source=zsearch" title="更多异步通知的说明">更多异步通知的说明</a>。</p>
<blockquote>
<p>应用网关</p>
</blockquote>
<p>即 notify_url,用于接收支付宝异步通知,例如口碑开店中,需要配置此网关来接收开发者门店被动通知。</p>
<blockquote>
<p>支付宝蜻蜓</p>
</blockquote>
<pre><code>支付宝盒(蜻蜓)是支付宝推出的全新的刷脸支付产品,可在医院、超市、餐厅、品牌零售店、便利店等多个场景使用,只要将蜻蜓接入人工收银机,并放置在收银台上,顾客只要对准摄像头就能快速完成刷脸支付,无须再掏出手机“扫一扫”。
蜻蜓采用全新3D结构光摄像头,立体扫描+AI算法,轻松实现99.99%金融级安全识别度;超大广角采集人脸,无论逆光侧光,同样清晰;识别速度快如闪电,人脸1秒识别,条码与二维码更不在话下。
蜻蜓超薄机身,小巧底座,即插即用,只要有USB接口,便无需改造商家ERP系统;扫脸扫商品,一屏全搞定,CRM运营一机掌握;软硬件结合开展会员身份运营,前景更广阔。
蜻蜓不仅省去了用户掏出手机扫描二维码的步骤,甚至用户前往经常出没的场景如便利店、超市,系统均可通过智能算法支持消费者直接刷脸支付,解决了忘带手机、手机没电等窘迫环境下的支付问题。</code></pre>
<p>请参考 <a href="https://opendocs.alipay.com/open/300/sq053e?mode=rt" title="蜻蜓设备介绍">蜻蜓设备介绍</a>。</p>
<blockquote>
<p>小额免密支付</p>
</blockquote>
<p>小额支付无须密码和消费者签名即可完成,每笔小于等于 1000 元的订单可以“免密支付”。</p>
<blockquote>
<p>收银台</p>
</blockquote>
<p>收银台是 IoT 小程序集成刷脸支付和扫码支付功能的主要 API,要求 蜻蜓应用 2.8.1 及以上版本。</p>
<p>请参考 <a href="https://opendocs.alipay.com/mini/multi-platform/ltz60x" title="my.ix.startApp(刷脸支付/扫码支付)">my.ix.startApp(刷脸支付/扫码支付)</a>。</p>
<blockquote>
<p>收银台操作指令</p>
</blockquote>
<p>收银台操作指令是指控制在收银台界面上刷脸、扫码等功能开关的指令。</p>
<p>请参考 <a href="https://opendocs.alipay.com/mini/multi-platform/ltz60x#%E6%94%B6%E9%93%B6%E5%8F%B0%E6%93%8D%E4%BD%9C%E6%8C%87%E4%BB%A4" title="收银台操作指令">收银台操作指令</a>。</p>
<blockquote>
<p>刷脸核身</p>
</blockquote>
<p>刷脸核身是指通过刷脸获取用户的支付宝 user_id 来核实用户身份的功能。</p>
<p>刷脸核身为 IoT 小程序容器 10.1.60.20-18 版本开始提供支持,且要求蜻蜓应用 2.8.1 及以上版本。</p>
<p>请参考 <a href="https://opendocs.alipay.com/mini/multi-platform/is88c6" title="my.ix.faceVerify">my.ix.faceVerify</a>。</p>
<blockquote>
<p>刷脸认证</p>
</blockquote>
<p>通过设备扫描使用者面部信息进行身份验证,目前该功能已升级为支付宝身份验证。</p>
<p>请参考 <a href="https://opendocs.alipay.com/open/20181012100420932508/intro" title="支付宝身份验证">支付宝身份验证</a>。</p>
<blockquote>
<p>SDK</p>
</blockquote>
<p>软件开发工具包(Software Development Kit),是为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合;开放平台为广大开发者提供了标准的封装好的 SDK,详见 <a href="https://opendocs.alipay.com/open/54/103419" title="SDK&Demo 文档">SDK&Demo 文档</a>。</p>
<h2>nisbos-pay-alipay支付功能介绍</h2>
<ul>
<li>
<p>nisbos-pay-alipay主要以提供后台接口的方式,仅仅作为工具使用简单快速完成支付模块的开发,轻量级支付模块集成支付对接支付整合,可轻松嵌入到任何系统里;</p>
</li>
<li>封装了支付宝支付常用调用参数及配置,目前支持的支付宝渠道:电脑网站支付、手机网站支付、APP支付、当面付(二维码、条形码支付)。</li>
</ul>
<h2>准入条件及前期准备</h2>
<h3>1、平台入驻</h3>
<h4>入驻准备</h4>
<p>开发者在入驻前,需要注册企业支付宝账号并完成实名认证。</p>
<ul>
<li><a href="https://memberprod.alipay.com/account/reg/index.htm" title="注册支付宝账号">注册支付宝账号</a></li>
<li><a href="https://cshall.alipay.com/enterprise/knowledgeDetail.htm?knowledgeId=201602062427" title="注册公司账号">注册公司账号</a></li>
</ul>
<h4>入驻支付宝平台</h4>
<p>整体分四个流程:登录开放平台、选择服务范围、填写信息、入驻成功
详情 <a href="https://opendocs.alipay.com/open/00hqwq" title="请参考支付宝相关平台入驻文档">请参考支付宝相关平台入驻文档</a></p>
<h3>2、创建应用</h3>
<p>以网页&移动应用为例,应用创建及后续开发流程如下图所示:
<img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/9eacb13561bcfd66a625e4e87db8e582?showdoc=.jpg" alt="" /></p>
<p>应用的创建 <a href="https://opendocs.alipay.com/open/200/105310" title="请参考支付宝相关平台创建应用文档">请参考支付宝相关平台创建应用文档</a>。</p>
<h3>3、配置密钥</h3>
<h4>下载工具并生成密钥,并配置应用的接口加签方式</h4>
<p>详细操作请参考 <a href="https://opendocs.alipay.com/open/291/105971" title="支付宝开放平台开发助手提供的文档">支付宝开放平台开发助手提供的文档</a>。</p>
<blockquote>
<p>注:1、此处保存好私钥;
2、设置完加签方式,此处可以获取到支付宝公钥;
以上两点在代码调用配置中需要用到</p>
</blockquote>
<h3>4、应用上线</h3>
<p>上线的应用才可进行签约及生产环境的接口调用。
详细操作 <a href="https://opendocs.alipay.com/open/200/golive" title="请参考支付宝上线应用文档">请参考支付宝上线应用文档</a>。</p>
<h3>5、签约功能</h3>
<p>应用上线后,需要签约才能调用到对应的接口服务</p>
<p>详细操作 <a href="https://opendocs.alipay.com/open/200/105314" title="请参考支付宝签约功能文档">请参考支付宝签约功能文档</a>。</p>
<h2>几种支付介绍</h2>
<p>1、手机网站支付
<a href="https://opendocs.alipay.com/open/203/105288" title="产品介绍">产品介绍</a></p>
<p>2、电脑网站支付
<a href="https://opendocs.alipay.com/open/270/105898" title="产品介绍">产品介绍</a></p>
<p>3、APP支付
<a href="https://opendocs.alipay.com/open/204/105051" title="产品介绍">产品介绍</a></p>
<p>4、当面付
<a href="https://opendocs.alipay.com/open/194/105072" title="产品介绍">产品介绍</a></p>
<h1>场景预览</h1>
<h1>快速入门</h1>
<h2>支付使用</h2>
<h3>公共接口</h3>
<h4>1、验签</h4>
<ul>
<li>使用示例
<pre><code class="language-java">Map<String, String> params = AliPayUtil.getParameterMap(request);//获取支付宝回调回来的参数信息
boolean verifyResult = alipayService.rsaCheckV1(params);
if (verifyResult) {
// 验签成功之后的业务处理(如订单状态判断、变更等)
} else {
// 验签失败处理
}</code></pre></li>
<li>参数说明</li>
</ul>
<p><strong> 关键入参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">params</td>
<td style="text-align: left;">Map<String, String></td>
<td style="text-align: left;">支付宝回调回来的request参数转为map</td>
</tr>
</tbody>
</table>
<p><strong> 关键出参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">bl</td>
<td style="text-align: left;">Boolean</td>
<td style="text-align: left;">是否验签成功(true/false)</td>
</tr>
</tbody>
</table>
<h4>2、交易查询接口:alipay.trade.query</h4>
<ul>
<li>使用示例</li>
</ul>
<pre><code class="language-java">Map<String, Object> map = alipayService.tradeQuery(out_trade_no, tradeNo, paramMap);</code></pre>
<p><strong> 关键入参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">out_trade_no</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">商户订单号</td>
</tr>
<tr>
<td style="text-align: left;">tradeNo</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">支付宝交易号(与商户订单号二选一)</td>
</tr>
<tr>
<td style="text-align: left;">paramMap</td>
<td style="text-align: left;">Map<String, Object></td>
<td style="text-align: left;">其他非必填参数,key为支付宝接口提供出来的key一致,参考:<a href="https://opendocs.alipay.com/apis/api_1/alipay.trade.query">https://opendocs.alipay.com/apis/api_1/alipay.trade.query</a></td>
</tr>
</tbody>
</table>
<p><strong> 关键出参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">params</td>
<td style="text-align: left;">Map<String, Object></td>
<td style="text-align: left;">调用支付宝接口返回的参数信息</td>
</tr>
</tbody>
</table>
<h4>3、退款</h4>
<ul>
<li>使用示例</li>
</ul>
<pre><code class="language-java">Map<String, Object> map = alipayService.tradeRefund(outTradeNo, tradeNo, refundAmount, refundReason, paramMap);</code></pre>
<p><strong> 关键入参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">outTradeNo</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">商户订单号</td>
</tr>
<tr>
<td style="text-align: left;">tradeNo</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">支付宝交易号(与商户订单号二选一)</td>
</tr>
<tr>
<td style="text-align: left;">refundAmount</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">退款金额(必填)</td>
</tr>
<tr>
<td style="text-align: left;">refundReason</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">退款原因(选填)</td>
</tr>
<tr>
<td style="text-align: left;">paramMap</td>
<td style="text-align: left;">Map<String, Object></td>
<td style="text-align: left;">其他非必填参数,key为支付宝接口提供出来的key一致,参考:<a href="https://opendocs.alipay.com/apis/api_1/alipay.trade.query">https://opendocs.alipay.com/apis/api_1/alipay.trade.query</a></td>
</tr>
</tbody>
</table>
<p><strong> 关键出参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">params</td>
<td style="text-align: left;">Map<String, Object></td>
<td style="text-align: left;">调用支付宝接口返回的参数信息</td>
</tr>
</tbody>
</table>
<blockquote>
<p>其他接口调用请参考alipaytest项目</p>
</blockquote>
<h3>不同客户端支付宝支付调用</h3>
<ul>
<li>
<p>手机网站支付、pc网站支付、二维码支付、android端加签可通过两种方式调用支付接口:1、注解式(适用场景为:业务处理之后在调用支付接口,如果业务场景不一致通过接口方式调用) 2、接口调用</p>
</li>
<li>条码支付:接口调用</li>
</ul>
<h4>注解式调用</h4>
<p><img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/a10d6199ed2be4d378d8447a94ec9131?showdoc=.jpg" alt="" /></p>
<pre><code class="language-java">@EnableAlipay(payType = PayTypeEnums.MOBILEPAY, outTradeNo = "out_trade_no",
subject="subject", totalAmount="total_amount", body= "body")</code></pre>
<p><strong> EnableAlipay参数说明 </strong></p>
<pre><code>1、payType-支付类型;
2、request参数传参定义的key(根据key获取与业务匹配的对应值):outTradeNo-订单号对应的key,subject-订单名称对应key,totalAmount-付款金额对应key,body-商品描述对应key</code></pre>
<blockquote>
<p>具体使用参考alipaytest示例项目中的demo</p>
</blockquote>
<h4>接口调用</h4>
<pre><code class="language-java">responseStr = alipayService.notifyPay(PayTypeEnums.FACEPAY_BARCODE.getKey(), out_trade_no, subject,
total_amount, body, map, response);
JSONObject json = JSONObject.parseObject(responseStr);
System.out.println(json.getJSONObject("alipay_trade_pay_response").get("code"));
String responseCode = (String) json.getJSONObject("alipay_trade_pay_response").get("code");
if (AlipayConstant.TRADE_SUCCESS_CODE.equals(responseCode)) {
// 调用成功之后的业务处理
} else {
// 失败提示
}</code></pre>
<p><strong> 关键入参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">payType</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">支付类型(PayTypeEnums中获取)</td>
</tr>
<tr>
<td style="text-align: left;">out_trade_no</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">商户订单号-必传</td>
</tr>
<tr>
<td style="text-align: left;">subject</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">订单名称-必传</td>
</tr>
<tr>
<td style="text-align: left;">total_amount</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">付款金额-必传</td>
</tr>
<tr>
<td style="text-align: left;">body</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">商品描述-可空</td>
</tr>
<tr>
<td style="text-align: left;">map</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">其他非必填参数(条码支付必传auth_code),key为支付宝接口提供出来的key一致,参考各个接口的支付宝api文档(可空)</td>
</tr>
<tr>
<td style="text-align: left;">response</td>
<td style="text-align: left;">HttpServletResponse</td>
<td style="text-align: left;">响应的response对 象</td>
</tr>
</tbody>
</table>
<p><strong> 关键出参:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名称</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">参数说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">responseStr</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">支付宝返回的JSONObject的字符串对象(手机、pc网站支付返回的是调用支付页面,不需要处理返回参数)</td>
</tr>
</tbody>
</table>
<h2>Q&A</h2>
<blockquote>
<p><strong> 支付调用过程中出现:订单信息无法识别,建议联系卖家:</strong></p>
</blockquote>
<p><img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/4dc70d1e1c225c7edea05883b4c5c4e2?showdoc=.jpg" alt="" />
原因:</p>
<ul>
<li>检查传参的编码格式不对,转换编码格式</li>
<li>商户没有按照接口文档传入指定格式的参数或者参数值传错,或者提交请求的数据无法被支付宝解析等原因导致</li>
</ul>
<blockquote>
<p><strong> 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查对应功能是否已经添加 </strong></p>
</blockquote>
<p>排查:
此报错的含义就是没有对应接口权限;请按照下列进行排查:</p>
<ul>
<li>
<p>1、检查支付宝网关是否正确
正式环境(OpenAPI网关):<a href="https://openapi.alipay.com/gateway.do">https://openapi.alipay.com/gateway.do</a>
沙箱环境(沙箱网关):<a href="https://openapi.alipaydev.com/gateway.do">https://openapi.alipaydev.com/gateway.do</a>
注:沙箱环境不支持所有接口测试,建议检查该产品是否支持沙箱测试,详见<a href="https://openhome.alipay.com/platform/appDaily.htm?tab=info">沙箱应用支持产品列表</a>。</p>
</li>
<li>
<p>2、检查账户是否签约产品权限
配置的账户是否有当前接口权限或代理的商户是否有当前接口权限,详见<a href="https://opensupport.alipay.com/support/knowledge/01/201602472198">如何确认是否完成签约</a>的检查账户中是否存在产品权限。
若没有请先完成签约,签约相关问题请到<a href="https://b.alipay.com/index2.htm">商家服务中心</a>在线咨询或拨打商家服务热线95188咨询,服务时间为:8:00-24:00。3、检查是否添加产品功能
是否在对应APPID下面添加应用功能,详见<a href="https://opensupport.alipay.com/support/knowledge/01/201602472198">如何确认是否完成签约</a>的检查应用中是否有接口权限。</p>
</li>
<li>
<p>3、检查应用是否上线
检查此应用ID是否已经上线,目前必须上线的应用才可以在正式环境调用接口。</p>
</li>
<li>4、第三方应用授权调用接口
若是ISV模式调用接口,检查授权令牌(app_auth_token)是否有对应的接口权限。
具体流程详见<a href="https://opensupport.alipay.com/support/knowledge/01/201602475472">ISV权限不足处理流程</a>。</li>
</ul>