支付中台-聚合支付项目文档
1 全局字典及其他约定
1.1 状态: status
属性值 | 描述 |
---|---|
pending | 交易处理中 |
succeeded | 交易成功 |
failed | 交易失败 |
1.2 认证/支付类型: authen_type
属性值 | 描述 |
---|---|
公众号 | |
app | 微信APP |
mini | 微信小程序 |
alilife | 支付宝生活号 |
aliapp | 支付宝App |
1.3 业务方事件回调
属性 | 类型 | 说明 |
---|---|---|
notify_url/pay_notify_url | String | 回调方的HTTP地址,POST方法 |
extra | JSONObject | POST方法的请求体 |
2 API安全约定
本期API协议头部需带上鉴权标识才可访问。具体分为: 后台管理API访问鉴权、内部服务访问鉴权。
3.1 后台管理API
3.1.1 域名
环境 | 域名 | 说明 |
---|---|---|
SIT | https://open-sit.remacsmart.com | |
生产 | https://open-sit.remacsmart.com | |
3.1.2 后台管理鉴权
使用《4.1 支付中台后台登录》返回的结果 access_token 值,HTTP 头部名称为remacToken ,发送请求时带上这个头部。
HTTP头部名称:remacToken: 值:"返回的结果 access_token"
3.2 受信内部服务API
受信的下游平台使用支付中台能力调用中台接口API时需要使用。
3.2.1 域名
环境 | 域名 | 说明 |
---|---|---|
SIT | https://iot-sit.remacsmart.com | |
生产 | https://iot.remacsmart.com |
3.2.2 受信内部服务鉴权
请参照以下平台指引完成生成token并将随机16位AES加密密钥的密文作为头部传给中台。
HTTP头部名称:aeskey: 值:"中台公钥加密的密文"
HTTP头部名称:token, 值:使用AES加密密钥明文按约定字段生成的JSON字符串密文
https://confluence.mideazy.com/pages/viewpage.action?pageId=391872567
3.3 支付相关API及鉴权
3.3.1 支付相关API域名
环境 | 域名 | 说明 |
---|---|---|
SIT | https://iot-sit.remacsmart.com | |
生产 | https://iot.remacsmart.com |
3.3.2 支付相关接口鉴权
受信内部服务方(业务方)调用《4.4.1.1 微信认证获取token》或 《1.4.2.1 支付宝认证获取token》获取
的 token 值携带至HTTP头部。
HTTP头部名称:Authorization : 值:"调用认证获取的token"
token 中将加密存储支付相关的重要信息,由网关统一转发至聚合支付微服务,不再由业务方传参,减少了敏感信息泄露的风险,接口参数也更加简洁。
4 API
4.1 支付中台后台登录
注:登录接口使用的是统一登录的域名。 支付中台后台帐号登录后进行的操作。
参见:
http://arch.smartmideazy.com/docs/account/account-doc.html
统一登录域名
环境 | 域名 | |
---|---|---|
SIT | https://gw-sit.remacsmart.com | |
POD | https://gw.remacsmart.com |
编号 | API名称 | 路径 | 版本 | 适用范围 |
---|---|---|---|---|
2.1 | 登录 | /v1/user/sso/login | 1.0 | 所有 |
2.2 | 刷新token | /v1/oauth/sso/refreshtoken | 1.0 | 所有 |
2.4 | 退出登录 | /v1/user/logout | 1.0 | 所有 |
登录返回:
{"code":"200","data":{"tokenInfo":{"name":"功夫熊猫","orgFullName":null,"id":"28449","orgId":null,"org_code":null,"user_name":"supperadm","position":"未知","mobile":"13923403549","nick_name":null,"is_supper":2,"status":1,"bizOrgId":null,"bizOrgCode":null,"bizOrgFullName":null,"ico":"https://iot-xlink-xfile.oss-cn-hangzhou.aliyuncs.com/community/2022-09-01/219061661994225824.png","credentials":"U2FsdGVkX1%2Fr%2FOXMu0sZ6LW7GTMSDkrh7VOOuMU%2FyqiEa77Xh5Du1cGsm35VE2wk","roles":null,"orgRoles":null,"tenantId":null,"top_org_code":null,"top_org_id":null,"encryptKey":"oCkMsXhap7l8sex%2FlM4jtiOPQAc0cg9RE86OiMS07p8%2BE%2FVY4qG5JKXE4I0Yn2FB23HgMfIRpRzAQYh%2FUyV%2BldylfJABuedskTMAG5ainm9Ffq0JlMBi6K72%2BpY%2Bvx7%2B%2FeFjhKVMbiztZnVRxA4O9CMSFds2QbKMCopHmttWc9U%3D"},"token":{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMjg0NDkiLCJzcmMiOjEsInVzZXJfbmFtZSI6InN1cHBlcmFkbSIsInJvbGVzIjpbIlNZU19BRE1JTiJdLCJzY29wZSI6WyJhbGwiXSwibmFtZSI6IuWKn-Wkq-eGiueMqyIsImlkIjoiMjg0NDkiLCJleHAiOjE2Njc1ODEyNTcsImp0aSI6IjhkNTVjOGI5LTU0MWUtNDhkMS1hZmZiLTlmMmRmNTNjZWJhYSIsImNsaWVudF9pZCI6ImJvc3MtY2xpZW50IiwiaXNfc3VwcGVyIjoiMiJ9.UAoL0F3deAjLPekpMF56KeL7-pa1nKHZThO5oWj1Lh_6iwMV9y7OPXvwbvCE_6wpJtw7fJ19-ILaGbMyRqjH4udnt1LnIVdCioqmgnWOtvngyUNklGANZ45tuN_ALDejsmt6ayYPOmRj2Uwv468FwRhXlB2KhtEu9nKtjbNqE2k","token_type":"bearer","refresh_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMjg0NDkiLCJzcmMiOjEsInVzZXJfbmFtZSI6InN1cHBlcmFkbSIsInJvbGVzIjpbIlNZU19BRE1JTiJdLCJzY29wZSI6WyJhbGwiXSwiYXRpIjoiOGQ1NWM4YjktNTQxZS00OGQxLWFmZmItOWYyZGY1M2NlYmFhIiwibmFtZSI6IuWKn-Wkq-eGiueMqyIsImlkIjoiMjg0NDkiLCJleHAiOjE2Njc5MDUyNTcsImp0aSI6IjZkMTkzMmE3LTY2MjAtNGVlZS05ZTVhLTkzNmUyNzcyOTRlNiIsImNsaWVudF9pZCI6ImJvc3MtY2xpZW50IiwiaXNfc3VwcGVyIjoiMiJ9.iYYygwm2TFXtbVAX1FPTyGWb7kmuajHCizoV3KtKmTPC2fcxKDnizuk6_cGCQzX8u1kATm7ft2uHeyDIRMpzyZ8RTnJV7uXxV3jSAXEq-KzRtnXFsrYU9TPUvRjWw3VFK0Sy3KNWQ1X9Sb9NcdnAX5YkSpJOSprqBs35gSQ57fY","scope":"all","jti":"8d55c8b9-541e-48d1-affb-9f2df53cebaa","expires_in":35999,"roles":["SYS_ADMIN"],"top_org_id":null,"top_org_code":null,"isSys":null}},"message":"success"}
4.2 收银台模板
4.2.1 收银台模板新增
注:模板可以有多个,以便业务绑定。
URL: /v1/ploypay/admin/pay/template/set
method :PUT
HTTP头部:见《3.1.2 后台管理鉴权》
Body: 属性
属性 | 类型 | 是否必传 | 说明 |
---|---|---|---|
id | Int | N | 主键ID,平台唯一。为空代表新建;非空代表修改 |
pay_methods | JSONArray | Y | 支付中台所支持的支付方式JSON数组 |
pay_methods_set | JSONArray | Y | 收银台模板,激活的支付方式。激活后,支付仅支持激活的支付方式。 |
status | Int | Y | 1:启用 2:禁用 |
template_type | varchar | N | 为空代表移动端,默认值mobile。 枚举值:mobile手机端模板,pc: 电脑端模板。 |
url | varchar | Y | H5模板页的地址 |
effect_time | Int | Y | 分钟。 |
Body:
{
pay_methods:[
{key:"wechat", value:"微信"}, {key:"alipay", value:"支付宝"},
{key:"unionpay", value:"银联"}],
pay_methods_set: ["wechat", "alipay"],
status: 1
template_type: 'mobile',
url: 'https://abc.com/index.html#',
effect_time: 15 ,
id: 1234
}
4.2.2 商户APP应用登记
URL: /v1/ploypay/admin/app/manage
method: PUT
HTTP头部:见《3.1.2 后台管理鉴权》
在开通微信公众号/小程序等相关功能时已经绑定了 Adapay 的 App_ID 与微信的 AppID 之间的映射关系,故交易时候请传入 Adapay 的 App_ID。
参见: https://docs.adapay.tech/help/console.html#appid-adapay-app-id
属性 | 类型 | 是否必传 | 说明 |
---|---|---|---|
id | Int | N | 为空代表新建;非空代表修改 |
app_id | String | Y | 聚合支付渠道中创建的appid |
api_key | String | Y | 聚合支付渠道中创建的app的API key |
private_key_pkcs8_path | String | Y | 商户私钥pkcs8格式文件路径;相对应的RSA公钥渠道商平台保存;用于调用渠道商API接口时做签名用。 |
public_key | String | Y | 平台提供给商户的公钥, 用于验签来自渠道商的响应 |
third_part | String | N | 聚合支付渠道商标识枚举,默认为:huifu |
4.3 中台分帐接口文档
4.3.1 企业对象
4.3.1.1 创建/更新企业用户
暂支持创建企业用户对象。
URL: /v1/ploypay/admin/member/create
method: PUT
HTTP头部:见《3.2.2 受信内部服务鉴权》
BODY:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
id | Int | N | 为空代表新增;非空代表创建。 |
app_id | String(64) | Y | 商户应用的app_id |
third_part | String(32) | Y | 渠道商的标识,默认为 huifu |
order_no | String(64) | 请求订单号, 由业务系统维护,便于查询申请单的状态 | |
member_id | String(64) | Y | 商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一。 修改时member_id 不可修改。 |
name | String(50) | Y | 企业名称 |
prov_code | String(4) | Y | 省份编码 |
area_code | String(4) | Y | 地区编码 |
social_credit_code | String(18) | Y | 统一社会信用码 |
social_credit_code_expires | String(8) | Y | 统一社会信用证有效期 |
business_scope | String(200) | Y | 经营范围 |
legal_person | String(20) | Y | 法人姓名 |
legal_cert_id | String(20) | Y | 法人身份证号码 |
legal_cert_id_expires | String(8) | Y | 法人身份证有效期 |
legal_mp | String(11) | Y | 法人手机号 |
address | String(256) | Y | 企业地址 |
zip_code | String(6) | N | 邮编 |
telphone | String(30) | N | 企业电话 |
String(40) | N | 企业邮箱 | |
attach_file | File | Y | 上传附件,传入的中文文件名称为 UTF-8 字符集 URLEncode 编码后的字符串。内容须包含三证合一证件照、法人身份证正面照、法人身份证反面照、开户银行许可证照。 压缩 zip包后上传,最大限制为 9 M。 |
bank_code | String(8) | Y | 银行代码,如果需要自动开结算账户,本字段必填(详见附录) |
bank_acct_type | String(1) | Y | 银行账户类型:1-对公;2-对私,如果需要自动开结算账户,本字段必填 |
card_no | String(40) | Y | 银行卡号,如果需要自动开结算账户,本字段必填 |
card_name | String(64) | Y | 银行卡对应的户名,如果需要自动开结算账户,本字段必填;若银行账户类型是对公,必须与企业名称一致 |
notify_url | String(250) | 否 | 业务方回调地址;见数据字典《1.3 业务方事件回调 》 |
extra | JSONOBJECT | 否 | 业务方回调HTTP BODY;见数据字典《1.3 业务方事件回调 》 |
返回:
参数 | 类型 | 必返回 | 描述 |
---|---|---|---|
Id | Int | Y | 中台企业对象主键值。 |
order_no | String(64) | Y | 请求订单号 |
member_id | String(64) | Y | 商户下的用户id |
app_id | String(64) | Y | 控制台主页面应用的app_id |
created_time | String(8) | Y | 创建时的时间戳 |
prod_mode | String(5) | Y | 是否 prod模式,true 是 prod模式,false 是 mock模式 |
4.3.1.2 查询企业用户
URL: /v1/ploypay/admin/member/query
method: POST
HTTP头部:见《3.2.2 受信内部服务鉴权》
BODY:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | String(64) | Y | 应用 app_id |
member_id | String(64) | Y | 商户下的用户id |
返回:
{"code": "200",
"message":"success",
"data":
{
"id":XXX,
"address": "湖南省滨州市",
"app_id": "app_XXXXXXXX",
"area_code": "4201",
"business_scope": "",
"email": "",
"legal_cert_id": "#011pvYcG/6l6ofY38Ql6P31eUb/xoAqNLSL",
"legal_cert_id_expires": "",
"legal_mp": "#0 11HGjFbJFO8mBejceLLqFypw==",
"legal_person": "xxxx",
"member_id": "member_id_test",
"name": "测试企业用户信息 4",
"prov_code": "0042",
"social_credit_code": "91410300X148288455",
"social_credit_code_expires": "",
"telphone": "",
"zip_code": "",
"status": "succeeded",
"prod_mode": "true"
}
}
4.3.2 结算帐户
4.3.2.1 创建结算帐户
URL: /v1/ploypay/admin/settleaccount/create
method: POST
HTTP头部:见 《3.2.2 受信内部服务鉴权》
BODY:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | String(64) | Y | 应用的app_id |
third_part | String(32) | Y | 渠道商标识,默认 huifu |
member_id | String(64) | Y | 商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 |
channel | String | Y | 目前仅支持:bank_account(银行卡) |
account_info | Object | Y | 结算账户信息 |
notify_url | String(250) | 否 | 业务方回调地址;见数据字典《1.3 业务方事件回调 》 |
extra | JSONOBJECT | 否 | 业务方回调HTTP BODY;见数据字典《1.3 业务方事件回调 》 |
account_info 对象属性如下:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
card_id | String(64) | Y | 银行卡号 |
card_name | String(64) | Y | 银行卡对应的户名 |
cert_id | String(64) | N | 证件号,银行账户类型为对私时,必填 |
cert_type | String(2) | N | 证件类型,仅支持:00-身份证,银行账户类型为对私时,必填 |
tel_no | String(64) | Y | 手机号 |
bank_code | String(8) | N | 银行编码,银行账户类型对公时,必填 |
bank_name | String(64) | N | 开户银行名称 |
bank_acct_type | String(1) | Y | 银行账户类型:1-对公;2-对私 |
prov_code | String(4) | N | 银行账户开户银行所在省份编码 ,银行账户类型为对公时,必填 |
area_code | String(4) | N | 银行账户开户银行所在地区编码,银行账户类型为对公时,必填 |
成功响应格式:
{"code": "200",
"message":"success",
"data":
{
"account_info": {
"area_code": "1401",
"bank_acct_type": "2",
"bank_code": "0105999",
"bank_name": "",
"card_id": "622700****0576",
"card_name": "xxx",
"cert_id": "1401****0631",
"cert_type": "00",
"prov_code": "0014",
"tel_no": "137****xxxx"
},
"app_id": "app_XXXXXXXX",
"channel": "bank_account",
"create_time": "1568963254",
"settle_account_id": "0006440476699456",
"type": "",
"status": "succeeded",
"prod_mode": "true",
"id":XX
}
}
其中: settle_account_id 是聚合支付渠道商平台生成一个唯一的 id。
status见全局字典《A001 状态 status》
4.3.2.2 修改结算帐户配置
注: 本接口不能更改结算卡,如需更改结算账户的结算卡,请先删除结算账户,再重新创建结算账户。
URL: /v1/ploypay/admin/settleaccount/config/set
method: PUT
HTTP头部:见 《3.2.2 受信内部服务鉴权》
请求BODY:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | String(64) | Y | 应用的app_id |
member_id | String(64) | Y | 商户下的用户id,若为商户本身时,传入0 |
settle_account_id | String(64) | N | Adapay系统返回的结算账户id,若为商户本身时,不传该值 |
min_amt | String(16) | N | 结算起始金额 ( 0.00格式,整数部分最长13位,小数部分最长2位) min_amt, remained_amt,channel_remark至少有一个不为空 |
remained_amt | String(16) | N | 结算留存金额 ( 0.00格式,整数部分最长13位,小数部分最长2位) |
channel_remark | String(200) | N | 结算信息摘要,银行出款时摘要信息 |
notify_url | String(250) | 否 | 业务方回调地址;见数据字典《1.3 业务方事件回调 》 |
extra | JSONOBJECT | 否 | 业务方回调HTTP BODY;见数据字典《1.3 业务方事件回调 》 |
account_info字段说明:
参数 | 类型 | 非空 | 说明 |
---|---|---|---|
card_id | String(64) | Y | 银行卡号 |
card_name | String(16) | Y | 银行账户名称 |
cert_id | String(30) | Y | 身份证号 |
cert_type | String(2) | N | 默认:00-身份证 |
tel_no | String(11) | Y | 手机号 |
bank_code | String(8) | Y | 详见开户银行编码附录 |
bank_name | String(64) | N | 开户银行名称 |
bank_acct_type | String(1) | Y | 银行账户类型:1-对公;2-对私 |
prov_code | String(4) | Y | 省份 |
area_code | String(4) | Y | 地区 |
min_amt | String(16) | N | 结算起始金额 ( 0.00格式,整数部分最长13位,小数部分最长2位),修改结算配置时返回 |
remained_amt | String(16) | N | 结算留存金额 ( 0.00格式,整数部分最长13位,小数部分最长2位),修改结算配置时返回 |
channel_remark | String(200) | N | 结算信息摘要,银行出款时摘要信息,修改结算配置时返回 |
成功响应格式:
{"code": "200",
"message":"success",
"data":
{
"account_info": {
"area_code": "1401",
"bank_acct_type": "2",
"bank_code": "0105999",
"bank_name": "",
"card_id": "622700****0576",
"card_name": "xxx",
"cert_id": "1401****0631",
"cert_type": "00",
"prov_code": "0014",
"tel_no": "137****xxxx"
},
"app_id": "app_XXXXXXXX",
"channel": "bank_account",
"create_time": "1568963254",
"settle_account_id": "0006440476699456",
"type": "",
"status": "succeeded",
"prod_mode": "true",
"id":XX,
"min_amt": "20.00",
"remained_amt": "50.00",
"channel_remark": "摘要测试"
}
}
4.3.2.3 查询结算帐户
注: 本接口不能更改结算卡,如需更改结算账户的结算卡,请先删除结算账户,再重新创建结算账户。
URL: /v1/ploypay/admin/settleaccount/query
method: POST
HTTP头部:见 《3.2.2 受信内部服务鉴权》
请求BODY:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | String(64) | Y | 应用的app_id |
member_id | String(64) | Y | 商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 |
settle_account_id | String(64) | Y | 由 Adapay 生成的结算账户对象 id |
成功响应格式:
{"code": "200",
"message":"success",
"data":
{
"account_info": {
"area_code": "1401",
"bank_acct_type": "2",
"bank_code": "0105999",
"bank_name": "",
"card_id": "622700****0576",
"card_name": "xxx",
"cert_id": "1401****0631",
"cert_type": "00",
"prov_code": "0014",
"tel_no": "137****xxxx"
},
"app_id": "app_XXXXXXXX",
"channel": "bank_account",
"create_time": "1568963254",
"settle_account_id": "0006440476699456",
"type": "",
"status": "succeeded",
"prod_mode": "true",
"id":XX,
"min_amt": "20.00",
"remained_amt": "50.00",
"channel_remark": "摘要测试"
}
}
4.3.2.4 删除结算帐户
注: 本接口不能更改结算卡,如需更改结算账户的结算卡,请先删除结算账户,再重新创建结算账户。
URL: /v1/ploypay/admin/settleaccount/delete/{app_id}/{member_id}/{settle_account_id}
method: DELETE
HTTP头部:见《3.2.2 受信内部服务鉴权》
请求路径参数:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | String(64) | Y | 应用的app_id |
member_id | String(64) | Y | 商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 |
settle_account_id | String(64) | Y | 由 Adapay 生成的结算账户对象 id |
成功响应格式:
{"code": "200",
"message":"success",
"data":
{
"account_info": {
"area_code": "1401",
"bank_acct_type": "2",
"bank_code": "0105999",
"bank_name": "",
"card_id": "622700****0576",
"card_name": "xxx",
"cert_id": "1401****0631",
"cert_type": "00",
"prov_code": "0014",
"tel_no": "137****xxxx"
},
"app_id": "app_XXXXXXXX",
"channel": "bank_account",
"create_time": "1568963254",
"settle_account_id": "0006440476699456",
"type": "",
"status": "succeeded",
"prod_mode": "true",
"id":XX,
"min_amt": "20.00",
"remained_amt": "50.00",
"channel_remark": "摘要测试"
}
}
4.3.2.5 查询结算帐户
注: 本接口不能更改结算卡,如需更改结算账户的结算卡,请先删除结算账户,再重新创建结算账户。
URL: /v1/ploypay/admin/settleaccount/history
method: POST
HTTP头部:见《3.2.2 受信内部服务鉴权》
请求BODY :
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | String(64) | Y | 应用的app_id |
member_id | String(64) | Y | 商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 |
settle_account_id | String(64) | Y | 由 Adapay 生成的结算账户对象 id |
成功响应
{"code": "200",
"message":"success",
"data":
{
"prod_mode": "true",
"settle_details": [
{
"settle_type": "T1",
"settle_stat": "successed",
"card_no": "130234****8399",
"settle_amt": "6.98",
"settle_fee_amt": "0.00",
"settle_date": "20191014",
"card_name": "adapay测试商户"
},
{
"settle_type": "T1",
"settle_stat": "successed",
"card_no": "130234****8399",
"settle_amt": "5.00",
"settle_fee_amt": "0.00",
"settle_date": "20191012",
"card_name": "adapay测试商户"
}
],
"object": "list",
"status": "succeeded"
}
}
status 见数据字典 《A001 状态 status》
settle_details字段说明:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
card_name | String(64) | Y | 结算账户名称 |
card_no | String(64) | Y | 脱敏的结算账号 |
settle_date | String(8) | Y | 结算日期 |
settle_amt | String(16) | Y | 结算金额 |
settle_fee_amt | String(16) | Y | 结算手续费金额 |
settle_stat | String(16) | Y | 结算状态,succeeded:成功;failed:失败;pending:处理中;no-started:未发起结算 |
settle_type | String(2) | Y | 结算类型,T1:T+1日结算;D1: D+1日结算;B:结算失败回账记录 |
settle_message | String(128) | N | 结算失败描述信息 |
4.3.2.6 查询交易流水
URL: /v1/ploypay/admin/trade/history
method: POST
HTTP头部:见《3.2.2 受信内部服务鉴权》
请求BODY :
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
app_id | String(64) | Y | 应用的app_id |
key_word | String(64) | N | 商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 |
start_date | String(8) | N | yyyyMMdd, 开始时间 |
end_date | String(8) | N | yyyyMMdd,结束时间 |
4.4 认证授权
由业务端调用中台的接口来实现认证授权。一方面返回微信和支付宝的用户ID,另一方面由中台加密生成token,后续作为请求中台的凭证。
4.4.1 微信认证授权
4.4.1.1 微信认证获取token
同时支持微信APP、小程序、公众号的授权。
协议: https
URL: /wx/wechat/token/grant
method: POST
HTTP头部:见《3.2.2 受信内部服务鉴权》
body:
字段 | 类型 | 是否必传 | 说明 | |
---|---|---|---|---|
code | String | 否 | 调用微信公众号授权后,返回的code,authen_type=wechat\ | mini必传; authen_type=app 不用传。 |
sub_id | String | 是 | 微信商户号 | |
member_id | String | 否 | 聚合支付用户ID,已接入聚合支付的业务此参数不可为空。 | |
authen_type | String | 是 | 认证类型: 见全局字典《A002 -认证/支付类型: authen_type》 |
返回结果:
{
"code": "200",
"message": "成功",
"data":
{"openid":"o6Cx46ISmbJ1oWL8-_KS7YWev7RQ","nickname":"鹏哥","headimgurl":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/HkUibecHmjWIpYtGZAq0M3TbUFXibLkVyH6AGxibQT14kE6IIM4wH0ic9w54zwz6A6DWoM21YYpYheDqwlkbwZyKwA\/132","privilege":[],"unionid":"oEIwe55PabJu_9X0ThpIiKVHi5kI", "token":"eyJhbGciOiJIUzI1NiJ9.eyJrZXlfbWVtYmVyX2xvZ2luIjoie1widW5pb25pZFwiOlwib0VJd2U1NVBhYkp1XzlYMFRocElpS1ZIaTVrSVwiLFwib3BlbmlkXCI6XCJvNkN4NDZJU21iSjFvV0w4LV9LUzdZV2V2N1JRXCIsXCJuaWNrbmFtZVwiOlwi6bmP5ZOlXCIsXCJjaXR5XCI6XCJcIixcInByb3ZpbmNlXCI6XCJcIixcImNvdW50cnlcIjpcIlwiLFwiaGVhZGltZ3VybFwiOlwiaHR0cHM6Ly90aGlyZHd4LnFsb2dvLmNuL21tb3Blbi92aV8zMi9Ia1VpYmVjSG1qV0lwWXRHWkFxME0zVGJVRlhpYkxrVnlINkFHeGliUVQxNGtFNklJTTR3SDBpYzl3NTR6d3o2QTZEV29NMjFZWXBZaGVEcXdsa2J3WnlLd0EvMTMyXCIsXCJzZXhcIjowLFwibGFuZ3VhZ2VcIjpcIlwiLFwicHJpdmlsZWdlXCI6W10sXCJhdXRoZW5fdHlwZVwiOlwid2VjaGF0XCIsXCJidXNpbmVzc190eXBlXCI6XCJwYXJrcGF5XCIsXCJzcGFjZV9pZFwiOjEwMjAsXCJzcGFjZV9uYW1lXCI6XCLnvo7nmoTniankuJrmmbrmhaflgZzovablnLpcIixcImFwcElkXCI6XCJ3eGE5YzExOTMwZGUxY2U3MDZcIixcImFwcFNlY3JldFwiOlwiNTRhMzYxYjUyNjY0MjcyZDIzMmE3NTgyZGE3NDMyODRcIixcInNob3BpZFwiOjF9IiwiZXhwIjoxNjM4MjQzOTMyLCJpYXQiOjE2MzgyMzY3MzIsImp0aSI6IjA2MGUyZGVlLTdhOTQtNGYyNi05ZjA3LWM1MmMzZGViYmVmZiJ9.4J_5ES4sI6v5rf1fxlrPo_6X1c8x6d5ac58fGJcjdQ8
"
}
}
重要返回字段:
字段 | 类型 | 是否必返 | 说明 |
---|---|---|---|
openid | String | 否 | 调用微信公众号授权后openid |
token | String | 是 | 授权成功后,平台授予的token, 前端需要妥善保存,后续的请求中需要将其携带在http头部。用户的关键信息。 |
4.4.2 支付宝认证授权
支付宝API: https://opendocs.alipay.com/open/284/106000?ref=api
注:支付宝APP需要使用APP支付宝登录。见《APP支付宝登录产品介绍》
见:https://opendocs.alipay.com/open/218/105329/
4.4.2.1 业务方换取授权链接
4.4.2.1 支付宝认证获取token
同时支持支付宝生活号证获取token
中台网关响应
/wx/alipay/callback?app_id=2019012263118366&source=alipay_app_auth&state=SOCIAL$2059$PENDING&app_auth_code=72eb27532a0d4fcf8e6ec7e736990X64
授权成功后,获取access_token ,由 access_toke换取用户支付宝用户 user_id 即buyer_id
协议: https
URL: /wx/alipay/token/grant
method: POST
HTTP头部:见《3.2.2 受信内部服务鉴权》
body:
字段 | 类型 | 是否必传 | 说明 |
---|---|---|---|
app_auth_code | String | 是 | 支付宝预授权code |
sub_id | String | 是 | 支付宝商户ID |
member_id | String | 否 | 聚合支付用户ID,已接入聚合支付的业务此参数不可为空。 |
authen_type | String | 是 | 认证类型: 见全局字典《1.2 认证/支付类型: authen_type》 |
返回结果:
{
"code": "200",
"message": "成功",
"data":
{"user_id":"o6Cx46ISmbJ1oWL8-_KS7YWev7RQ","token":"eyJhbGciOiJIUzI1NiJ9.eyJrZXlfbWVtYmVyX2xvZ2luIjoie1widW5pb25pZFwiOlwib0VJd2U1NVBhYkp1XzlYMFRocElpS1ZIaTVrSVwiLFwib3BlbmlkXCI6XCJvNkN4NDZJU21iSjFvV0w4LV9LUzdZV2V2N1JRXCIsXCJuaWNrbmFtZVwiOlwi6bmP5ZOlXCIsXCJjaXR5XCI6XCJcIixcInByb3ZpbmNlXCI6XCJcIixcImNvdW50cnlcIjpcIlwiLFwiaGVhZGltZ3VybFwiOlwiaHR0cHM6Ly90aGlyZHd4LnFsb2dvLmNuL21tb3Blbi92aV8zMi9Ia1VpYmVjSG1qV0lwWXRHWkFxME0zVGJVRlhpYkxrVnlINkFHeGliUVQxNGtFNklJTTR3SDBpYzl3NTR6d3o2QTZEV29NMjFZWXBZaGVEcXdsa2J3WnlLd0EvMTMyXCIsXCJzZXhcIjowLFwibGFuZ3VhZ2VcIjpcIlwiLFwicHJpdmlsZWdlXCI6W10sXCJhdXRoZW5fdHlwZVwiOlwid2VjaGF0XCIsXCJidXNpbmVzc190eXBlXCI6XCJwYXJrcGF5XCIsXCJzcGFjZV9pZFwiOjEwMjAsXCJzcGFjZV9uYW1lXCI6XCLnvo7nmoTniankuJrmmbrmhaflgZzovablnLpcIixcImFwcElkXCI6XCJ3eGE5YzExOTMwZGUxY2U3MDZcIixcImFwcFNlY3JldFwiOlwiNTRhMzYxYjUyNjY0MjcyZDIzMmE3NTgyZGE3NDMyODRcIixcInNob3BpZFwiOjF9IiwiZXhwIjoxNjM4MjQzOTMyLCJpYXQiOjE2MzgyMzY3MzIsImp0aSI6IjA2MGUyZGVlLTdhOTQtNGYyNi05ZjA3LWM1MmMzZGViYmVmZiJ9.4J_5ES4sI6v5rf1fxlrPo_6X1c8x6d5ac58fGJcjdQ8
"
}
}
重要返回字段:
字段 | 类型 | 是否必返 | 说明 |
---|---|---|---|
user_id | String | 是 | 调用支付宝授权后的用户ID,后面支付需要用到 |
token | String | 是 | 授权成功后,平台授予的token, 前端需要妥善保存,后续的请求中需要将其携带在http头部。用户的关键信息。 |
4.5 支付
本期API仅实现汇付分帐支付。
4.5.1 统一下单
说明:本接口微信、支付宝统一下单共用接口。平台启用间连支付通道,调用的第三方聚合支付通道,由第三方支付渠道调用微信或支付宝的接口完成下单,按执行了分帐逻辑;平台启用的直连支付通道,是直接调用微信/支付宝的官方下单接口。
URL: /wx/poly/pay/unifyOrder
Method: PUT
HTTP头部:见《3.3 支付相关API及鉴权》
BODY:
重要返回字段:
字段 | 类型 | 是否必传 | 说明 |
---|---|---|---|
business_order_id | String(64) | 是 | 业务方的订单号,同一应用 app_id下唯一。 |
total_fee | Int | 是 | 订单总金额,单位:分。 |
goods_title | String(64) | 否 | 商品标题,业务方不传,中台默认为“付款” |
goods_desc | String(42) | 否 | 商品描述,业务方不传,中台默认为“商品” |
pay_notify_url | String(250) | 否 | 业务方回调地址;见数据字典《1.3 业务方事件回调 》 |
extra | JSONOBJECT | 否 | 业务方回调HTTP BODY;见数据字典《1.3 业务方事件回调 》 |
div_members 对象示例:
[{
member_id:"XX"
amount: 120
fee_flag:"N"
},...]
调用第三方渠道分帐支付接口时,分账对象信息 div_members 由中台来完成。不需要业务方传参。
分账对象信息div_members 由支付中台来计算。
数据结构如下:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
member_id | String(64) | Y | 分账用户 Member对象 的 id;若是商户本身时,传入0 |
amount | String(14) | Y | 分账金额,精确到分,如0.50,1.00等,分账总金额必须等于主交易金额,金额不能为0.00 |
fee_flag | String(1) | N | 是否手续费承担方,N-否,Y-是,手续费承担方有且只能有一个 |
返回数据约定:
{
"code":"200",
"message":"success",
"data": {
"transaction_id": "XXXX",
"order_no":"XXX",
"status": "XXX",
"payinfo":{....}
...
}
}
返回字段说明:
transaction_id: 中台交易ID
status :支付状态, 见《1.1 状态: status》
order_no: 业务订单号
payinfo: JSONObject 微信或支付宝的预支付参数。
其中,微信的payinfo 返回字段如下:
字段 | 类型 | 是否必返 | 说明 |
---|---|---|---|
nonce_str | String | 是 | 生成签名的随机串 |
out_trade_no | String | 是 | 平台生成的唯一订单号 ,此订单号同步给微信 |
total_fee | String | 是 | 付款总额 |
prepay_id | String | 是 | 生成订单后获取预支付id |
timeStamp | String | 是 | 时间戳 |
sign | String | 是 | 微信返回签名 |
4.5.2 查询支付对象
URL: /wx/poly/pay/query
Method: PUT
HTTP头部:见《3.3 支付相关API及鉴权》
BODY:
重要返回字段:
字段 | 类型 | 是否必传 | 说明 |
---|---|---|---|
order_no | String(64) | 是 | 业务方的订单号,同一应用下唯一。 |
4.5.2 退款
URL: /wx/poly/pay/refund
Method: PUT
HTTP头部:见《3.3 支付相关API及鉴权》
BODY:
字段 | 类型 | 是否必传 | 说明 |
---|---|---|---|
out_trade_no | String(64) | 是 | 中台方订单号。由中台统一下单后返回给业务方。 |
refund_amount | String(16) | 是 | 退款金额,RMB单位:分。 |
notify_url | String(250) | 否 | 业务方回调地址;见数据字典《1.3 业务方事件回调 》 |
extra | JSONObject | 否 | 业务方回调HTTP body ; 见数据字典《1.3 业务方事件回调 》 |
5 知识储备及参考
5.1 小程序授权
先授权登录 wx.login
wx.login({ success: res => {
var code = res.code;
console.log('-->授权code:'+code+');
}
再由code 获取小程序openid
https://api.weixin.qq.com/sns/component/jscode2session?appid="+appid+"&js_code="+code+"&grant_type=authorization_code
返回:
{"session_key":"i0AYAiSWiE\/CFuo3Lh0LGg==","openid":"oVdDt5YHVN-SIBTaVFxInPc4IzuI"}
6 参考资料
汇付天下API对接:
https://docs.adapay.tech/api/index.html
商户接入指引: https://docs.adapay.tech/help/in-guidelines.html
分帐接口:
https://docs.adapay.tech/api/trade.html#payment
实时分帐业务功能:
https://docs.adapay.tech/api/busiprocess.html#id2
支付方式:
https://docs.adapay.tech/api/paytype_introduce.html#
支付流程:
https://docs.adapay.tech/api/process.html
创建分帐对象
https://docs.adapay.tech/api/busiprocess.html#id2
https://docs.adapay.tech/api/busiprocess.html#id3
结算查询:
https://docs.adapay.tech/api/trade.html#settle-detail-query
原型: https://modao.cc/app/fQuUG9vyriwuyg8BXBe4C8 #支付中台-支付中台
社区支付: