1-对接渠道&部署说明文档
1. 开发说明
使用spring boot + dubbo架构开发。包括运营平台、代理商系统、商户系统、支付系统,结算系统、对账系统等。
xxpay-generator 生成mybatis代码,然后将model拷贝到xxpay-core项目中,将mapper拷贝到xxpay-service项目中,拷贝mapper时要比对是否有修改
xxpay-service 为dubbo服务生产者,所有与数据库操作,或公共的的业务逻辑都封装此业务层,该项目中修改数据配置文件
xxpay-core 为公共方法,dubbo服务接口以及实体bean,每个项目都需要引用
xxpay-manage 运营管理平台的接口及前端页面(前后端分离)
xxpay-agent 代理商系统的接口及前端页面(前后端分离)
xxpay-merchant 商户系统的接口及前端页面(前后端分离)
xxpay-pay 支付网关,所有上游支付渠道对接实现,为下游提供收款、代付接口
xxpay-task 对账和结算服务,使用定时器任务(部署时保证只有一个定时器处理任务)
项目 | 端口 | 描述 |
xxpay-core | 公共方法,实体Bean,API接口定义 | |
xxpay-generator | mybatis数据访问层生成代码 | |
xxpay-service | 业务接口,服务生产者 | |
xxpay-manage | 8193 | 运营平台 |
xxpay-agent | 8192 | 代理商系统 |
xxpay-merchant | 8191 | 商户系统 |
xxpay-pay | 3020 | 支付网关 |
xxpay-task | 8194 | 定时任务,包括结算和对账服务 |
项目使用maven编译,在mac下使用idea开发完成。在其他操作系统windows,linux下,使用idea或eclipse均可开发。
2. 部署说明
依赖环境
该项目使用dubbo+zookeeper架构实现微服务,系统通知使用MQ实现,分布式缓存使用redis。
所依赖环境:zookeeper, activemq, mysql,redis
推荐购买阿里云的主机,建议不低于以下配置:
操作系统 | CPU | 内存 | 带宽 | 其他 |
Linux CentOS 7.2 | 4核 | 8G | 2M(或弹性) | 经典网络,公网IP |
推荐的软件版本
软件 | 版本 | 说明 |
JDK | 1.8 | spring boot 对低版jdk支持没有测过 |
ActiveMQ | 5.11.1 | 建议:5.14.3或更高版本 |
ZooKeeper | 3.4.6 | 高版本也可以 |
MySQL | 5.7.17 | 为了增强性能及稳定性,建议购买阿里云的RDS数据库 |
Redis | 3.2.8 | 高版本也可以 |
注意:该架构是支持分布式集群部署的,如果对服务质量有更高的要求,建议部署集群环境
配置文件
在每个项目下有application.yml文件,需要修改里面的数据库和zookeeper配置。
数据库脚本目录下的pay_db.sql文件,是建表语句和数据初始化语句,执行sql将会创建数据库表结构和初始化数据。
项目编译
项目编译时区分开发、测试、生产三种环境,需修改:
(1)xxpay-service项目配置中的mysql配置信息;
(2)xxpay-pay项目配置中的activemq配置;
(3)每个项目配置中的zookeeper路径;
项目启动
项目通过maven打包后,在每个项目target目录下生成tar.gz文件,将该文件上传到linux服务器,解压后。进入到目录下,执行bin目录下的sh文件,启动项目命令如:./bin/merchant.sh start
start: 启动项目
stop:停止项目
restart: 重启项目
status: 查看项目状态
按如上方法依次启动序:xxpay-service,xxpay-pay,xxpay-manage,xxpay-agent,xxpay-merchant
最佳实践 将项目上传至服务器/home/xxpay/service目录下,然后解压tar.gz文件。按上面顺序,进入文件目录下,执行启动命令,依次启动。
项目访问
商户系统:http://localhost:8191
代理商平台:http://localhost:8192
运营平台:http://localhost:8193
支付接口:http://localhost:3020/api/
超级管理员账号:admin,密码:yipay@#2019
登录系统后,可通过系统管理-用户管理添加管理员。
3. 通道配置
支付通道配置
(1)创建支付通道
(2)配置通道子账户
(3)配置通道账户信息
配置费率
(1)商户支付通道配置
计入配置项,可配置单独接口或轮询接口。
(2)配置代理商费率
4. Demo使用
该测试是一个基于java实现的demo,包括调xxpay的api接口,以及完成支付流程演示。
使用spring boot开发,直接启动 XxPayDemoApplication 即可访问,端口号:8081
- config:
- payUrl: http://127.0.0.1:3020/api
- mchId: 20000000
- appId: 710ddfebd2154434a8cfee1807b27eea
- privateKey: bWK682hxuJSXWHilCFxHCpaIANFBuT4GnDnglrXgHFOwgsrx
payUrl XxPay支付系统接口地址,对应xxpay-pay项目
mchId XxPay运营平台分配的商户ID
appId 商户自己创建的应用ID
privateKey 商户私钥,可取商户平台通过支付密码查看
如何测试
org.xxpay.demo.api.PayOrderDemo 该类中包括统一下单和查询订单接口调用例子。
org.xxpay.demo.api.PayOrderDemo 该类中包括创建收银台地址的调用例子。
支付流程
5.1 通道对接开发说明
该文档适合技术人员阅读,可以帮助技术人员快速对接上游通道。我们这里将上游通道区分为支付通道和代付通道。
1. 支付通道
商户下单后,xxpay-pay项目中的PayOrderController类中的payOrder方法负责接收商户下单请求,该方法中会根据商户的下单请求参数,得到具体的支付通道名称,然后调用该通道的pay方法完成上游通道的下单操作,具体代码提下如下。
通过 paymentInterface = (PaymentInterface) SpringUtil.getBean(channelName.toLowerCase() + "PaymentService");
可以从spring容器中得到该通道的实例,然后调用具体的下单方法。
所以在命名通道类名的时候,格式须为:通道名称+PaymentService。
在xxpay-pay项目中的channel目录下,须为通道创建一个独立的目录。
比如这里以威富通为例,威富通就是一个具体的上游通道,给它定义名称为swiftpay,一般名字的定义来自通道的品牌名称。
然后在该目录下创建具体的支付实现类,名字为:SwiftpayPaymentService,类的名字必须是通道名称+PaymentService,首字母大写。然后该类继承自BasePayment,重写pay方法即可。
一般一个通道会对应多种支付方式,比如威富通会有微信扫码支付,支付宝扫码支付,统一条码支付等。那么每种支付方式需要对应一个支付接口,我们这样命名:通道名称+_+支付方式,如威富通微信扫码支付我们定义为:swiftpay_wxpay_native。
在pay方法中,我们会根据商户选择的支付方式,对应到上游通道的实现方法中,可以参考威富通的支付对接实现。具体的每种支付方式,需要参考上游通道的接口和demo来实现。
一般正规的支付流程,都是在用户支付成功后,上游通道会回调接口中上传的回调地址,那么我们需要处理上游过来的回调请求。
同样的,也是在支付通道目录下,创建一个支付回调的实现类,类的名字为:通道名称+PayNotifyService,如威富通支付的回调类名为:SwiftpayPayNotifyService,该类继承自BasePayNotify,重写doNotify方法即可。
在调用上游通道支付接口时,我们会指定回调地址,那么在我们系统中,通过统一的方式获取支付回调地址,具体代码如下。
notify地址格式为:http://支付系统地址/notify/通道名称/notify_res.htm,如威富通的回调地址为:http://pay.xx.com/notify/swiftpay/notify_res.htm,每个通道获取到的通知地址,通道名称是对应自己的。通知的入口类为:NotifyPayController,实现代码为:
原理同支付类似,也是得到具体的通道,然后从spring容器中得到具体的通知实例,调用doNotify方法。
一般每个支付通道都会对应一些配置,比如商户ID,私钥,网关地址等信息。我们需要根据上游通道的接口文档,抽象出具体的配置字段,然后定义配置类。一般类的名称命名为通道名称+Config,比如威富通的配置类为SwiftpayConfig。威富通的配置包括商户ID,商户key,网关请求地址,那么我们的代码是这样的。
在调用上游通道接口时,当需要使用配置参数时,我们可以这样使用。
以上支付通道的支付接口,回调接口都已经实现,这时需要在运营平台创建通道接口配置,才可使用。
创建支付接口类型
进入:运营平台 > 支付配置 > 支付接口类型 > 新增接口类型
接口类型代码:这个和支付通道的通道名称是一致的,如:swiftpay。
接口类型名称:对应上游支付通道名称,如:威富通支付。
配置定义描述:这里是和我们上面提到的通道配置类对应,内容为json格式,描述了生成该通道配置账户界面的表单内容。
创建支付接口
进入:运营平台 > 支付配置 > 支付接口 > 新增支付接口
接口代码:这里对应我们我们为每个支付通道定义的支付接口,如威富通的微信扫码支付,名字为:swiftpay_wxpay_native。
接口类型:选择对应的通道名称。
支付类型:根据具体的支付场景,选择对应的支付类型(支付类型的定义在类PayConstant中)。
通道账号配置
进入:运营平台 > 支付配置 > 支付通道 > 子账户
账户配置的表单,就来自上面配置的支付接口类型的配置定义描述,也对应通道配置类中的属性。
2. 代付通道
代付通道的实现参考支付通道即可,这里调用的是上游的代付接口。下面给出几个核心逻辑类,相信聪明你的一定知道如何对接的。
转账入口类:TransOrderController
转账实现类名称格式:通道名称+TransService,重写trans方法。
5.2 支付宝官方通道配置
参考该页面的生成方式:小程序文档 - 支付宝文档中心
使用工具生成时,选择 PKCS8(JAVA适用)和 1024 长度。
保留好生成公钥和私钥,这是一对,切记对应好。
登录企业支付宝,通过下图入口,进入秘钥配置。
进入开放平台秘钥配置界面。
如果第一次配置,应该看到的是 配置应用公钥 ,在此配置上面生成的公钥信息。
配置后,可以查看支付宝公钥。
从支付通道-子账户进入配置,支付通道配置如下图:
配置说明:
渠道商户ID:配置支付宝账号,如邮箱地址
合作伙伴身份(PID):在支付宝mapi网关产品密钥下,可查看
应用App ID:在开放平台秘钥下,可查看
应用私钥:第一步中生成的私钥信息
支付宝公钥:第二步中从支付宝获取的公钥信息
网关地址:支付宝 - 网上支付 安全快速!
6. 系统运维
该文档适合技术人员或运维人员阅读,这里会介绍一些生产系统问题的排查与解决方法,本文档也会根据客户反馈的问题不断更新。
项目启动
如果是按照部署文档安装的系统,那么会创建一个kdpay用户。
登录kdpay用户,然后进入到/home/kdpay目录下,按如下启动:
- 启动zookeeper,进入zookeeper-3.4.6目录下。
启动:./bin/zkServer.sh start
查看:./bin/zkServer.sh status - 启动activemq,进入apache-activemq-5.11.1目录下。
启动:./bin/activemq start
查看:./bin/activemq status
进入到/home/xxpay/service目录下,部署后的项目如下:
按如下顺序启动服务:
- 启动service,进入xxpay-service-1.0.0目录下。
启动:./bin/service.sh start
重启:./bin/service.sh restart
查看:./bin/service.sh status
日志:tail -f ./log/xxpay-service.log - 启动pay,进入xxpay-pay-1.0.0目录下。
启动:./bin/pay.sh start
重启:./bin/pay.sh restart
查看:./bin/pay.sh status
日志:tail -f ./log/xxpay-pay.log - 启动agent,进入xxpay-agent-1.0.0目录下。
启动:./bin/agent.sh start
重启:./bin/agent.sh restart
查看:./bin/agent.sh status
日志:tail -f ./log/xxpay-agent.log - 启动manage,进入xxpay-manage-1.0.0目录下。
启动:./bin/manage.sh start
重启:./bin/manage.sh restart
查看:./bin/manage.sh status
日志:tail -f ./log/xxpay-manage.log - 启动merchant,进入xxpay-merchant-1.0.0目录下。
启动:./bin/merchant.sh start
重启:./bin/merchant.sh restart
查看:./bin/merchant.sh status
日志:tail -f ./log/xxpay-merchant.log - 启动task,进入xxpay-task-1.0.0目录下。
启动:./bin/task.sh start
重启:./bin/task.sh restart
查看:./bin/task.sh status
日志:tail -f ./log/xxpay-task.log
7. 系统业务
账户余额: 作为收款账户,包括可结算金额和带结算金额
不可用余额: 指的是当前收款账户中不可用的金额,如正在提现中的金额都是不可用余额
可结算金额: 收款账户已经结算的金额,已结算的金额可提现
保证金: 指商户开户费账户
冻结金额: 收款账户的冻结金额,冻结的金额不可提现
代付余额: 作为代付账户,商户通过在线充值通道充值的金额会转入该账户(实时到账),发起代付会扣减该账户
不可用代付余额: 指的是当前代付账户中不可用的金额,如正在代付处理中的金额都是不可用代付余额
系统流程初体验
1. 配置上游支付通道
入口:运营平台 > 支付配置 > 支付通道 > 新增支付通道
这里以微信官方扫码支付为例,新增支付通道。
点击风控可以设置该通道的风控规则。
点击子账户为该通道配置账户。
一个支付通道支持多个子账户,可以单独配置每个子账户的风控规则也可以继承通道。支付时会从子账户池中轮询子账户(也支持指定固定账户支付)。
为了测试支付通道的轮询,我们这里再增加一个威富通的微信扫码支付,同时也要配置子账户。
此时我们已经配置了2个微信扫码的支付通道。
2. 配置上游代付通道
入口:运营平台 > 代付管理 > 代付通道 > 新增代付通道
这里以卡拉卡代付为例,新增代付通道。
点击风控设置代付通道的风控规则。
点击子账户配置代付通道的账户。
一个代付通道支持多个子账户,可以单独配置每个子账户的风控规则也可以继承通道。代付时会从子账户池中轮询子账户(也支持)。
可以配置子账户的风控,也可以查询在上游通道中的余额。
3. 创建代理商
入口:运营平台 > 代理商管理 > 所有代理商 > 新增
新增成功后,会得到代理商ID,在新增商户时需要填代理商ID。
(1)点击费率设置可以为代理商设置配置支付渠道和费率。
(2)点击结算设置为代理商配置结算属性。
4. 创建商户
入口:运营平台 > 商户管理 > 所有商户 > 新增
(1)点击支付通道为商户配置支付通道,列表中显示平台的所有支付产品,可以为商户设置每个产品的通道和费率。
注意:如果没有设置代理商费率,那么商户通道是不能设置的。
这里为微信扫码支付产品为例进行配置。
配置的商户费率不能小于代理商费率。
到此为止支付通道的费率都有了,那么有必要介绍下系统的支付费率逻辑。
要保证:支付通道费率 < 代理商费率 < 商户费率
那么一笔支付订单,各方的成本及利润计算逻辑如下:
商户成本:订单金额 X 商户费率
商户到账:订单金额 X (1 - 费率)
代理商利润:订单金额 X(商户费率 - 代理商费率)
平台成本:订单金额 X 渠道费率
平台利润:订单金额 X(代理商费率 - 渠道费率)
可以配置通道的接口模式,包括单独和轮询两种。
设置单独模式,需要选择支付通道,同时也可以指定通道的子账户(非必须)。
设置轮询模式,可以选择多个支付通道,设置通道的权重。
支付网关在受理下单时,会按照权重轮询支付通道,并从通道子账户池中得到子账户进行下单。
(2)点击代付通道为商户配置代付通道,列表中显示平台配置的所有代付通道,可以为商户设置每个代付通道。
(3)点击结算设置为商户配置结算属性。
5. 创建应用
入口:商户系统 > 商户 > 应用管理 > 新建应用
需要记录此处的应用ID,在支付下单时可以传该参数(非必须)。
可以为应用配置二维码,此处二维码指的是一码付(一个码,看微信或支付宝扫描支付),这里会有单独详细介绍。
6. 安全中心
商户系统和代理商系统都有安全中心,安全中心可以查看支付密钥,绑定谷歌验证,设置登录和支付安全验证方式。
以商户系统的安全中心为例,进行说明。
入口:商户系统 > 商户 > 安全中心
(1)先绑定谷歌验证,先用手机下载Google身份验证器客户端。点击绑定,进入绑定流程,用刚下载的Google身份验证器,扫码二维码,然后输入验证器软件上提示的数字,进行绑定。
商户绑定后,只能在运营平台商户编辑中,进行解绑操作。
(2)查看商户秘钥,修改秘钥时需要谷歌验证码校验。需要保管好商户的秘钥,这个在支付验证签名时必须。
(3)设置商户登录和支付设置,建议使用谷歌验证,确保商户资金安全。
7. 支付测试
通过配置demo例子,然后进入测试页面,测试微信扫码支付。
8. 代付测试
入口:商户系统 > 结算 > 代付管理
支持三种代付申请。
单笔代付:只可发起一笔,录入对分行账户信息。最多可以发起一笔代付,后端实时调用上游代付通道。
批量代付:可通过界面操作增减行,录入对方的账户信息。最多可以发起一笔代付,后端异步调用上游代付通道。
批量上传:可下载模板文件,然后在excel模板文件中录入对方账户信息。可发起多条代付,后端异步调用上游代付通道。
支付接口文档
1.0 接口规则
协议规则
传输方式:采用HTTP传输(生产环境建议HTTPS)
提交方式:采用POST/GET方式提交
字符编码:UTF-8
签名算法:MD5
参数规范
交易金额:默认为人民币交易,单位为分,参数值不能带小数。
安全规范
1、签名算法
签名生成的通用步骤如下
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或支付中心主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 支付中心接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
如请求支付系统参数如下:
- Map signMap = new HashMap<>();
- signMap.put("userId", "test01");
- signMap.put("type", "wechat");
- signMap.put("money", Double.valueOf(2));
- signMap.put("remark", "");
- signMap.put("outTradeNo", "P12312321123");
待签名值:money=2.0&outTradeNo=P12312321123&type=wechat&userId=test01&key=EWEFD123RGSRETYDFNGFGFGSHDFGH
签名结果:5E0AA05DD4BB4FE5AB65608123EBA591
最终请求支付系统参数:money=2.0&outTradeNo=P12312321123&type=wechat&userId=test01&sign=5E0AA05DD4BB4FE5AB65608123EBA591
商户登录商户系统后,通过安全中心查看或修改私钥key。
1.1 统一下单
业务通过统一下单接口可以发起任意三方支付渠道的支付订单。业务系统不必关心该如何调用三方支付,统一下单接口会根据业务系统选择的支付渠道ID,选择对应支付渠道的支付产品,发起下单请求,然后响应给业务系统支付请求所需参数。
接口链接
URL地址:https://pay.bpay.org/api/pay/create_order
请求参数
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
商户ID | mchId | 是 | long | 20001222 | 分配的商户号 |
应用ID | appId | 是 | String(32) | 0ae8be35ff634e2abe94f5f32f6d5c4f | 该商户创建的应用对应的ID |
支付产品ID | productId | 是 | int | 8000 | 支付产品ID |
商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号 |
币种 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny |
支付金额 | amount | 是 | int | 100 | 支付金额,单位分 |
客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IP地址 |
设备 | device | 否 | String(64) | ios10.3.1 | 客户端设备 |
支付结果前端跳转URL | returnUrl | 否 | String(128) | 支付结果回调URL | |
支付结果后台回调URL | notifyUrl | 是 | String(128) | 支付结果回调URL | |
商品主题 | subject | 是 | String(64) | pay测试商品1 | 商品主题 |
商品描述信息 | body | 是 | String(256) | pay测试商品描述 | 商品描述信息 |
扩展参数1 | param1 | 否 | String(64) | 支付中心回调时会原样返回 | |
扩展参数2 | param2 | 否 | String(64) | 支付中心回调时会原样返回 | |
附加参数 | extra | 是 | String(512) | {“openId”:”o2RvowBf7sOVJf8kJksUEMceaDqo”} | 特定渠道发起时额外参数,见下面说明 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
返回结果
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
返回状态码 | retCode | 是 | String(16) | SUCCESS | SUCCESS/FAIL此字段标识是否成功 |
返回信息 | retMsg | 否 | String(128) | 签名失败 | 返回信息,如非空,为错误原因 签名失败 参数格式校验错误 |
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
支付订单号 | payOrderId | 是 | String(32) | 20160427210604000490 | 支付中心生成的订单号 |
支付参数 | payParams | 是 | JSONObject | 该字段返回JSON格式数据,多指调起第三方支付所需传递参数 |
(1)当请求参数productId=8004(微信公众号支付)时,返回的JSON格式数据如下:
- {
- "sign": "24F5916D6B1AB64918B3BF7250693813",
- "payOrderId": "P2016081612553098759124940",
- "retCode": "SUCCESS",
- "retMsg": "",
- "payParams": {
- "prepayId": "wx201608161255321fc59e085b0578219742",
- "appId": "wx0ab67caf7f591834",
- "timeStamp": 1471323332,
- "signType": "MD5",
- "package": "prepay_id=wx201608161255321fc59e085b0578219742",
- "nonceStr": "08s06nujam43aot3tbl555lavvydl178",
- "paySign": "21E6BF4984030DBD2DB191F676A47DA2"
- }
- }
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
预下单号 | prepayId | 是 | String | wx201608161255321fc59e085b0578219742 | 微信预下单号 |
微信签名 | paySign | 是 | String | C380BEC2BFD727A4B6845133519F3AD6 | 签名,调取微信支付时用到的签名值 |
应用ID | appId | 是 | String | wx0ab67caf7f591834 | 微信开放平台审核通过的应用APPID |
签名算法 | signType | 是 | String | MD5 | 签名算法,暂支持MD5 |
扩展字段 | package | 是 | String | prepay_id=wx201608161255321fc59e085b0578219742 | 扩展字段 |
随机字符串 | nonceStr | 是 | String | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位 |
时间戳 | timeStamp | 是 | String | 1412000000 | 时间戳,10位 |
(2)当请求参数productId=8002(微信原生扫码支付)时,返回的JSON格式数据如下:
- {
- "sign": "3424ED83034B20CF17961720FE272A94",
- "payOrderId": "pay2016081613050939023127932",
- "retCode": "SUCCESS",
- "retMsg": "",
- "payParams": {
- "prepayId": "wx201608161255321fc59e085b0578219742",
- "codeUrl": "weixin://wxpay/bizpayurl?pr=sHYHnns",
- "codeImgUrl": "http://wxpay/bizpayurl?pr=sHYHnns"
- }
- }
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
预下单号 | prepayId | 是 | String | wx201608161255321fc59e085b0578219742 | 微信预下单号 |
二维码链接 | codeUrl | 是 | String | weixin://wxpay/s/Anp43md | 可将该参数值生产二维码展示 |
二维码图片链接 | codeImgUrl | 是 | String |
(3)当请求参数productId=8007(支付宝H5支付),返回的JSON格式数据如下:
- {
- "payOrderId": "P0020180114172136000000",
- "sign": "A1F39B0D7BD15E7A7BB6B99762302C51",
- "payParams": {
- "payUrl": "<form name=\"punchout_form\" method=\"post\" action=\"https://openapi.alipay.com/gateway.do?charset=UTF-8&method=alipay.trade.wap.pay&sign=DxPbQZwi2Zpnv%2BqC8UdfLgSGMB%2F%2FaspU34ZkRVdi7kzUlAQsDiNoT0MIsyby2c%2FahNXjOx69IrPqhha6oIDUBGFodK6nZ3izfDkagbKyvoSnRVaoQ%2FXKeQowiCmVMiln9xN1SpiWdXE7dsQkCzCAzUD5yeAAbQbn38MkJ2TF6dFXql%2BT0yATgkSzYSuQxlUJVnpKCpDKYeL0NHaf58EbT63pkdOyfODWz%2BD1eUwbspzzul1kY7AYD2ZSHQKyW4zxQS0YzrpUKPhF2olGtgVZo2EEcqQuxIgC4hz1TTqVjD2VK5kj45BJ%2B0xd1DsojLXjxaR5qziFYKqSGU8OiN0yhg%3D%3D&return_url=http%3A%2F%2Fwww.xxpay.org¬ify_url=http%3A%2F%2Fpay.t.xxpay.org%2Fnotify%2Fpay%2FaliPayNotifyRes.htm&version=1.0&app_id=2015081500216362&sign_type=RSA2×tamp=2018-01-14+17%3A21%3A37&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json\">\n<input type=\"hidden\" name=\"biz_content\" value=\"{"body":"XXPAY支付测试","out_trade_no":"P0020180114172136000000","product_code":"QUICK_WAP_PAY","subject":"XXPAY支付测试","total_amount":"0.01"}\">\n<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n</form>\n<script>document.forms[0].submit();</script>"
- },
- "retCode": "SUCCESS"
- }
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
支付URL | payUrl | 是 | String | 跳转支付wap支付所需的表单信息 |
1.2 查询支付订单
业务系统通过查询支付订单接口获取最新的支付订单状态,并根据状态结果进一步处理业务逻辑。
接口链接
URL地址:https://pay.bpay.org/api/pay/query_order
请求参数
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
商户ID | mchId | 是 | String(30) | 1000000010 | 支付中心分配的商户号 |
应用ID | appId | 是 | String(32) | 0ae8be35ff634e2abe94f5f32f6d5c4f | 该商户创建的应用对应的ID |
支付订单号 | payOrderId | 是 | String(30) | P20160427210604000490 | 支付中心生成的订单号,与mchOrderNo二者传一即可 |
商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号,与payOrderId二者传一即可 |
是否执行回调 | executeNotify | 否 | Boolean | true | 是否执行回调,如果为true,则支付中心会再次向商户发起一次回调,如果为false则不会发起 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
返回状态码 | retCode | 是 | String(16) | SUCCESS | SUCCESS/FAIL此字段标识是否成功 |
返回信息 | retMsg | 否 | String(128) | 签名失败 | 返回信息,如非空,为错误原因 签名失败 参数格式校验错误 |
以下字段在retCode为SUCCESS的时候有返回
字段名发 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
商户ID | mchId | 是 | long(30) | 20001222 | 支付中心分配的商户号 |
应用ID | appId | 是 | String(32) | 0ae8be35ff634e2abe94f5f32f6d5c4f | 该商户创建的应用对应的ID |
支付产品ID | productId | 是 | int | 8001 | 支付产品ID |
支付订单号 | payOrderId | 是 | String(30) | P20160427210604000490 | 支付中心生成的订单号 |
商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号 |
支付金额 | amount | 是 | int | 100 | 支付金额,单位分 |
币种 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny |
状态 | status | 是 | int | 1 | 支付状态,0-订单生成,1-支付中,2-支付成功,3-业务处理完成 |
渠道用户ID | channelUser | 否 | String(64) | 渠道测支付时使用的用户ID | |
渠道订单号 | channelOrderNo | 否 | String | wx20170910211043fb206e92260071822007 | 对应的第三方支付订单号 |
渠道数据包 | channelAttach | 否 | String | {“bank_type”:”CMB_DEBIT”,”trade_type”:”pay.weixin.micropay”} | 支付渠道数据包 |
支付成功时间 | paySuccTime | 否 | Long | 1505049094262 |
1.3 支付结果通知
该链接是通过统一下单接口提交的参数notifyUrl设置,如果无法访问链接,业务系统将无法接收到支付中心的通知。
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
商户入账 | income | 是 | int | 100 | 商户实际入账金额,单位:分 |
支付订单号 | payOrderId | 是 | String(30) | P20160427210604000490 | 支付中心生成的订单号 |
商户ID | mchId | 是 | String(30) | 20001222 | 支付中心分配的商户号 |
应用ID | appId | 是 | String(32) | 0ae8be35ff634e2abe94f5f32f6d5c4f | 该商户创建的应用对应的ID |
支付产品ID | productId | 是 | int | 8001 | 支付产品ID |
商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号 |
支付金额 | amount | 是 | int | 100 | 支付金额,单位分 |
状态 | status | 是 | int | 1 | 支付状态,0-订单生成,1-支付中,2-支付成功,3-业务处理完成 |
渠道订单号 | channelOrderNo | 否 | String(64) | wx2016081611532915ae15beab0167893571 | 三方支付渠道订单号 |
渠道数据包 | channelAttach | 否 | String | {“bank_type”:”CMB_DEBIT”,”trade_type”:”pay.weixin.micropay”} | 支付渠道数据包 |
扩展参数1 | param1 | 否 | String(64) | 支付中心回调时会原样返回 | |
扩展参数2 | param2 | 否 | String(64) | 支付中心回调时会原样返回 | |
支付成功时间 | paySuccTime | 是 | long | 精确到毫秒 | |
通知类型 | backType | 是 | int | 1 | 通知类型,1-前台通知,2-后台通知 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
返回结果
业务系统处理后同步返回给支付中心,返回字符串 success 则表示成功,返回非success则表示处理失败,支付中心会再次通知业务系统。(通知频率为60/120/180/240/300,单位:秒)
1.4 创建收银台
业务通过创建收银台接口得到收银台地址URl,用户打开收银台URL进入支付流程。
接口链接
创建PC收银台接口地址:https://pay.bpay.org/api/cashier/pc_build
请求参数
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
商户ID | mchId | 是 | long | 20001222 | 分配的商户号 |
应用ID | appId | 否 | String(32) | 0ae8be35ff634e2abe94f5f32f6d5c4f | 该商户创建的应用对应的ID |
支付产品ID | productId | 是 | int | 8000 | 支付产品ID |
商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号 |
支付金额 | amount | 是 | int | 100 | 支付金额,单位分 |
支付结果前端跳转URL | returnUrl | 否 | String(128) | 支付结果回调URL | |
支付结果后台回调URL | notifyUrl | 是 | String(128) | 支付结果回调URL | |
商品主题 | subject | 是 | String(64) | pay测试商品1 | 商品主题 |
商品描述信息 | body | 是 | String(256) | pay测试商品描述 | 商品描述信息 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
返回结果
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
返回状态码 | retCode | 是 | String(16) | SUCCESS | SUCCESS/FAIL此字段标识是否成功 |
返回信息 | retMsg | 否 | String(128) | 签名失败 | 返回信息,如非空,为错误原因 签名失败 参数格式校验错误 |
以下字段在retCode为SUCCESS的时候有返回
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
收银台URl | payUrl | 是 | String | 收银台地址 |
返回的JSON格式数据如下:
- {
- "sign": "5AAD2B9513ADE7E0C76A4BC99E1A92F0",
- "payUrl": "http://127.0.0.1:3020/api/cashier/pc?mchId=20000000&appId=710ddfebd2154434a8cfee1807b27eea&productId=8000,8001&amount=1&mchOrderNo=1528684776204&subject=XXPAY%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95&body=XXPAY%E6%94%AF%E4%BB%98%E6%B5%8B%E8%AF%95¬ifyUrl=http%3A%2F%2Fwww.baidu.com&sign=9849EC1C736C72BCD59558DACA69FD6B",
- "retCode": "SUCCESS"
- }
9.0 编码表
1. 支付产品
产品ID | 产品名称 | 支付类型 |
8000 | 网银支付 | 网银支付 |
8001 | 快捷支付 | 快捷支付 |
8002 | 微信扫码支付 | 微信扫码支付 |
8003 | 微信H5支付 | 微信H5支付 |
8004 | 微信公众号支付 | 微信公众号支付 |
8005 | 微信小程序支付 | 微信小程序支付 |
8006 | 支付宝扫码支付 | 支付宝扫码支付 |
支付宝H5支付 | 支付宝H5支付 | |
8008 | 支付宝服务窗支付 | 支付宝服务窗支付 |
8009 | QQ钱包扫码 | QQ钱包扫码 |
8010 | QQ钱包H5支付 | QQ钱包H5支付 |
8011 | 京东扫码支付 | 京东扫码支付 |
8012 | 京东H5支付 | 京东H5支付 |
8013 | 百度钱包 | 百度钱包 |
8014 | 银联二维码 | 银联二维码 |
2. 错误码
错误码值 | 描述 | 原因 | 解决方案 |
0010 | 系统错误 | 系统超时或异常 | 系统异常,请用相同参数重新调用 |