支付宝接入的那点小事儿

曾就职于第三方支付公司,现负责短视频、动漫 IP 变现业务。擅长聚合支付、小程序、小游戏开发。 GitHub:https://github.com/javen205 Gitee:https://gitee.com/javen205

本场 Chat 从零开始,带着大家来实现如下功能点: 电脑网站支付 手机网站支付 APP 支付 条码支付(刷卡支付) 声波支付 扫码支付 交易查询接口 交易撤销接口 交易退款接口 退款查询接口 单笔转账到支付宝账户接口 查询转账订单接口 查询对账单下载地址接口 交易结算接口 交易保障接口 当前内容版权归码字科技所有并授权显示,盗版必究。

文章正文

前言

本次的 Chat 算是一个新手入门指南,但在内容不会局限于入门导引,适应准备对接支付宝以及正在对接支付宝遇到问题的开发者。

本次 Chat 中涉及到的图片均来自于网络,截图均为 macOS 和 Chrome 以及手机上的截图,如有侵权请联系删除。

希望这次 Chat ,能够帮助还没有接触过支付宝对接的开发者或者公司更快更方便的了解支付宝的支付方式(支付场景)以及对接流程。帮助已在对接但途中遇到棘手问题的开发者或者公司提供一些参考的解决方案。

如果你有什么问题,都可以在文章底部的评论框中留言,参与讨论。

支付宝CSDN博客文章列表

什么是支付宝

支付宝(中国)网络技术有限公司是一家国内领先的独立第三方支付平台,是阿里巴巴集团的关联公司。支付宝致力于为中国电子商务提供“简单、安全、快速”的在线支付解决方案。

官方首页标语: 你是中心,不需要别人给予,你想要的触手可及

提供的解决方案

支付宝公司从2004年建立开始到目前为止到底提供了那些解决方案呢? 在支付宝开发平台的行业解决方案栏目中不难发现涉及到了以下几个领域。

  1. 商业消费
  2. 交通出行
  3. 政务名声
  4. 教育医疗

本次 Chat 主要带着大家来聊聊支付宝为我们提供了哪些支付方式来解决以上领域的无现金支付以及如何快速接入这些支付方式。

以上问题的答案就在开发平台的文档中。好了,说了这么多的费话现在开始我们的探索。

开发文档

上图左边栏目中就是我们本次Chat要聊的主要内容了。

  1. 开始开发
  2. 支付能力
  3. 资金能力

做任何事情之前要有所准备,才会事半功倍。竟然是使用别人的平台当然先得在平台注册账号。

注册开放平台

注册开发平台流程

注册开发平台推荐使用企业账户,因为后面使用到的一些支付方式仅对企业开放。

支付宝账号注册

注册前需要准备什么资料?

注册前需要准备:影印件必须为彩色原件的扫描件或数码照

  • 营业执照影印件
  • 对公银行账户,可以是基本户或一般户
  • 法定代表人的身份证影印件

如果你是代理人,除以上资料,还需准备:

  • 你的身份证影印件
  • 企业委托书,必须盖有公司公章或者财务专用章,不能是合同/业务专用章

企业实名认证时支付宝会在对公银行账户中打一笔小金额款项。认证完成之后此笔金额会转到你注册的支付宝账户的余额当中。

常见帮助问题可以参考官方的FAQ

账号注册已实名认证之后我们就开始开发。

开始开发

如果你不是刚才注册账号的拥有者,你来开发需要账号的拥有者添加开发者管理员才能进行下面的操作。如何设置开发者管理员?

创建应用与使用

具体流程这里就不截图了可以参考这里。这里我们使用沙箱环境的应用。沙箱环境使用说明

正式环境应用需要创建应用添加应用功能配置应用环境以及应用申请上线

沙箱环境正式环境应用都是需要配置应用环境其他步骤按照提示操作就行,下面我们重点来关注下如何配置应用的环境。

配置应用环境

配置参数说明

以下是我添加的一个应用名称为Javen的应用,如下图

创建的应用

开发者所需配置内容:

字段名称

字段描述

应用网关(上图1)

用于接收支付宝异步通知,例如口碑开店中,需要配置此网关来接收开发者门店被动通知

授权回调地址(上图2)

第三方授权或用户信息授权后回调地址。授权链接中配置的redirect_uri的值必须与此值保持一致。(如:https://www.alipay.com) 注:当填入该地址时,系统会自动进行安全检测,详情请参考安全检测

RSA(SHA256)密钥(上图3)

开发者要保证接口中使用的私钥与此处的公钥匹配,否则无法调用接口。可参考密钥的生成与配置,且接口参数sign_type=RSA2。

---

---

生成密钥并配置

下载对应版本的密钥生成工具

WINDOWS

MAC_OSX

具体的流程我这里就不贴图了参考这个生成与配置官方文档

上传工具产生的公钥之后会产生支付宝的公钥

以上配置完成我们可以获取到以下配置参数:

  • appId 应用的编号
  • privateKey 工具的生成应用私钥,公钥已上传并产生了支付宝的公钥
  • alipayPulicKey 支付宝的公钥
  • serverUrl 应用的网关

万事俱备只欠东风

开始对接

我这里已Java为例,为大家讲解如何对接支付宝提供的支付方式以及常用的接口。

最近开放的新接口后面会在我的CSDN博客中更新

  • 花呗分期
  • 收发现金红包
快速接入

这里我们使用官方提供的开放平台服务端SDK

开发语言

资源下载

环境要求

JAVA版资源

SDK1.5

适用于Java语言、jdk版本1.5及以上的开发环境

.NET版资源

SDK

适用于Visual studio 2010及以上版本、Framework3.5 SP1及以上版本的开发环境

PHP版资源

SDK

适用于php5.5以上的开发环境

---

---

---

开放平台服务端SDK

服务端SDK使用的步骤:

1、初始化客户端AlipayClient 2、实例化具体API对应的request类 3、设置请求参数 4、客户端执行请求alipayClient.execute(request); 5、获取请求相应的对象response 6、从相应的对象response中判断执行的结果

不同的接口具体使用总结可以参考我之前写的一篇博客 支付宝支付-常用支付API详解(查询、退款、提现等)

这里贴一下我开源项目IJPay让支付触手可及中封装的代码

IJPay让支付触手可及

封装的接口AliPayApi.java

/**
 * @author Javen
 * 2017年5月20日
 */
public class AliPayApi {

    /**
     * APP支付
     * @param model
     * @param notifyUrl
     * @return {String}
     * @throws {AlipayApiException}
     */
    public static String startAppPayStr(AlipayTradeAppPayModel model, String notifyUrl) throws AlipayApiException{
        AlipayTradeAppPayResponse response = appPay(model,notifyUrl);
        return response.getBody();
    }

    /**
     * APP支付
     * https://doc.open.alipay.com/docs/doc.htm?treeId=54&articleId=106370&docType=1
     * @param model
     * @param notifyUrl
     * @return {AlipayTradeAppPayResponse}
     * @throws {AlipayApiException}
     */
    public static AlipayTradeAppPayResponse appPay(AlipayTradeAppPayModel model, String notifyUrl) throws AlipayApiException{
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        request.setBizModel(model);
        request.setNotifyUrl(notifyUrl);
        //这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = AliPayApiConfigKit.getAliPayApiConfig().getAlipayClient().sdkExecute(request);
        return response;
    }

    /**
     * WAP支付
     * https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.dfHHR3&treeId=203&articleId=105285&docType=1
     * @param response
     * @param model
     * @param returnUrl
     * @param notifyUrl
     * @throws {AlipayApiException}
     * @throws IOException
     */
    public static void wapPay(HttpServletResponse response,AlipayTradeWapPayModel model,String returnUrl,String notifyUrl) throws AlipayApiException, IOException {
        String form = wapPayToString(response, model, returnUrl, notifyUrl);
        HttpServletResponse httpResponse = response;
        httpResponse.setContentType("text/html;charset=" + AliPayApiConfigKit.getAliPayApiConfig().getCharset());
        httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面
        httpResponse.getWriter().flush();
    }
    /**
     * WAP支付
     * @param response
     * @param model
     * @param returnUrl
     * @param notifyUrl
     * @return {String}
     * @throws {AlipayApiException}
     * @throws IOException
     */
    public static String wapPayToString(HttpServletResponse response,AlipayTradeWapPayModel model,String returnUrl,String notifyUrl) throws AlipayApiException, IOException {
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();// 创建API对应的request
        alipayRequest.setReturnUrl(returnUrl);
        alipayRequest.setNotifyUrl(notifyUrl);// 在公共参数中设置回跳和通知地址
        alipayRequest.setBizModel(model);// 填充业务参数
        return AliPayApiConfigKit.getAliPayApiConfig().getAlipayClient().pageExecute(alipayRequest).getBody(); // 调用SDK生成表单
    }

    /**
     * 条形码支付、声波支付
     * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.XVqALk&apiId=850&docType=4
     * @param model
     * @param notifyUrl
     * @return {String}
     * @throws {AlipayApiException}
     */
    public static String tradePay(AlipayTradePayModel model, String notifyUrl) throws AlipayApiException {
        AlipayTradePayResponse response = tradePayToResponse(model,notifyUrl);
        return response.getBody();
    }
    /**
     * 条形码支付、声波支付
     * @param model
     * @param notifyUrl
     * @return {AlipayTradePayResponse}
     * @throws {AlipayApiException}
     */
    public static AlipayTradePayResponse tradePayToResponse(AlipayTradePayModel model, String notifyUrl) throws AlipayApiException{
        AlipayTradePayRequest request = new AlipayTradePayRequest();
        request.setBizModel(model);// 填充业务参数
        request.setNotifyUrl(notifyUrl);
        return AliPayApiConfigKit.getAliPayApiConfig().getAlipayClient().execute(request); // 通过AliPayApiConfigKit.getAliPayApiConfig().getAlipayClient()调用API,获得对应的response类
    }



    /**
     * 扫码支付
     * https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.i0UVZn&treeId=193&articleId=105170&docType=1#s4
     * @param model
     * @param notifyUrl
     * @retur
                        
隐藏内容 支付可见
购买文章 ¥9.9
订阅频道首月仅需 12 元/月,预计可省 1288 元
¥9.9
¥9.9购买
订阅频道免费读
× 订阅 Java 精选频道
首次订阅 ¥ 元/月 15元/月
订阅即可免费阅读所有精选内容