diff --git a/jeepay-payment/pom.xml b/jeepay-payment/pom.xml index d36c415..2e2c44f 100644 --- a/jeepay-payment/pom.xml +++ b/jeepay-payment/pom.xml @@ -130,6 +130,11 @@ pls-1.3.0 + + + com.github.xiaoymin + knife4j-openapi2-spring-boot-starter + diff --git a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/config/SwaggerConfiguration.java b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/config/SwaggerConfiguration.java new file mode 100644 index 0000000..3495ee5 --- /dev/null +++ b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/config/SwaggerConfiguration.java @@ -0,0 +1,42 @@ +package com.jeequan.jeepay.pay.config; + +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +/** + * knife4j 自定义文档配置 + * API访问地址: http://localhost:9216/doc.html + * @author yr + */ +@Configuration +@EnableSwagger2WebMvc +public class SwaggerConfiguration { + + private final OpenApiExtensionResolver openApiExtensionResolver; + + @Autowired + public SwaggerConfiguration(OpenApiExtensionResolver openApiExtensionResolver) { + this.openApiExtensionResolver = openApiExtensionResolver; + } + + @Bean(value = "defaultApi") + public Docket defaultApi() { + String groupName = "支付网关"; + Docket docket = new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder().version("1.0").build()) //描述字段支持Markdown语法 + .groupName(groupName) + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .build() + .extensions(openApiExtensionResolver.buildExtensions(groupName)); + return docket; + } +} diff --git a/jeepay-payment/src/main/resources/application.yml b/jeepay-payment/src/main/resources/application.yml index 68564a0..ea8dcd5 100644 --- a/jeepay-payment/src/main/resources/application.yml +++ b/jeepay-payment/src/main/resources/application.yml @@ -4,3 +4,12 @@ server: spring: redis: database: 3 #1库:运营平台 #2库:商户系统 #3库:支付网关 + +# knife4j APIDOC文档 +knife4j: + enable: true + documents: + - group: 支付网关 + name: 接口文档 + # 某一个文件夹下所有的.md文件 + locations: classpath:markdown/doc/* \ No newline at end of file diff --git a/jeepay-payment/src/main/resources/markdown/doc/api1.md b/jeepay-payment/src/main/resources/markdown/doc/api1.md new file mode 100644 index 0000000..b19f4e0 --- /dev/null +++ b/jeepay-payment/src/main/resources/markdown/doc/api1.md @@ -0,0 +1,48 @@ +[TOC] + +## 协议规则 +传输方式:采用HTTP传输(生产环境建议HTTPS) +提交方式:`POST` 或 `GET` +内容类型:`application/json` +字符编码:`UTF-8` +签名算法:`MD5` + +## 参数规范 +交易金额:默认为人民币交易,单位为分,参数值不能带小数。 +时间参数:所有涉及时间参数均使用精确到毫秒的13位数值,如:1622016572190。时间戳具体是指从格林尼治时间1970年01月01日00时00分00秒起至现在的毫秒数。 + +## 签名算法 +`签名生成的通用步骤如下` + +***第一步:*** 设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 +特别注意以下重要规则: +◆ 参数名ASCII码从小到大排序(字典序); +◆ 如果参数的值为空不参与签名; +◆ 参数名区分大小写; +◆ 验证调用返回或支付中心主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 +◆ 支付中心接口可能增加字段,验证签名时必须支持增加的扩展字段 + +***第二步:*** 在stringA最后拼接上key`[即 StringA +"&key=" + 私钥 ]` 得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 + +如请求支付系统参数如下: +```java +Map signMap = new HashMap<>(); +signMap.put("platId", "1000"); +signMap.put("mchOrderNo", "P0123456789101"); +signMap.put("amount", "10000"); +signMap.put("clientIp", "192.168.0.111"); +signMap.put("returnUrl", "https://www.baidu.com"); +signMap.put("notifyUrl", "https://www.baidu.com"); +signMap.put("reqTime", "20190723141000"); +signMap.put("version", "1.0"); +``` +`待签名值`: +amount=10000&clientIp=192.168.0.111&mchOrderNo=P0123456789101&notifyUrl=https://www.baidu.com&platId=1000&reqTime=20190723141000&returnUrl=https://www.baidu.com&version=1.0&key=EWEFD123RGSRETYDFNGFGFGSHDFGH + +`签名结果`:4A5078DABBCE0D9C4E7668DACB96FF7A + +`最终请求支付系统参数`:amount=10000&clientIp=192.168.0.111&mchOrderNo=P0123456789101&notifyUrl=https://www.baidu.com&platId=1000&reqTime=20190723141000&returnUrl=https://www.baidu.com&version=1.0&sign=4A5078DABBCE0D9C4E7668DACB96FF7A + +> 运营管理平台可以管理商户的私钥 + +`提示:`签名以及接口调用,请使用jeepay官方提供的sdk:https://gitee.com/jeequan/jeepay-sdk-java \ No newline at end of file diff --git a/jeepay-payment/src/main/resources/markdown/doc/api2.md b/jeepay-payment/src/main/resources/markdown/doc/api2.md new file mode 100644 index 0000000..996ea46 --- /dev/null +++ b/jeepay-payment/src/main/resources/markdown/doc/api2.md @@ -0,0 +1,453 @@ +[TOC] + +## 统一下单 + +商户业务系统通过统一下单接口发起支付收款订单,Jeepay支付网关会根据商户配置的支付通道路由支付通道完成支付下单。支付网关根据不同的支付方式返回对应的支付参数,业务系统使用支付参数发起收款。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/pay/unifiedOrder + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号 +支付方式 | wayCode | 是 | String(30) | WX_LITE | 支付方式,如微信小程序WX_LITE +支付金额 | amount | 是 | int | 100 | 支付金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IPV4地址 +商品标题 | subject | 是 | String(64) | Jeepay商品标题测试 | 商品标题 +商品描述 | body | 是 | String(256) | Jeepay商品描述测试 | 商品描述 +异步通知地址 | notifyUrl | 否 | String(128) | https://www.jeequan.com/notify.htm | 支付结果异步回调URL,只有传了该值才会发起回调 +跳转通知地址 | returnUrl | 否 | String(128) | https://www.jeequan.com/return.htm | 支付结果同步跳转通知URL +失效时间 | expiredTime | 否 | int | 3600 | 订单失效时间,单位秒,默认2小时.订单在(创建时间+失效时间)后失效 +渠道参数 | channelExtra | 否 | String(256 | {"auth_code", "13920933111042"} | 特定渠道发起的额外参数,json格式字符串.详见渠道参数说明 +分账模式 | divisionMode | 否 | int | 0 | 分账模式: 0-该笔订单不允许分账[默认], 1-支付成功按配置自动完成分账, 2-商户手动分账(解冻商户金额) +扩展参数 | extParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + + +`请求示例数据` + +```json +{ + "amount": 8, + "extParam": "", + "mchOrderNo": "mho1624005107281", + "subject": "商品标题", + "wayCode": "ALI_BAR", + "sign": "84F606FA25A6EC4783BECC08D4FDC681", + "reqTime": "1624005107", + "body": "商品描述", + "version": "1.0", + "channelExtra": "{\"authCode\":\"280812820366966512\"}", + "appId": "60cc09bce4b0f1c0b83761c9", + "clientIp": "192.166.1.132", + "notifyUrl": "https://www.jeequan.com", + "signType": "MD5", + "currency": "cny", + "returnUrl": "", + "mchNo": "M1623984572", + "divisionMode": 1 +} +``` + +> 返回参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +支付订单号 | payOrderId | 是 | String(30) | U12021022311124442600 | 返回支付系统订单号 +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 返回商户传入的订单号 +订单状态 | orderState | 是 | int | 2 | 支付订单状态
0-订单生成
1-支付中
2-支付成功
3-支付失败
4-已撤销
5-已退款
6-订单关闭 +支付数据类型 | payDataType | 是 | String | payUrl | 支付参数类型
payUrl-跳转链接的方式
form-表单方式
wxapp-微信支付参数(微信公众号,小程序,app支付时)
aliapp-支付宝app支付参数
ysfapp-云闪付app支付参数
codeUrl-二维码地址
codeImgUrl-二维码图片地址
none-空支付参数 +支付数据 | payData | 否 | String | http://www.jeequan.com/pay.html | 发起支付用到的支付参数,如果微信公众号支付等 +渠道错误码 | errCode | 否 | String | ACQ.PAYMENT_AUTH_CODE_INVALID | 上游渠道返回的错误码 +渠道错误描述 | errMsg | 否 | String | Business Failed 失败 | 上游渠道返回的错误描述 + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "errCode": "ACQ.PAYMENT_AUTH_CODE_INVALID", + "errMsg": "Business Failed【支付失败,获取顾客账户信息失败,请顾客刷新付款码后重新收款,如再次收款失败,请联系管理员处理。[SOUNDWAVE_PARSER_FAIL]】", + "mchOrderNo": "mho1624005752661", + "orderState": 3, + "payOrderId": "P202106181642329900002" + }, + "msg": "SUCCESS", + "sign": "F4DA202C516D1F33A12F1E547C5004FD" +} +``` + +> 支付方式 + +WayCode | 支付方式 +------- | ------- +QR_CASHIER | 聚合扫码(用户扫商家) +AUTO_BAR | 聚合条码(商家扫用户) +ALI_BAR | 支付宝条码 +ALI_JSAPI | 支付宝生活号 +ALI_APP | 支付宝APP +ALI_WAP | 支付宝WAP +ALI_PC | 支付宝PC网站 +ALI_QR | 支付宝二维码 +WX_BAR | 微信条码 +WX_JSAPI | 微信公众号 +WX_LITE | 微信小程序 +WX_APP | 微信APP +WX_H5 | 微信H5 +WX_NATIVE | 微信扫码 +YSF_BAR | 云闪付条码 +YSF_JSAPI | 云闪付jsapi + +> channelExtra参数说明 + +当 `wayCode=AUTO_BAR` 或 `wayCode=ALI_BAR` 或 `wayCode=WX_BAR` 或 `wayCode=YSF_BAR` 时,channelExtra必须传auth_code,为用户的付款码值,channelExtra示例数据如: +```json +{"auth_code": "13920933111042"} +``` + +当 `wayCode=ALI_JSAPI` 时,channelExtra必须传buyerUserId,为支付宝用户ID,channelExtra示例数据如: +```json +{"buyerUserId": "2088702585070844"} +``` + +当 `wayCode=WX_JSAPI` 或 `wayCode=WX_LITE` 时,channelExtra必须传openid,channelExtra示例数据如: +```json +{"openid": "o6BcIwvSiRpfS8e_UyfQNrYuk2LI"} +``` + +当 `wayCode=QR_CASHIER` 或 `wayCode=ALI_QR` 或 `wayCode=WX_NATIVE` 时,channelExtra可以传payDataType设置返回支付数据支付类型。此时payDataType可以为:codeUrl-二维码地址,codeImgUrl-二维码图片地址,不传payDataType默认返回codeUrl类型, channelExtra示例数据如: +```json +{"payDataType": "codeImgUrl"} +``` + +当 `wayCode=ALI_WAP` 时,channelExtra可以传payDataType设置返回支付数据支付类型。此时payDataType可以为:form-返回自动跳转的支付表单,codeImgUrl-返回一个二维码图片URL,payUrl-返回支付链接,不传payDataType默认返回payUrl类型, channelExtra示例数据如: +```json +{"payDataType": "form"} +``` + +当 `wayCode=ALI_PC` 时,channelExtra可以传payDataType设置返回支付数据支付类型。此时payDataType可以为:form-返回自动跳转的支付表单,payUrl-返回支付链接,不传payDataType默认返回payUrl类型, channelExtra示例数据如: +```json +{"payDataType": "form"} +``` + + +## 查询订单 + +商户通过该接口查询订单,支付网关会返回订单最新的数据 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/pay/query + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +支付订单号 | payOrderId | 是 | String(30) | P20160427210604000490 | 支付中心生成的订单号,与mchOrderNo二者传一即可 +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号,与payOrderId二者传一即可 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + +`请求示例数据` + +```json +{ + "payOrderId": "P202106181104177050002", + "appId": "60cc09bce4b0f1c0b83761c9", + "sign": "46940C58B2F3AE426B77A297ABF4D31E", + "signType": "MD5", + "reqTime": "1624006009", + "mchNo": "M1623984572", + "version": "1.0" +} +``` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +支付订单号 | payOrderId | 是 | String(30) | P12021022311124442600 | 返回支付系统订单号 +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 返回商户传入的订单号 +支付接口 | ifCode | 是 | String(30) | wxpay | 支付接口编码 +支付方式 | wayCode | 是 | String(30) | WX_LITE | 支付方式,如微信小程序WX_LITE +支付金额 | amount | 是 | int | 100 | 支付金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +订单状态 | state | 是 | int | 2 | 支付订单状态
0-订单生成
1-支付中
2-支付成功
3-支付失败
4-已撤销
5-已退款
6-订单关闭 +客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IPV4地址 +商品标题 | subject | 是 | String(64) | Jeepay商品标题测试 | 商品标题 +商品描述 | body | 是 | String(256) | Jeepay商品描述测试 | 商品描述 +渠道订单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的订单号 +渠道错误码 | errCode | 否 | String | 1002 | 渠道下单返回错误码 +渠道错误描述 | errMsg | 否 | String | 业务异常错误 | 渠道下单返回错误描述 +扩展参数 | extParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +创建时间 | createdAt | 是 | long | 1622016572190 | 订单创建时间,13位时间戳 +成功时间 | successTime | 否 | long | 1622016572190 | 订单支付成功时间,13位时间戳 + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "amount": 58, + "appId": "60cc09bce4b0f1c0b83761c9", + "body": "商品描述", + "channelOrderNo": "2021061822001423031419593035", + "clientIp": "192.166.1.132", + "createdAt": 1623985457705, + "currency": "cny", + "extParam": "", + "ifCode": "alipay", + "mchNo": "M1623984572", + "mchOrderNo": "mho1623985457320", + "payOrderId": "P202106181104177050002", + "state": 2, + "subject": "商品标题", + "successTime": 1623985459000, + "wayCode": "ALI_BAR" + }, + "msg": "SUCCESS", + "sign": "9548145EA12D0CD8C1628BCF44E19E0D" +} +``` + +## 关闭订单 + +商户通过该接口关闭订单,支付网关会对订单完成关闭处理。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/pay/close + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +支付订单号 | payOrderId | 是 | String(30) | P20160427210604000490 | 支付中心生成的订单号,与mchOrderNo二者传一即可 +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的订单号,与payOrderId二者传一即可 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + +`请求示例数据` + +```json +{ + "payOrderId": "P202106181104177050002", + "appId": "60cc09bce4b0f1c0b83761c9", + "sign": "46940C58B2F3AE426B77A297ABF4D31E", + "signType": "MD5", + "reqTime": "1624006009", + "mchNo": "M1623984572", + "version": "1.0" +} +``` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +渠道错误码 | errCode | 否 | String | 1002 | 渠道关单返回错误码 +渠道错误描述 | errMsg | 否 | String | 关闭异常 | 渠道关单返回错误描述 + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "errCode": '', + "errMsg": '' + }, + "msg": "SUCCESS", + "sign": "9548145EA12D0CD8C1628BCF44E19E0D" +} +``` + +## 支付通知 + +当订单支付成功时,支付网关会向商户系统发起回调通知。如果商户系统没有正确返回,支付网关会延迟再次通知。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:该链接是通过统一下单接口提交的参数notifyUrl设置,如果无法访问链接,商户系统将无法接收到支付中心的通知。 + +请求方式:`POST` + +请求类型:`application/x-www-form-urlencoded` + +> 通知参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +支付订单号 | payOrderId | 是 | String(30) | P12021022311124442600 | 返回支付系统订单号 +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 返回商户传入的订单号 +支付接口 | ifCode | 是 | String(30) | wxpay | 支付接口编码 +支付方式 | wayCode | 是 | String(30) | WX_LITE | 支付方式,微信小程序WX_LITE +支付金额 | amount | 是 | int | 100 | 支付金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +订单状态 | state | 是 | int | 2 | 支付订单状态
0-订单生成
1-支付中
2-支付成功
3-支付失败
4-已撤销
5-已退款
6-订单关闭 +客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IPV4地址 +商品标题 | subject | 是 | String(64) | Jeepay商品标题测试 | 商品标题 +商品描述 | body | 是 | String(256) | Jeepay商品描述测试 | 商品描述 +渠道订单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的订单号 +渠道错误码 | errCode | 否 | String | 1002 | 渠道下单返回错误码 +渠道错误描述 | errMsg | 否 | String | 134586944573118714 | 渠道下单返回错误描述 +扩展参数 | extParam | 否 | String(512) | 134586944573118714 | 商户扩展参数 +创建时间 | createdAt | 是 | long | 1622016572190 | 订单创建时间,13位时间戳 +成功时间 | successTime | 否 | long | 1622016572190 | 订单支付成功时间,13位时间戳 +通知请求时间 | reqTime | 是 | String(30) | 1622016572190 | 通知请求时间,,13位时间戳 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 + +> 返回结果 + +业务系统处理后同步返回给支付中心,返回字符串 success 则表示成功,返回非success则表示处理失败,支付中心会再次通知业务系统。(通知频率为0/30/60/90/120/150,单位:秒) + +`注意:返回的字符串必须是小写,且前后不能有空格和换行符。` + +`通知示例数据` + +```json +{ + "amount": 5, + "body": "商品描述", + "clientIp": "192.166.1.132", + "createdAt": "1622016572190", + "currency": "cny", + "extParam": "", + "ifCode": "wxpay", + "mchNo": "M1621873433953", + "appId": "60cc09bce4b0f1c0b83761c9", + "mchOrderNo": "mho1621934803068", + "payOrderId": "20210525172643357010", + "state": 3, + "subject": "商品标题", + "wayCode": "WX_BAR", + "sign": "C380BEC2BFD727A4B6845133519F3AD6" +} +``` + +## 获取渠道用户ID + +商户通过该接口获取渠道的用户ID,如微信的openID,支付宝的userId。该接口通过跳转获取到用户ID后,会跳转到商户上传的redirectUrl地址,并传递用户ID参数 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/channelUserId/jump + +请求方式:`GET` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +支付接口 | ifCode | 是 | String(30) | AUTO | 目前只支持传 AUTO +跳转地址 | redirectUrl | 是 | String | https://www.jeequan.com | 获取到用户ID后,会携带用户ID参数跳转到该地址 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + +`请求示例数据` + +```json +{ + "mchNo": "M1621873433953", + "appId": "60cc09bce4b0f1c0b83761c9", + "ifCode": "wxpay", + "redirectUrl": "https://www.jeequan.com", + "sign": "A5C93D50743126ED91AA6ED96CDEEEF8", + "signType": "MD5", + "reqTime": "1622011236571", + "version": "1.0" +} +``` + +`当获取到渠道用户ID后,会301重定向到跳转地址,传递参数如下` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +渠道用户ID | channelUserId | 是 | String | o6BcIwvSiRpfS8e_UyfQNrYuk2LI | 渠道用户ID,微信openId或支付宝userId + +`完整跳转URL示例` + +```html +https://www.jeequan.com/toU?channelUserId=o6BcIwvSiRpfS8e_UyfQNrYuk2LI +``` + +## 返回码 + +code | 描述 +------- | ------- +0 | 成功 +9999 | 异常,具体错误详见msg字段 \ No newline at end of file diff --git a/jeepay-payment/src/main/resources/markdown/doc/api3.md b/jeepay-payment/src/main/resources/markdown/doc/api3.md new file mode 100644 index 0000000..4e32a74 --- /dev/null +++ b/jeepay-payment/src/main/resources/markdown/doc/api3.md @@ -0,0 +1,253 @@ +[TOC] + +## 统一退款 + +商户业务系统通过统一退款接口发起退款请求,Jeepay支付网关会根据商户发起的支付订单号,找到对应到支付通道发起退款。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/refund/refundOrder + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +支付订单号 | payOrderId | 是 | String(30) | P20160427210604000490 | 支付中心生成的订单号,与mchOrderNo二者传一即可 +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的支付订单号,与payOrderId二者传一即可 +商户退款单号 | mchRefundNo | 是 | String(30) | M27210632100491 | 商户生成的退款单号 +退款金额 | refundAmount | 是 | int | 100 | 退款金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +退款原因 | refundReason | 是 | String(64) | 用户退货 | 退款原因 +客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IPV4地址 +异步通知地址 | notifyUrl | 否 | String(128) | https://www.jeequan.com/notify.htm | 退款完成后回调该URL,只有传了该值才会发起回调 +渠道参数 | channelExtra | 否 | String(256 | {"auth_code", "13920933111042"} | 特定渠道发起的额外参数,json格式字符串.详见渠道参数说明 +扩展参数 | extraParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + + +`请求示例数据` + +```json +{ + "payOrderId": "P202106181104177050002", + "extParam": "", + "mchOrderNo": "", + "refundReason": "退款测试", + "sign": "2762CDB48D5179281DB6C0995E4EEDE0", + "reqTime": "1624007315", + "version": "1.0", + "channelExtra": "", + "appId": "60cc09bce4b0f1c0b83761c9", + "mchRefundNo": "mho1624007315478", + "clientIp": "192.166.1.132", + "notifyUrl": "https://www.jeequan.com", + "signType": "MD5", + "currency": "cny", + "mchNo": "M1623984572", + "refundAmount": 4 +} +``` + +> 返回参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +退款订单号 | refundOrderId | 是 | String(30) | R202106181708358940000 | 返回退款订单号 +商户退款单号 | mchRefundNo | 是 | String(30) | mho1624007315478 | 返回商户传入的退款单号 +退款状态 | state | 是 | int | 2 | 退款状态
0-订单生成
1-退款中
2-退款成功
3-退款失败
4-退款关闭 +渠道退款单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的退款单号 +渠道错误码 | errCode | 否 | String | ACQ.PAYMENT_AUTH_CODE_INVALID | 上游渠道返回的错误码 +渠道错误描述 | errMsg | 否 | String | Business Failed 失败 | 上游渠道返回的错误描述 + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "channelOrderNo": "2021061822001423031419593035", + "mchRefundNo": "mho1624007315478", + "payAmount": 58, + "refundAmount": 4, + "refundOrderId": "R202106181708358940000", + "state": 2 + }, + "msg": "SUCCESS", + "sign": "2843B811B7A75D56B7D1950362820875" +} +``` + +## 查询订单 + +商户通过该接口查询退款订单,支付网关会返回订单最新的数据 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/refund/query + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +退款订单号 | refundOrderId | 是 | String(30) | R20160427210604000490 | 支付中心生成的退款单号,与mchRefundNo二者传一即可 +商户退款单号 | mchRefundNo | 是 | String(30) | 20160427210604000490 | 商户生成的退款单号,与refundOrderId二者传一即可 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + +`请求示例数据` + +```json +{ + "refundOrderId": "P202106181105527690009", + "appId": "60cc09bce4b0f1c0b83761c9", + "sign": "1484293FCAEAFE11DEC8949DB6B525A9", + "signType": "MD5", + "reqTime": "1624008199", + "mchNo": "M1623984572", + "version": "1.0" +} +``` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +退款订单号 | refundOrderId | 是 | String(30) | R20160427210604000490 | 支付中心生成的退款单号 +支付订单号 | payOrderId | 是 | String(30) | P12021022311124442600 | 返回支付系统订单号 +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户退款单号 | mchRefundNo | 是 | String(30) | 20160427210604000490 | 商户生成的退款单号 +支付金额 | payAmount | 是 | int | 100 | 支付金额,单位分 +退款金额 | refundAmount | 是 | int | 100 | 退款金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +退款状态 | state | 是 | int | 2 | 退款状态
0-订单生成
1-退款中
2-退款成功
3-退款失败
4-退款关闭 +渠道订单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的订单号 +渠道错误码 | errCode | 否 | String | 1002 | 渠道返回错误码 +渠道错误描述 | errMsg | 否 | String | 134586944573118714 | 渠道返回错误描述 +扩展参数 | extraParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +创建时间 | createdAt | 是 | long | 1622016572190 | 订单创建时间,13位时间戳 +成功时间 | successTime | 否 | long | 1622016572190 | 订单支付成功时间,13位时间戳 + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "appId": "60cc09bce4b0f1c0b83761c9", + "channelOrderNo": "2021061822001423031419593035", + "createdAt": 1623985552769, + "currency": "cny", + "extParam": "", + "mchNo": "M1623984572", + "mchRefundNo": "mho1623985552430", + "payAmount": 58, + "payOrderId": "P202106181104177050002", + "refundAmount": 4, + "refundOrderId": "P202106181105527690009", + "state": 2, + "successTime": 1623985554000 + }, + "msg": "SUCCESS", + "sign": "E3F9F008FC5EF84BD782CCC7BE69DC5E" +} +``` + +## 退款通知 + +当退款完成时(成功或失败),支付网关会向商户系统发起回调通知。如果商户系统没有正确返回,支付网关会延迟再次通知。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:该链接是通过统一退款接口提交的参数notifyUrl设置,如果无法访问链接,商户系统将无法接收到支付中心的通知。 + +请求方式:`POST` + +请求类型:`application/x-www-form-urlencoded` + +> 通知参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +退款订单号 | refundOrderId | 是 | String(30) | R20160427210604000490 | 支付中心生成的退款单号 +支付订单号 | payOrderId | 是 | String(30) | P12021022311124442600 | 返回支付系统订单号 +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户退款单号 | mchRefundNo | 是 | String(30) | 20160427210604000490 | 商户生成的退款单号 +支付金额 | payAmount | 是 | int | 100 | 支付金额,单位分 +退款金额 | refundAmount | 是 | int | 100 | 退款金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +退款状态 | state | 是 | int | 2 | 退款状态
0-订单生成
1-退款中
2-退款成功
3-退款失败
4-退款关闭 +渠道订单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的订单号 +渠道错误码 | errCode | 否 | String | 1002 | 渠道返回错误码 +渠道错误描述 | errMsg | 否 | String | 134586944573118714 | 渠道返回错误描述 +扩展参数 | extraParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +创建时间 | createdAt | 是 | long | 1622016572190 | 订单创建时间,13位时间戳 +成功时间 | successTime | 否 | long | 1622016572190 | 订单支付成功时间,13位时间戳 +通知请求时间 | reqTime | 是 | String(30) | 1622016572190 | 通知请求时间,,13位时间戳 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 + +> 返回结果 + +业务系统处理后同步返回给支付中心,返回字符串 success 则表示成功,返回非success则表示处理失败,支付中心会再次通知业务系统。(通知频率为0/30/60/90/120/150,单位:秒) + +`注意:返回的字符串必须是小写,且前后不能有空格和换行符。` + +`通知示例数据` + +```json +{ + "appId": "60cc09bce4b0f1c0b83761c9", + "channelOrderNo": "2021061822001423031419593035", + "createdAt": 1623985552769, + "currency": "cny", + "extParam": "", + "mchNo": "M1623984572", + "mchRefundNo": "mho1623985552430", + "payAmount": 58, + "payOrderId": "P202106181104177050002", + "refundAmount": 4, + "refundOrderId": "P202106181105527690009", + "state": 2, + "successTime": 1623985554000 +} +``` \ No newline at end of file diff --git a/jeepay-payment/src/main/resources/markdown/doc/api4.md b/jeepay-payment/src/main/resources/markdown/doc/api4.md new file mode 100644 index 0000000..24d7d51 --- /dev/null +++ b/jeepay-payment/src/main/resources/markdown/doc/api4.md @@ -0,0 +1,263 @@ +[TOC] + +## 发起转账 + +商户业务系统通过转账接口发起转账申请,Jeepay支付网关将根据请求数据传入到对应的上游接口。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/transferOrder + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的转账订单号 +接口代码 | ifCode | 是 | String(10) | wxpay | wxpay-微信官方接口 ; alipay-支付宝官方接口 +入账方式 | entryType | 是 | String(20) | 20160427210604000490 | 入账方式: WX_CASH-微信零钱; ALIPAY_CASH-支付宝转账; BANK_CARD-银行卡 +转账金额 | amount | 是 | int | 100 | 转账金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +收款账号 | accountNo | 是 | String(64) | o6BcIwvTvIqf1zXZohc61biryWik | wxpay-openID, alipay-登录账号 +收款人姓名 | accountName | 否 | String(64) | 张三 | 填入则验证姓名,否则不验证 +收款人开户行名称 | bankName | 否 | String(64) | 中国工商银行 | 当前仅作为记录 +客户端IP | clientIp | 否 | String(32) | 210.73.10.148 | 客户端IPV4地址 +转账备注信息 | transferDesc | 否 | String(128) | 测试转账 | 转账备注信息 +异步通知地址 | notifyUrl | 否 | String(128) | https://www.jeequan.com/notify.htm | 转账完成后回调该URL,只有传了该值才会发起回调 +渠道参数 | channelExtra | 否 | String(256 | {} | 特定渠道发起的额外参数,json格式字符串 +扩展参数 | extraParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + + +`请求示例数据` + +```json +{"ifCode":"wxpay", +"entryType":"WX_CASH", +"amount":1, +"accountName":"", +"mchOrderNo":"mho1629106169045", +"sign":"3EB5A3B81E92DB41677E235363E7DDE3", +"transferDesc":"测试转账", +"reqTime":"1629106169", +"version":"1.0", +"appId":"60cc3ba74ee0e6685f57eb1e", +"accountNo":"a6BcIwtTvIqv1zXZohc61biryWok", +"clientIp":"192.166.1.132", +"signType":"MD5", +"currency":"CNY", +"mchNo":"M1623997351" +} +``` + +> 返回参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +转账订单号 | transferId | 是 | String(30) | T202108161731281310004 | 返回转账订单号 +商户转账单号 | mchOrderNo | 是 | String(30) | mho1624007315478 | 返回商户传入的转账单号 +转账状态 | state | 是 | int | 2 | 转账状态
0-订单生成
1-转账中
2-转账成功
3-转账失败
4-转账关闭 +渠道转账单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的转账单号 +渠道错误码 | errCode | 否 | String | ACQ.PAYMENT_AUTH_CODE_INVALID | 上游渠道返回的错误码 +渠道错误描述 | errMsg | 否 | String | Business Failed 失败 | 上游渠道返回的错误描述 + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "accountNo": "1", + "amount": 11, + "channelOrderNo": "20210816110070001506260000372216", + "mchOrderNo": "1629106288", + "state": 2, + "transferId": "T202108161731281310004" + }, + "msg": "SUCCESS", + "sign": "195BF6F112386F7FC8EA2AA7EECA1D33" +} +``` + +## 查询订单 + +商户通过该接口查询转账订单,支付网关会返回订单最新的数据 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/transfer/query + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +转账订单号 | transferId | 是 | String(30) | T20160427210604000490 | 支付中心生成的转账单号,与mchOrderNo二者传一即可 +商户转账单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的转账单号,与transferId二者传一即可 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + +`请求示例数据` + +```json +{ +"appId":"60cc3ba74ee0e6685f57eb1e", +"sign":"D3C0CC231F3FC3D033650699BA099B39", +"signType":"MD5", +"reqTime":"1629106457", +"transferId":"T202108121543441860003", +"mchNo":"M1623997351", +"version":"1.0" +} +``` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的转账订单号 +转账订单号 | transferId | 是 | String(30) | T20160427210604000490 | 支付中心生成的转账单号 +转账金额 | amount | 是 | int | 100 | 转账金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +接口代码 | ifCode | 是 | String(10) | wxpay | wxpay-微信官方接口 ; alipay-支付宝官方接口 +入账方式 | entryType | 是 | String(20) | 20160427210604000490 | 入账方式: WX_CASH-微信零钱; ALIPAY_CASH-支付宝转账; BANK_CARD-银行卡 +转账状态 | state | 是 | int | 2 | 转账状态
0-订单生成
1-转账中
2-转账成功
3-转账失败
4-转账关闭 +收款账号 | accountNo | 是 | String(64) | o6BcIwvTvIqf1zXZohc61biryWik | wxpay-openID, alipay-登录账号 +收款人姓名 | accountName | 否 | String(64) | 张三 | 填入则验证姓名,否则不验证 +收款人开户行名称 | bankName | 否 | String(64) | 中国工商银行 | 当前仅作为记录 +转账备注信息 | transferDesc | 否 | String(128) | 测试转账 | 转账备注信息 +渠道转账单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的转账单号 +渠道错误码 | errCode | 否 | String | 1002 | 渠道返回错误码 +渠道错误描述 | errMsg | 否 | String | 134586944573118714 | 渠道返回错误描述 +扩展参数 | extraParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +创建时间 | createdAt | 是 | long | 1622016572190 | 订单创建时间,13位时间戳 +成功时间 | successTime | 否 | long | 1622016572190 | 转账成功时间,13位时间戳 + + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "accountNo": "o6BcIwvTvIqf1zXZohc61biryWik", + "amount": 1, + "appId": "6113805e42020495c62bd4cb", + "createdAt": 1628818820011, + "currency": "CNY", + "entryType": "WX_CASH", + "errCode": "OPENID_ERROR", + "errMsg": "openid与商户appid不匹配【openid与商户appid不匹配】", + "ifCode": "wxpay", + "mchNo": "M1623997351", + "mchOrderNo": "1628818820", + "state": 3, + "transferDesc": "测试", + "transferId": "T202108130940200100001" + }, + "msg": "SUCCESS", + "sign": "A262DBD3D6182E8A0AEC90EF820F2A5A" +} +``` + +## 转账通知 + +当转账完成时(成功或失败),支付网关会向商户系统发起回调通知。如果商户系统没有正确返回,支付网关会延迟再次通知。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:该链接是通过转账申请接口提交的参数notifyUrl设置,如果无法访问链接,商户系统将无法接收到支付中心的通知。 + +请求方式:`POST` + +请求类型:`application/x-www-form-urlencoded` + +> 通知参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +商户订单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的转账订单号 +转账订单号 | transferId | 是 | String(30) | T20160427210604000490 | 支付中心生成的转账单号 +转账金额 | amount | 是 | int | 100 | 转账金额,单位分 +货币代码 | currency | 是 | String(3) | cny | 三位货币代码,人民币:cny +接口代码 | ifCode | 是 | String(10) | wxpay | wxpay-微信官方接口 ; alipay-支付宝官方接口 +入账方式 | entryType | 是 | String(20) | 20160427210604000490 | 入账方式: WX_CASH-微信零钱; ALIPAY_CASH-支付宝转账; BANK_CARD-银行卡 +转账状态 | state | 是 | int | 2 | 转账状态
0-订单生成
1-转账中
2-转账成功
3-转账失败
4-转账关闭 +收款账号 | accountNo | 是 | String(64) | o6BcIwvTvIqf1zXZohc61biryWik | wxpay-openID, alipay-登录账号 +收款人姓名 | accountName | 否 | String(64) | 张三 | 填入则验证姓名,否则不验证 +收款人开户行名称 | bankName | 否 | String(64) | 中国工商银行 | 当前仅作为记录 +转账备注信息 | transferDesc | 否 | String(128) | 测试转账 | 转账备注信息 +渠道转账单号 | channelOrderNo | 否 | String | 20160427210604000490 | 对应渠道的转账单号 +渠道错误码 | errCode | 否 | String | 1002 | 渠道返回错误码 +渠道错误描述 | errMsg | 否 | String | 134586944573118714 | 渠道返回错误描述 +扩展参数 | extraParam | 否 | String(512) | 134586944573118714 | 商户扩展参数,回调时会原样返回 +创建时间 | createdAt | 是 | long | 1622016572190 | 订单创建时间,13位时间戳 +成功时间 | successTime | 否 | long | 1622016572190 | 转账成功时间,13位时间戳 + +> 返回结果 + +业务系统处理后同步返回给支付中心,返回字符串 success 则表示成功,返回非success则表示处理失败,支付中心会再次通知业务系统。(通知频率为0/30/60/90/120/150,单位:秒) + +`注意:返回的字符串必须是小写,且前后不能有空格和换行符。` + +`通知示例数据` + +```json + { + "accountNo": "o6BcIwvTvIqf1zXZohc61biryWik", + "amount": 1, + "appId": "6113805e42020495c62bd4cb", + "createdAt": 1628818820011, + "currency": "CNY", + "entryType": "WX_CASH", + "errCode": "OPENID_ERROR", + "errMsg": "openid与商户appid不匹配【openid与商户appid不匹配】", + "ifCode": "wxpay", + "mchNo": "M1623997351", + "mchOrderNo": "1628818820", + "state": 3, + "transferDesc": "测试", + "transferId": "T202108130940200100001" + } +``` \ No newline at end of file diff --git a/jeepay-payment/src/main/resources/markdown/doc/api5.md b/jeepay-payment/src/main/resources/markdown/doc/api5.md new file mode 100644 index 0000000..cf35ca0 --- /dev/null +++ b/jeepay-payment/src/main/resources/markdown/doc/api5.md @@ -0,0 +1,201 @@ +[TOC] + +## 分账业务 + +> 业务介绍:商户分账主要用于商户将交易成功的资金,按照一定的周期,分账给其他方,可以是合作伙伴、员工、用户或者其他分润方。 + +参考微信文档: +![](/uploads/jeepay/images/m_59fa8b27a5c30a556210fc3d3bd1ad14_r.png) + + +微信分账:https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=26_1 +支付宝分账: https://opendocs.alipay.com/open/20190308105425129272/intro + + +接口目录: + +## 绑定分账用户 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/division/receiver/bind + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +接口代码 | ifCode | 是 | String(10) | wxpay | wxpay-微信官方接口 ; alipay-支付宝官方接口 +接收者账号别名 | receiverAlias | 是 | String(64) | 张三 | 接收者账号别名 +组ID | receiverGroupId | 是 | long | 10001 | 需先登录商户系统查找待加入的组ID +分账接收账号类型 | accType | 是 | int | 1 | 分账接收账号类型: 0-个人(对私) 1-商户(对公) +分账接收账号 | accNo | 是 | String(10) | 1231312@qq.com | 分账接收账号, 微信个人是openid, 支付宝可以是userId或登录名 +分账接收账号名称 | accName | 否 | String(30) | 张三 | 微信选填(当填入则验证),支付宝账号必填 +分账关系类型 | relationType | 是 | String(30) | wxpay | 分账关系类型:
SERVICE_PROVIDER:服务商
STORE:门店
STAFF:员工
STORE_OWNER:店主
PARTNER:合作伙伴
HEADQUARTER:总部
BRAND:品牌方
DISTRIBUTOR:分销商
USER:用户
SUPPLIER:供应商
CUSTOM:自定义 +分账关系类型名称 | relationTypeName | 否 | String(30) | wxpay | 当relationType=CUSTOM 必填 +渠道特殊信息 | channelExtInfo | 否 | String(256) | wxpay | 渠道特殊信息 +默认分账比例 | divisionProfit | 是 | String(10) | wxpay | 若分账30% 则填入 0.3 +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + + +`请求示例数据` + +```json +{ + 'version': '1.0', +'reqTime': '1622016572190', +'signType': 'MD5', +'sign': 'MD5MD5MD5MD5MD5MD5MD5MD5MD5MD5MD5MD5', +'mchNo': 'M1623997000', +'appId': '60cc3ba74ee0e6685f57e000', +'ifCode': 'wxpay', +'receiverAlias': '我的第一个账号', +'receiverGroupId': '100001', +'accType': '0', +'accNo': 'sfsfsd@qq.com', +'accName': '张三', +'relationType': 'OTHERS', +'relationTypeName': '我的员工', +'divisionProfit': '0.3' +} +``` + +> 返回参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +绑定账号ID | receiverId | 是 | long | 10001 | 绑定账号ID, 订单分账将使用该ID +接收者账号别名 | receiverAlias | 是 | String(64) | 张三 | 接收者账号别名 +组ID | receiverGroupId | 是 | long | 10001 | 组ID +分账接收账号类型 | accType | 是 | int | 1 | 分账接收账号类型: 0-个人(对私) 1-商户(对公) +分账接收账号 | accNo | 是 | String(10) | 1231312@qq.com | 分账接收账号 +分账接收账号名称 | accName | 否 | String(30) | 张三 | 分账接收账号名称 +分账关系类型 | relationType | 是 | String(30) | wxpay | 分账关系类型 +渠道特殊信息 | channelExtInfo | 否 | String(256) | wxpay | 渠道特殊信息 +默认分账比例 | divisionProfit | 是 | String(10) | wxpay | 默认分账比例 +绑定成功时间 | bindSuccessTime | 是 | Long | 1622016572190 | 绑定成功时间 +绑定状态 | bindState | 是 | int | 1 | 绑定状态 1-绑定成功, 0-绑定异常 +渠道错误码 | errCode | 否 | String | ACQ.PAYMENT_AUTH_CODE_INVALID | 上游渠道返回的错误码 +渠道错误描述 | errMsg | 否 | String | Business Failed 失败 | 上游渠道返回的错误描述 + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "accName": "张三", + "accNo": "sfsfsd@qq.com", + "accType": 0, + "appId": "60cc3ba74ee0e6685f57eb1e", + "bindState": 0, + "divisionProfit": 0.3, + "errCode": "NOAUTH", + "errMsg": "无分账权限", + "ifCode": "wxpay", + "mchNo": "M1623997351", + "receiverAlias": "我的第一个账号", + "receiverGroupId": 100001, + "relationType": "OTHERS", + "relationTypeName": "我的员工" + }, + "msg": "SUCCESS", + "sign": "552CB91FA1E1DB378A534B377E4E9403" +} +``` + +## 发起订单分账 + +当订单下单时传入的分账模式 divisionMode = 2商户手动分账(解冻商户金额),支持商户手动发起订单分账。
注意:需要在订单支付完成后(建议1分钟后)调用分账接口。 + +> 接口说明 + +适用对象:`普通商户` `特约商户` + +请求URL:https://pay.jeepay.vip/api/division/exec + +请求方式:`POST` + +请求类型:`application/json` 或 `application/x-www-form-urlencoded` + +> 请求参数 + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 +应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID +支付订单号 | payOrderId | 否 | String(30) | P20160427210604000490 | 支付中心生成的支付订单号,与mchOrderNo二者传一即可 +商户单号 | mchOrderNo | 否 | String(30) | 20160427210604000490 | 商户生成的支付单号,与payOrderId二者传一即可 +是否使用系统配置的自动分账组 | useSysAutoDivisionReceivers | 是 | int | 1 | 是否使用系统配置的自动分账组: 0-否 1-是 +分账接收者账号列表 | receivers | 否 | String(512) | [] | 接收者账号列表(JSONArray 转换为字符串类型)
仅当useSysAutoDivisionReceivers=0 时该字段值有效。
参考:
方式1: 按账号纬度
[{
receiverId: 800001,
divisionProfit: 0.1 (若不填入则使用系统默认配置值)
}]
方式2: 按组纬度
[{
receiverGroupId: 100001, (该组所有 当前订单的渠道账号并且可用状态的全部参与分账)
divisionProfit: 0.1 (每个账号的分账比例, 若不填入则使用系统默认配置值, 建议不填写)
}] +请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 +接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 +签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 +签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5方式 + +`请求示例数据` + +```json +{ + 'version': '1.0', +'reqTime': '1622016572190', +'signType': 'MD5', +'sign': '1', +'mchNo': 'M1623997351', +'appId': '60cc3ba74ee0e6685f57eb1e', +'payOrderId': 'P202108271011463510002', +'useSysAutoDivisionReceivers': '0', +'receivers': '[{"receiverGroupId":"","receiverId":"800029","divisionProfit":"0.0001"},{"receiverGroupId":"","receiverId":"800028","divisionProfit":"0.0002"}]' +} +``` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 +返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 +签名信息 | sign | 否 | String(32) | CCD9083A6DAD9A2DA9F668C3D4517A84 | 对data内数据签名,如data为空则不返回 +返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 + +`data数据格式` + +字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 +------- | -------| -------| -------| -------| ------- +分账状态 | state | 是 | int | 2 | 分账状态 1-分账成功, 2-分账失败 +上游分账批次号 | channelBatchOrderId | 否 | String(30) | T20160427210604000490 | 上游分账批次号 +渠道错误码 | errCode | 否 | String | 1002 | 渠道返回错误码 +渠道错误描述 | errMsg | 否 | String | ERROR | 渠道返回错误描述 + + +`返回示例数据` + +```json +{ + "code": 0, + "data": { + "errCode": "unknown-sub-code", + "errMsg": "Business Failed【未知的错误码ACQ.ROYALTY_ACCOUNT_NOT_EXIST】", + "state": 2 + }, + "msg": "SUCCESS", + "sign": "56836E18015DD7E4FAFE45380C0AD098" +} +``` \ No newline at end of file