聚合支付平台,可对接各种上下游

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使用

Demo使用说明

xxpay4demo

该测试是一个基于java实现的demo,包括调xxpay的api接口,以及完成支付流程演示。
使用spring boot开发,直接启动 XxPayDemoApplication 即可访问,端口号:8081

修改:application.yml配置文件:

  1. config:
  2.   payUrl: http://127.0.0.1:3020/api
  3.   mchId: 20000000
  4.   appId: 710ddfebd2154434a8cfee1807b27eea
  5.   privateKey: bWK682hxuJSXWHilCFxHCpaIANFBuT4GnDnglrXgHFOwgsrx

payUrl XxPay支付系统接口地址,对应xxpay-pay项目
mchId XxPay运营平台分配的商户ID
appId 商户自己创建的应用ID
privateKey 商户私钥,可取商户平台通过支付密码查看

访问地址:http://localhost:8081/

如何测试

org.xxpay.demo.api.PayOrderDemo 该类中包括统一下单和查询订单接口调用例子。
org.xxpay.demo.api.PayOrderDemo 该类中包括创建收银台地址的调用例子。

支付流程

5.1 通道对接开发说明

通道对接

该文档适合技术人员阅读,可以帮助技术人员快速对接上游通道。我们这里将上游通道区分为支付通道和代付通道。

1. 支付通道

(1)支付流程

商户下单后,xxpay-pay项目中的PayOrderController类中的payOrder方法负责接收商户下单请求,该方法中会根据商户的下单请求参数,得到具体的支付通道名称,然后调用该通道的pay方法完成上游通道的下单操作,具体代码提下如下。

通过 paymentInterface = (PaymentInterface) SpringUtil.getBean(channelName.toLowerCase() + "PaymentService");
可以从spring容器中得到该通道的实例,然后调用具体的下单方法。

所以在命名通道类名的时候,格式须为:通道名称+PaymentService

(2)通道支付实现

在xxpay-pay项目中的channel目录下,须为通道创建一个独立的目录。

比如这里以威富通为例,威富通就是一个具体的上游通道,给它定义名称为swiftpay,一般名字的定义来自通道的品牌名称。

然后在该目录下创建具体的支付实现类,名字为:SwiftpayPaymentService,类的名字必须是通道名称+PaymentService,首字母大写。然后该类继承自BasePayment,重写pay方法即可。

一般一个通道会对应多种支付方式,比如威富通会有微信扫码支付,支付宝扫码支付,统一条码支付等。那么每种支付方式需要对应一个支付接口,我们这样命名:通道名称+_+支付方式,如威富通微信扫码支付我们定义为:swiftpay_wxpay_native

在pay方法中,我们会根据商户选择的支付方式,对应到上游通道的实现方法中,可以参考威富通的支付对接实现。具体的每种支付方式,需要参考上游通道的接口和demo来实现。

(3)通道支付回调

一般正规的支付流程,都是在用户支付成功后,上游通道会回调接口中上传的回调地址,那么我们需要处理上游过来的回调请求。

同样的,也是在支付通道目录下,创建一个支付回调的实现类,类的名字为:通道名称+PayNotifyService,如威富通支付的回调类名为:SwiftpayPayNotifyService,该类继承自BasePayNotify,重写doNotify方法即可。

在调用上游通道支付接口时,我们会指定回调地址,那么在我们系统中,通过统一的方式获取支付回调地址,具体代码如下。

notify地址格式为:http://支付系统地址/notify/通道名称/notify_res.htm,如威富通的回调地址为:http://pay.xx.com/notify/swiftpay/notify_res.htm,每个通道获取到的通知地址,通道名称是对应自己的。通知的入口类为:NotifyPayController,实现代码为:

原理同支付类似,也是得到具体的通道,然后从spring容器中得到具体的通知实例,调用doNotify方法。

(4)通道配置

一般每个支付通道都会对应一些配置,比如商户ID,私钥,网关地址等信息。我们需要根据上游通道的接口文档,抽象出具体的配置字段,然后定义配置类。一般类的名称命名为通道名称+Config,比如威富通的配置类为SwiftpayConfig。威富通的配置包括商户ID,商户key,网关请求地址,那么我们的代码是这样的。

在调用上游通道接口时,当需要使用配置参数时,我们可以这样使用。

(5)通道接口配置

以上支付通道的支付接口,回调接口都已经实现,这时需要在运营平台创建通道接口配置,才可使用。

创建支付接口类型

进入:运营平台 > 支付配置 > 支付接口类型 > 新增接口类型

接口类型代码:这个和支付通道的通道名称是一致的,如:swiftpay。
接口类型名称:对应上游支付通道名称,如:威富通支付。
配置定义描述:这里是和我们上面提到的通道配置类对应,内容为json格式,描述了生成该通道配置账户界面的表单内容。

创建支付接口

进入:运营平台 > 支付配置 > 支付接口 > 新增支付接口

接口代码:这里对应我们我们为每个支付通道定义的支付接口,如威富通的微信扫码支付,名字为:swiftpay_wxpay_native。
接口类型:选择对应的通道名称。
支付类型:根据具体的支付场景,选择对应的支付类型(支付类型的定义在类PayConstant中)。

通道账号配置

进入:运营平台 > 支付配置 > 支付通道 > 子账户

账户配置的表单,就来自上面配置的支付接口类型的配置定义描述,也对应通道配置类中的属性。

2. 代付通道

代付通道的实现参考支付通道即可,这里调用的是上游的代付接口。下面给出几个核心逻辑类,相信聪明你的一定知道如何对接的。

转账入口类:TransOrderController
转账实现类名称格式:通道名称+TransService,重写trans方法。

5.2 支付宝官方通道配置

支付宝官方通道配置说明

1. RSA公钥和私钥生成

参考该页面的生成方式:小程序文档 - 支付宝文档中心

使用工具生成时,选择 PKCS8(JAVA适用)和 1024 长度。

保留好生成公钥和私钥,这是一对,切记对应好。

2. 支付宝配置

登录企业支付宝,通过下图入口,进入秘钥配置。

进入开放平台秘钥配置界面。

如果第一次配置,应该看到的是 配置应用公钥 ,在此配置上面生成的公钥信息。

配置后,可以查看支付宝公钥。

3. 平台配置

从支付通道-子账户进入配置,支付通道配置如下图:

配置说明:

渠道商户ID:配置支付宝账号,如邮箱地址
合作伙伴身份(PID):在支付宝mapi网关产品密钥下,可查看
应用App ID:在开放平台秘钥下,可查看
应用私钥:第一步中生成的私钥信息
支付宝公钥:第二步中从支付宝获取的公钥信息
网关地址:支付宝 - 网上支付 安全快速!

6. 系统运维

该文档适合技术人员或运维人员阅读,这里会介绍一些生产系统问题的排查与解决方法,本文档也会根据客户反馈的问题不断更新。

项目启动

如果是按照部署文档安装的系统,那么会创建一个kdpay用户。

登录kdpay用户,然后进入到/home/kdpay目录下,按如下启动:

  1. 启动zookeeper,进入zookeeper-3.4.6目录下。
    启动:./bin/zkServer.sh start
    查看:./bin/zkServer.sh status
  2. 启动activemq,进入apache-activemq-5.11.1目录下。
    启动:./bin/activemq start
    查看:./bin/activemq status

进入到/home/xxpay/service目录下,部署后的项目如下:

按如下顺序启动服务:

  1. 启动service,进入xxpay-service-1.0.0目录下。
    启动:./bin/service.sh start
    重启:./bin/service.sh restart
    查看:./bin/service.sh status
    日志:tail -f ./log/xxpay-service.log
  2. 启动pay,进入xxpay-pay-1.0.0目录下。
    启动:./bin/pay.sh start
    重启:./bin/pay.sh restart
    查看:./bin/pay.sh status
    日志:tail -f ./log/xxpay-pay.log
  3. 启动agent,进入xxpay-agent-1.0.0目录下。
    启动:./bin/agent.sh start
    重启:./bin/agent.sh restart
    查看:./bin/agent.sh status
    日志:tail -f ./log/xxpay-agent.log
  4. 启动manage,进入xxpay-manage-1.0.0目录下。
    启动:./bin/manage.sh start
    重启:./bin/manage.sh restart
    查看:./bin/manage.sh status
    日志:tail -f ./log/xxpay-manage.log
  5. 启动merchant,进入xxpay-merchant-1.0.0目录下。
    启动:./bin/merchant.sh start
    重启:./bin/merchant.sh restart
    查看:./bin/merchant.sh status
    日志:tail -f ./log/xxpay-merchant.log
  6. 启动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. 系统业务

介绍XxPay聚合支付系统的一些架构,业务流程等。

1. 账户说明

账户余额: 作为收款账户,包括可结算金额和带结算金额

不可用余额: 指的是当前收款账户中不可用的金额,如正在提现中的金额都是不可用余额

可结算金额: 收款账户已经结算的金额,已结算的金额可提现

保证金: 指商户开户费账户

冻结金额: 收款账户的冻结金额,冻结的金额不可提现

代付余额: 作为代付账户,商户通过在线充值通道充值的金额会转入该账户(实时到账),发起代付会扣减该账户

不可用代付余额: 指的是当前代付账户中不可用的金额,如正在代付处理中的金额都是不可用代付余额

系统流程初体验

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。

如请求支付系统参数如下:

  1.     Map signMap = new HashMap<>();
  2.     signMap.put("userId", "test01");
  3.     signMap.put("type", "wechat");
  4.     signMap.put("money", Double.valueOf(2));
  5.     signMap.put("remark", "");
  6.     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)

pay.org - 该网站正在出售! - pay 资源和信息。

支付结果回调URL

支付结果后台回调URL

notifyUrl

String(128)

pay.org - 该网站正在出售! - pay 资源和信息。

支付结果回调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)

签名失败

返回信息,如非空,为错误原因 签名失败 参数格式校验错误

以下字段在retCode为SUCCESS的时候有返回

字段名

变量名

必填

类型

示例值

描述

签名

sign

String(32)

C380BEC2BFD727A4B6845133519F3AD6

签名值,详见签名算法

支付订单号

payOrderId

String(32)

20160427210604000490

支付中心生成的订单号

支付参数

payParams

JSONObject

该字段返回JSON格式数据,多指调起第三方支付所需传递参数

(1)当请求参数productId=8004(微信公众号支付)时,返回的JSON格式数据如下:

  1. {
  2.     "sign": "24F5916D6B1AB64918B3BF7250693813",
  3.     "payOrderId": "P2016081612553098759124940",
  4.     "retCode": "SUCCESS",
  5.     "retMsg": "",
  6.     "payParams": {
  7.         "prepayId": "wx201608161255321fc59e085b0578219742",
  8.         "appId": "wx0ab67caf7f591834", 
  9.         "timeStamp": 1471323332, 
  10.         "signType": "MD5", 
  11.         "package": "prepay_id=wx201608161255321fc59e085b0578219742", 
  12.         "nonceStr": "08s06nujam43aot3tbl555lavvydl178", 
  13.         "paySign": "21E6BF4984030DBD2DB191F676A47DA2"
  14.     }
  15. }

字段名

变量名

必填

类型

示例值

描述

预下单号

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格式数据如下:

  1. {
  2.     "sign": "3424ED83034B20CF17961720FE272A94", 
  3.     "payOrderId": "pay2016081613050939023127932", 
  4.     "retCode": "SUCCESS", 
  5.     "retMsg": "",
  6.     "payParams": {
  7.         "prepayId": "wx201608161255321fc59e085b0578219742",
  8.         "codeUrl": "weixin://wxpay/bizpayurl?pr=sHYHnns",
  9.         "codeImgUrl": "http://wxpay/bizpayurl?pr=sHYHnns"
  10.     }
  11. }

字段名

变量名

必填

类型

示例值

描述

预下单号

prepayId

String

wx201608161255321fc59e085b0578219742

微信预下单号

二维码链接

codeUrl

String

weixin://wxpay/s/Anp43md

可将该参数值生产二维码展示

二维码图片链接

codeImgUrl

String

(3)当请求参数productId=8007(支付宝H5支付),返回的JSON格式数据如下:

  1. {
  2.   "payOrderId": "P0020180114172136000000",
  3.   "sign": "A1F39B0D7BD15E7A7BB6B99762302C51",
  4.   "payParams": {
  5.     "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=\"{&quot;body&quot;:&quot;XXPAY支付测试&quot;,&quot;out_trade_no&quot;:&quot;P0020180114172136000000&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_PAY&quot;,&quot;subject&quot;:&quot;XXPAY支付测试&quot;,&quot;total_amount&quot;:&quot;0.01&quot;}\">\n<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n</form>\n<script>document.forms[0].submit();</script>"
  6.   },
  7.   "retCode": "SUCCESS"
  8. }

字段名

变量名

必填

类型

示例值

描述

支付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)

justhappy@126.com

渠道测支付时使用的用户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)

pay.org - 该网站正在出售! - pay 资源和信息。

支付结果回调URL

支付结果后台回调URL

notifyUrl

String(128)

pay.org - 该网站正在出售! - pay 资源和信息。

支付结果回调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格式数据如下:

  1. {
  2.   "sign": "5AAD2B9513ADE7E0C76A4BC99E1A92F0",
  3.   "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",
  4.   "retCode": "SUCCESS"
  5. }

9.0 编码表

1. 支付产品

产品ID

产品名称

支付类型

8000

网银支付

网银支付

8001

快捷支付

快捷支付

8002

微信扫码支付

微信扫码支付

8003

微信H5支付

微信H5支付

8004

微信公众号支付

微信公众号支付

8005

微信小程序支付

微信小程序支付

8006

支付宝扫码支付

支付宝扫码支付

8007

支付宝H5支付

支付宝H5支付

8008

支付宝服务窗支付

支付宝服务窗支付

8009

QQ钱包扫码

QQ钱包扫码

8010

QQ钱包H5支付

QQ钱包H5支付

8011

京东扫码支付

京东扫码支付

8012

京东H5支付

京东H5支付

8013

百度钱包

百度钱包

8014

银联二维码

银联二维码

2. 错误码

错误码值

描述

原因

解决方案

0010

系统错误

系统超时或异常

系统异常,请用相同参数重新调用

邮件交流:yujianmail@foxmail.com

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 招商银行的聚合支付是一种电子支付方式,它集成了多种支付方式,使用户可以通过一个统一的接口进行支付。要对接招商银行的聚合支付,你需要做以下几件事: 1. 注册招商银行商户:首先,你需要向招商银行申请开通聚合支付功能。注册商户时,你需要提供相关资料,包括营业执照、组织机构代码证书等。 2. 申请开通聚合支付接口:招商银行聚合支付接口分为两种,分别是支付宝和微信支付接口。你可以根据自己的需要申请开通一种或两种接口。 3. 获取接口文档:招商银行提供了详细的接口文档,包括接口地址、请求参数、返回结果等信息。你需要获取并仔细阅读文档,了解接口的使用方法。 4. 开发对接程序:根据文档内容,你需要开发能够调用招商银行聚合支付接口的程序。这可能需要使用相应的编程语言,例如 Java、PHP 等。 5. 测试对接 ### 回答2: 招行聚合支付是招商银行推出的一种在线支付解决方案,商户可以通过对接招行聚合支付来实现接受各种支付渠道的收款。具体对接步骤如下: 首先,商户需要向招行开通线上业务的机构申请商户号,并完成相关的合作协议签订和信息提交。 其次,商户需要在自己的网站或APP上集成招行聚合支付的接口,可以选择使用招行提供的SDK开发工具进行集成。接口包括支付请求、支付结果通知、退款请求等。 然后,商户根据招行提供的接口文档和技术支持进行代码编写和调试。对接过程中,可以根据具体需求选择不同的支付方式和接口参数设置。 接下来,商户需要根据招行的要求进行应用、产品和商户的认证和审核。招行会对商户的身份、业务模式和风险进行评估,并对符合要求的商户提供相应的权限和服务。 最后,在测试通过后,商户可以正式上线招行聚合支付,并开始接受各种支付方式的订单支付。商户可以通过招行提供的商户后台管理系统进行订单查询、统计和资金结算等操作。 总的来说,招行聚合支付对接流程相对简单,商户需要开通商户号、对接支付接口、通过审核和认证,最终上线使用。招行也提供了完善的技术支持和管理工具,方便商户的日常使用和管理。 ### 回答3: 招行聚合支付是指招商银行提供的一种支付方式,通过对接招行聚合支付,可以在商户的线上平台上实现多种支付方式的集成,包括银行卡支付、微信支付、支付宝等。下面是对接招行聚合支付的大致步骤: 1. 注册开通招行商户:作为商户,首先需要在招行官方网站上注册并开通商户账号。注册时需要提供相关的商户信息和资料,如企业信息、营业执照等。 2. 签署协议及技术对接:与招行进行商户协议签署,并了解招行提供的对接文档和技术要求。具体对接方式可根据商户的需求和技术实力选择,一般常用的包括API接口对接和HTML5页面对接。 3. 开发对接接口:根据招行提供的对接文档,商户可以根据自身需求开发相应的接口,包括支付、退款、查询订单等功能。 4. 提交测试并调试:完成接口的开发后,商户需要将相关接口提交给招行进行测试,并进行调试和修复可能存在的问题,确保接口的稳定性和安全性。 5. 上线应用:在测试通过后,商户可以正式上线应用,并进行系统集成和功能调试,在商户线上平台上展示并使用招行聚合支付。 需要注意的是,招行聚合支付对接过程中,商户可能还需要进行相应的安全认证和合规审核,以确保交易的安全性和合法性。同时,商户还需要与招行保持良好的沟通,及时解决可能出现的问题,保证支付服务的顺利进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值