From 8fccc950ddd107ed3f1484b99050e300b617fdd5 Mon Sep 17 00:00:00 2001 From: yixian Date: Tue, 28 Apr 2020 16:41:42 +1000 Subject: [PATCH] documents --- src/document/Dockerfile | 6 + src/document/default.conf | 13 + src/document/openapi/cn/components_order.yml | 420 +++++ src/document/openapi/cn/document.yml | 1337 ++++++++++++++++ .../cn}/img/JSAPI_process_cn.png | Bin .../cn}/img/QRCODE_process_ch.png | Bin .../{tpl => openapi/cn}/img/RetailQR_cn.png | Bin .../{tpl => openapi/cn}/img/Retail_cn.png | Bin .../cn}/img/RoyalPay_Gateway_choose_cn.jpg | Bin .../cn}/img/alipayOnline_cn.png | Bin .../cn}/img/glyphicons-halflings-white.png | Bin .../cn}/img/glyphicons-halflings.png | Bin .../cn}/img/h5_api_payment.jpg | Bin .../{tpl => openapi/cn}/img/jd_cn.png | Bin src/document/{tpl => openapi/cn}/img/logo.png | Bin src/document/openapi/cn/img/logo_new.jpg | Bin 0 -> 40600 bytes .../{tpl => openapi/cn}/img/microapp_cn.png | Bin src/document/openapi/cn/img/rp_logo.svg | 58 + .../cn}/img/sdk_api_payment.jpg | Bin .../cn}/img/sdk_wechat_api_payment_cn.png | Bin src/document/openapi/cn/index.html | 23 + src/document/openapi/en/components_order.yml | 410 +++++ src/document/openapi/en/document.yml | 1356 +++++++++++++++++ .../en}/img/JSAPI_process_en.png | Bin .../en}/img/QRCODE_process_en.png | Bin .../{tpl => openapi/en}/img/RetailQR_en.png | Bin .../{tpl => openapi/en}/img/Retail_en.png | Bin .../en}/img/RoyalPay_Gateway_choose_en.jpg | Bin .../en}/img/alipayOnline_en.png | Bin .../{tpl => openapi/en}/img/jd_en.png | Bin src/document/openapi/en/img/logo_new.jpg | Bin 0 -> 40600 bytes .../{tpl => openapi/en}/img/microapp_en.png | Bin src/document/openapi/en/img/rp_logo.svg | 58 + .../en}/img/sdk_wechat_api_payment_en.png | Bin src/document/openapi/en/index.html | 23 + .../resources/api/AlipaySDKForiOS.zip | Bin .../resources/api/alipaySdk-20160825.jar | Bin src/document/tpl/img/logo_new.jpg | Bin 12058 -> 0 bytes 38 files changed, 3704 insertions(+) create mode 100644 src/document/Dockerfile create mode 100644 src/document/default.conf create mode 100644 src/document/openapi/cn/components_order.yml create mode 100644 src/document/openapi/cn/document.yml rename src/document/{tpl => openapi/cn}/img/JSAPI_process_cn.png (100%) rename src/document/{tpl => openapi/cn}/img/QRCODE_process_ch.png (100%) rename src/document/{tpl => openapi/cn}/img/RetailQR_cn.png (100%) rename src/document/{tpl => openapi/cn}/img/Retail_cn.png (100%) rename src/document/{tpl => openapi/cn}/img/RoyalPay_Gateway_choose_cn.jpg (100%) rename src/document/{tpl => openapi/cn}/img/alipayOnline_cn.png (100%) rename src/document/{tpl => openapi/cn}/img/glyphicons-halflings-white.png (100%) rename src/document/{tpl => openapi/cn}/img/glyphicons-halflings.png (100%) rename src/document/{tpl => openapi/cn}/img/h5_api_payment.jpg (100%) rename src/document/{tpl => openapi/cn}/img/jd_cn.png (100%) rename src/document/{tpl => openapi/cn}/img/logo.png (100%) create mode 100644 src/document/openapi/cn/img/logo_new.jpg rename src/document/{tpl => openapi/cn}/img/microapp_cn.png (100%) create mode 100644 src/document/openapi/cn/img/rp_logo.svg rename src/document/{tpl => openapi/cn}/img/sdk_api_payment.jpg (100%) rename src/document/{tpl => openapi/cn}/img/sdk_wechat_api_payment_cn.png (100%) create mode 100644 src/document/openapi/cn/index.html create mode 100644 src/document/openapi/en/components_order.yml create mode 100644 src/document/openapi/en/document.yml rename src/document/{tpl => openapi/en}/img/JSAPI_process_en.png (100%) rename src/document/{tpl => openapi/en}/img/QRCODE_process_en.png (100%) rename src/document/{tpl => openapi/en}/img/RetailQR_en.png (100%) rename src/document/{tpl => openapi/en}/img/Retail_en.png (100%) rename src/document/{tpl => openapi/en}/img/RoyalPay_Gateway_choose_en.jpg (100%) rename src/document/{tpl => openapi/en}/img/alipayOnline_en.png (100%) rename src/document/{tpl => openapi/en}/img/jd_en.png (100%) create mode 100644 src/document/openapi/en/img/logo_new.jpg rename src/document/{tpl => openapi/en}/img/microapp_en.png (100%) create mode 100644 src/document/openapi/en/img/rp_logo.svg rename src/document/{tpl => openapi/en}/img/sdk_wechat_api_payment_en.png (100%) create mode 100644 src/document/openapi/en/index.html rename src/document/{tpl => openapi}/resources/api/AlipaySDKForiOS.zip (100%) rename src/document/{tpl => openapi}/resources/api/alipaySdk-20160825.jar (100%) delete mode 100644 src/document/tpl/img/logo_new.jpg diff --git a/src/document/Dockerfile b/src/document/Dockerfile new file mode 100644 index 000000000..e6a4de344 --- /dev/null +++ b/src/document/Dockerfile @@ -0,0 +1,6 @@ +FROM nginx:alpine + +COPY openapi/* /usr/share/nginx/html/ +COPY default.conf /etc/nginx/conf.d/ + +EXPOSE 80 \ No newline at end of file diff --git a/src/document/default.conf b/src/document/default.conf new file mode 100644 index 000000000..c8e646dea --- /dev/null +++ b/src/document/default.conf @@ -0,0 +1,13 @@ +server { + listen 80; + server_name _ default; + + location / { + root /usr/share/nginx/html/; + index index.html; + } + + location =/ { + rewrite / /cn/ redirect; + } +} \ No newline at end of file diff --git a/src/document/openapi/cn/components_order.yml b/src/document/openapi/cn/components_order.yml new file mode 100644 index 000000000..ea5149033 --- /dev/null +++ b/src/document/openapi/cn/components_order.yml @@ -0,0 +1,420 @@ + +orderBasic: + required: + - description + - currency + - price + properties: + description: + type: string + maxLength: 128 + description: 订单标题(最大长度128字符,超出自动截取) + price: + type: integer + description: 订单金额,单位为货币最小单位,例如100表示AUD1.00 + currency: + type: string + enum: + - AUD + - CNY + notify_url: + type: string + description: 支付通知回调url,详见支付通知api,不填不会推送支付通知。收到通知回调后强烈建议先进行主动查询再进行确认。 + operator: + type: string + description: 操作人员标识 +orderWithChannel: + allOf: + - $ref: '#/orderBasic' + - properties: + channel: + type: string + description: 支付渠道,大小写敏感 + enum: + - Alipay + - Wechat + type: object + required: + - channel +cardCustomerParam: + type: object + properties: + name: + type: string + description: 消费者姓名,不填会取持卡人姓名 + postcode: + type: string + example: 2000 + description: 澳大利亚邮编 + address: + type: string + description: 地址,可使用收货地址 + city: + type: string + example: Sydney + state: + type: string + example: VIC + country: + type: string + description: 2位国家代码 + example: AU + +cardCustomerInfo: + title: 卡信息 + properties: + bank: + type: string + description: 发卡行,可能拿不到 + card_type: + type: string + description: 卡类型 + example: credit/debit + card_alias: + type: string + description: 截断卡号,包含前6位和后3位 + example: 424242...242 + card_scheme: + description: 发卡组织 + type: string + example: VISA/MASTER + card_country: + description: 发卡国家 + type: string + example: AU + customer_id: + type: string + description: 当下单时tokenize=true或customer_id不为空时存在 +orderBasicResponse: + type: object + properties: + return_code: + type: string + description: 执行结果 + result_code: + type: string + description: SUCCESS表示创建订单成功,EXISTS表示订单已存在 + channel: + type: string + description: 支付渠道 + partner_code: + type: string + description: 商户编码 + full_name: + type: string + description: 商户注册全名 + partner_name: + type: string + description: 商户名称 + order_id: + type: string + description: RoyalPay订单ID,同时也是支付渠道订单ID,最终支付成功的订单ID可能不同 + partner_order_id: + type: string + description: 商户订单ID +orderStatus: + type: object + properties: + return_code: + type: string + description: 执行结果 + example: + SUCCESS + result_code: + type: string + description: | + 订单状态 + - PAYING: 等待支付 + - CREATE_FAIL: 创建失败 + - CLOSED: 已关闭 + - PAY_FAIL: 支付失败 + - PAY_SUCCESS: 支付成功 + - PARTIAL_REFUND: 部分退款 + - FULL_REFUND: 全额退款 + 如果需要可以用相同订单号再次发起支付单,支付成功或支付中的无法重复发起订单 + enum: + - PAYING + - CREATE_FAIL + - CLOSED + - PAY_FAIL + - PAY_SUCCESS + - PARTIAL_REFUND + - FULL_REFUND + order_id: + type: string + description: RoyalPay订单ID,同时也是支付渠道订单ID,最终支付成功的订单ID可能不同 + partner_order_id: + type: string + description: 商户订单ID + channel_order_id: + type: string + description: 渠道方(支付宝、微信)交易流水号 + total_fee: + type: integer + description: 订单金额,单位是货币最小面值单位 + real_fee: + type: integer + description: 实际支付金额,单位是货币最小面值单位(目前等于订单金额,为卡券预留) + currency: + type: string + description: 币种,通常为AUD + rate: + type: number + description: 交易时使用的汇率,1AUD=?CNY + pay_time: + type: string + format: 'date-time' + pattern: yyyy-mm-dd HH:mm:ss + description: 支付时间(yyyy-MM-dd HH:mm:ss,GMT+10) + create_time: + type: string + format: 'date-time' + pattern: yyyy-mm-dd HH:mm:ss + description: 订单创建时间(最新订单为准)(yyyy-MM-dd HH:mm:ss,GMT+10) + channel: + type: string + description: 支付渠道 + customer_info: + anyOf: + - title: 支付宝用户 + type: object + properties: + alipay_user_id: + type: string + description: 支付宝用户id + alipay_account: + type: string + description: 用户账号 + - $ref: 'components_order.yml#/cardCustomerInfo' +refundStatus: + type: object + properties: + return_code: + type: string + description: 执行结果 + example: + SUCCESS + result_code: + type: string + description: | + 退款状态 + - WAITING: 正在提交 + - CREATE_FAILED: 提交失败 + - SUCCESS: 提交成功,等待入账 + - FAILED: 退款失败 + - FINISHED: 退款成功,已入账 + enum: + - WATING + - CREATE_FAILED + - SUCCESS + - FAILED + - FINISHED + refund_id: + type: string + description: RoyalPay退款单号 + partner_refund_id: + type: string + description: 商户提交的退款单号 + amount: + type: integer + description: 退款金额,单位是货币最小单位 + currency: + type: string + description: 币种 + example: + AUD +transactionItem: + type: object + properties: + transaction_time: + type: string + format: 'date-time' + pattern: yyyyMMddHHmmss + description: 交易时间,格式yyyyMMddHHmmss,GMT+10 + partner_code: + type: string + description: 订单关联商户 + order_id: + type: string + description: RoyalPay订单ID + partner_order_id: + type: string + description: 商户订单ID + channel_order_id: + type: string + description: 渠道方订单号 + refund_id: + type: string + description: RoyalPay退款单号(仅退款或退款失败补正存在) + partner_refund_id: + type: string + description: 商户系统提交退款ID(仅退款或退款失败补正) + gateway: + type: integer + description: | + 下单接口 + - 0: RoyalPay POS机付款码(扫描客户展示的付款码) + - 1: RoyalPay POS机聚合支付码(客户扫描POS展示的二维码) + - 2: RoyalPay 商户静态码 + - 3: QRCode 网关 + - 4: JSAPI 网关 + - 5: 第三方POS付款码网关 + - 6: 第三方POS聚合支付码网关 + - 7: RoyalPay 商户静态码(已停用) + - 8: H5网关 + - 9: WEB网关 + - 10: SDK订单 + - 11: RoyalPay账单码 + - 12: 小程序 + - 13: 原生二维码订单 + - 14: RoyalPay账单链接 + - 15: 原生JSAPI + - 16: 卡支付预订单 + - 17: 卡支付订单 + - 18: DirectDebit + channel: + type: string + description: 下单渠道 + type: + type: string + description: 流水类别 + enum: + - Credit + - Debit + currency: + type: string + description: 订单币种 + example: + AUD + total_amount: + type: integer + description: 订单总金额,单位是货币最小单位 + input_amount: + type: integer + description: 订单输入金额,单位是货币最小单位 + customer_payment_amount: + type: integer + description: 用户实际支付金额,单位是货币最小单位 + settle_amount: + type: integer + description: 结算金额,币种为AUD,单位是货币最小单位 + transfer_amount: + type: integer + description: 打款金额(结算金额-手续费-GST),币种为AUD,单位是货币最小单位 + surcharge: + type: integer + description: 手续费,币种为AUD,单位是货币最小单位 + gst: + type: integer + description: GST金额,币种为AUD,单位是货币最小单位 + exchange_rate: + type: number + description: 使用汇率 + remark: + type: string + description: 备注 +customInfo: + type: object + properties: + report_id: + type: string + description: RoyalPay海关单号 + client_report_id: + type: string + description: 商户申请报关单号 + report_status: + type: string + description: 报关单状态 + enum: + - PROCESSING + - SUBMITED + - FAILED + - SUCCESS + channel: + type: string + description: 支付渠道 + custom: + type: string + description: 海关编号 + mch_custom_no: + type: string + description: 商户在海关备案的编号 + mch_custom_name: + type: string + description: 商户海关备案名称 + order_id: + type: string + description: RoyalPay订单号 + transaction_id: + type: string + description: 支付渠道订单号 + order_currency: + type: string + description: 币种 + order_amount: + type: number + description: 订单金额 + report_time: + type: string + format: 'date-time' + description: 报关时间 + creation_date: + format: 'date-time' + type: string + description: 报关单创建时间 + last_update_date: + type: string + format: 'date-time' + description: 更新时间 + error_code: + type: string + description: 错误代码 + error_msg: + type: string + description: 错误返回的信息描述 + verify_department: + type: string + description: 验核机构 + verify_department_trade_id: + type: string + description: 验核机构交易流水号 + sub_orders: + type: array + items: + type: object + properties: + sub_order_no: + type: string + description: 商户子订单号 + fee_type: + type: string + description: 币种代码 + default: CNY + enum: + - CNY + order_fee: + type: number + description: 子订单金额 + transport_fee: + type: number + description: 子订单物流金额 + verify_department: + type: string + description: 验核机构 + verify_department_trade_id: + type: string + description: 验核机构交易流水号 + report_status: + type: string + description: 报关单状态 + enum: + - PROCESSING + - SUBMITED + - FAILED + - SUCCESS + error_code: + type: string + description: 错误代码 + error_msg: + type: string + description: 错误返回的信息描述 \ No newline at end of file diff --git a/src/document/openapi/cn/document.yml b/src/document/openapi/cn/document.yml new file mode 100644 index 000000000..317eeb013 --- /dev/null +++ b/src/document/openapi/cn/document.yml @@ -0,0 +1,1337 @@ +openapi: 3.0.3 +info: + title: RoyalPay Developer Documents + version: 1.0.0 + x-logo: + url: img/rp_logo.svg + description: | + [English](/en/) + + # 请求方式和参数格式 + 支付单和退款单提交均为PUT方式,订单查询均为GET方式;包含Request Entity的请求参数格式为json + + 除跳转页面外,所有的Accept均为application/json;所有的PUT/POST请求Content-Type为application/json + + 系统使用UTF-8字符集 + + 参数分为三种:Path Variable/Query Param/JSON entity + + - PathVariable:包含在URI内的参数 + - Query Param:在URI末尾?后的key=value形式的参数 + - JSON entity:只在PUT/POST请求中使用 + 所有返回JSON的API,成功访问返回状态值均为200(不论执行结果)。JSON固定包含字段return_code,若值为SUCCESS则表示执行成功; 其他值表示执行失败,此时可查询错误码了解对应的错误类型,此时还会携带return_msg字段作为错误描述信息 + + # 多语言支持 + + 系统错误提示支持中文、英文两种语言,默认根据Request Header中的Accept-Language值自动选择,如需调整亦可以添加locale cookie进行指定。 + + # 选择接入API + + + # 支付宝渠道区分 + + 支付宝根据调用接口不同分为线上和线下两个渠道,两个渠道分别使用不同的汇率和手续费费率,为避免混淆在此区分: + + - 线上渠道:包含H5 Mobile、Web支付、APP SDK、JSAPI、QR Code 5种支付方式 + - 线下渠道:Retail Pay 支付方式 + + 相似接口区别 + + - JSAPI和H5 Mobile:JSAPI只能在支付宝客户端内访问的页面调起支付,H5可以在移动设备任意浏览器或App的WebView调起支付 + - Web支付和QR Code: Web支付会跳转到支付宝官方收银台,用户可以选择登陆账号或用客户端扫码完成支付;QR Code方式商户可以自行展示创建的二维码,也可以跳转到RoyalPay展示的收银台页面显示二维码,用户只能用支付宝客户端扫码完成支付。 + + # 币种代码 + + 由于渠道方限制原因,RoyalPay只接受人民币和澳元两个币种标价的支付订单。其中银行卡支付渠道仅支持AUD下单。无论标价是什么币种最终结算币种为AUD + + - AUD:澳元 + - CNY:人民币 + + 除报关相关API以外,接口中的金额都应该取*币种最小单位*,如人民币和澳元都应该用分作为标价。如AUD 1.00的订单提交的金额参数为100 + + # 业务规则 + + - QRCode支付是在网页上展示二维码,用户使用微信扫一扫扫码后直接进入微信支付页面,适用于商城类web网站; + - JSAPI支付是在微信浏览器内直接跳转到RoyalPay让用户选择支付订单,页面只能在微信客户端打开,适用于微店; + - 创建订单时需要提供订单号,同一个订单允许重复提交,系统会自动根据订单状态判断是否创建新订单并关闭旧订单。因此商户端应该同一个订单只用一个单号,避免重复付款; + - 由于存在自动创建新订单机制,创建订单后返回的RoyalPay单号不代表最终支付的单号; + - QRCode支付订单创建后会直接返回QRCode和pay_url,商户可以自行选择展示支付二维码或跳转至RoyalPay支付页; + - JSAPI支付订单创建后会返回pay_url,商户应该跳转到这个地址让用户完成支付; + - 跳转pay_url时必须加上签名信息; + - 每次请求都应该生成新的签名; + - 订单成功支付后会调用订单中提供的notify_url,详情可以查看API定义;若创建订单时未提供,商户需要在创建订单后轮询订单状态接口,直到订单被支付或过期; + - 订单支付有效期为5分钟,超时可以用相同的订单号重新发起请求,建议重新发起请求的时机为用户再次打开支付页的时候; + - 使用跳转支付页前应该先调用后台服务输入金额等参数创建订单后再跳转; + - 创建订单、创建退款接口都允许同订单号重复调用,但是具体参数以初次请求的参数为准; + - 所有和金额相关的数字均以货币最小面值为单位,以AUD为例,100表示AUD 1.00。 + + # 案例 + https://example.royalpay.com.au/api/payment/order + + + + # 示例代码 + - PHP: https://mpay.royalpay.com.au/static/phpdemo.zip + - Java: https://mpay.royalpay.com.au/static/javademo.zip + + # 错误码参考 + ## 通用错误码 + - SYSTEMERROR: 系统内部异常 + - INVALID_SHORT_ID: 商户编码不合法或没有对应商户 + - SIGN_TIMEOUT: 签名超时,time字段与服务器时间相差超过5分钟 + - SIGN_EXPIRED: 签名失效,签名被重复使用 + - INVALID_SIGN: 签名错误 + - PARAM_INVALID: 参数不符合要求,具体细节可参考return_msg字段 + + ## 下单错误码 + - NOT_PERMITTED: 未开通网关支付权限 + - INVALID_CHANNEL: 不合法的支付渠道名称,请检查大小写 + - ORDER_MISMATCH: 订单号与商户不匹配 + - AUTHCODEEXPIRE: 二维码已过期 + - NOTSUPORTCARD: 不支持卡类型 + - AUTH_CODE_ERROR: 二维码被重复提交 + - AUTH_CODE_INVALID: 非法二维码 + - NOTENOUGH: 账户余额不足 + - ORDER_PAID: 订单已支付 + +servers: + - url: https://mpay.royalpay.com.au/api/v1.0 + description: production + - url: https://sandbox.royalpay.com.au/api/v1.0 + description: sandbox +tags: + - name: PublicApi + description: 公共API + - name: QRCode + description: | + QRCode支付单适用于PC端网页/应用进行支付,用户使用微信/支付宝客户端扫描下单后生成的二维码完成支付。 + + 返回值包括二维码字符串,二维码图片,支付地址,商户可以自行决定直接展示二维码或跳转支付页,跳转支付页需要带上签名信息。 货币类型如果是CNY,注意通过汇率转换后不得低于0.01AUD,否则订单可以创建成功,但支付时会报金额不合法错误 + - name: JSAPI + description: | + JSAPI适用于在微信/支付宝内打开的网页进行支付,如果用户从微信公众号进入支付页要求公众号已完成认证。用户下单后跳转至RoyalPay订单页,并拉起微信或支付宝内置收银台完成支付 + + 返回值包括支付地址,商户应该引导用户跳转支付页,跳转支付页需要带上签名信息; 货币类型如果是CNY,注意通过汇率转换后不得低于0.01AUD,否则订单可以创建成功,但支付时会报金额不合法错误 + - name: MobileH5 + description: | + 创建H5支付单(仅支持支付宝) + H5支付适用场景为移动端App或者手机自带浏览器进行支付,用户下单后浏览器跳转至微信支付页面并自动拉起支付宝客户端完成支付。 + 返回值包括跳转支付地址,跳转支付页需要带上签名信息。 货币类型如果是CNY,注意通过汇率转换后不得低于0.01AUD,否则订单可以创建成功,但支付时会报金额不合法错误 + + - name: MiniProgram + description: | + 接入微信小程序需完成海外主体认证,并且认证主体需要与在RoyalPay开通的商户主体一致。具体如何认证请查看微信公众平台相关文档。 + 用于小程序中发起支付,创建订单后返回小程序支付所需参数,[微信接入参考文档](https://www.royalpay.com.au/downloads/MiniProgram_WechatPay.pdf) + + - name: CardPayment + description: | + 卡支付即消费者输入银行卡信息进行下单的接口,接入卡支付需要额外的合规流程。 + - name: RetailPay + description: | + 线下支付订单接口用于线下零售收银,有B扫C和C扫B两种模式 + - name: AlipayOnline + description: | + 用于PC端支付宝支付,创建订单后跳转到返回的pay_url(需附加签名参数和redirect参数),随后进入支付宝支付页面完成支付 + 该接口现仅支持支付宝。 + + - name: CB Bank + description: | + 用于PC端网银快捷支付,创建订单后跳转到返回的pay_url,随后进入网银快捷支付页面完成支付 + - name: SDK Payment + description: | + 用于移动端APP调用微信/支付宝SDK支付,调用API创建订单,得到微信SDK调用参数,将参数传递给SDK拉起微信/支付宝支付,并由客户端直接返回支付结果。 强烈建议获得支付结果后再调用RoyalPay订单查询API确认完成支付后再进行后续流程,避免因超时自动撤单导致资金损失 + + 关于客户端和支付宝整和的更多信息:[支付宝SDK文档](https://global.alipay.com/doc/app_cn/about) + 关于客户端和微信整合的更多信息:[微信SDK文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1) + [Alipay SDK for Android](resources/api/alipaySdk-20160825.jar) + [Alipay SDK for iOS](resources/api/AlipaySDKForiOS.zip) + [Wechat SDK for Android](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN) + [Wechat SDK for iOS](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN) + + - name: Custom + description: 用于商户提交海关需要的订单附件信息。仅支持微信和支付宝,微信只支持一个月内的支付订单进行报关申请。 +security: + - sign: [] + nonce_str: [] + time: [] +paths: + /gateway/partners/{partner_code}/orders/{partner_order_id}: + put: + tags: + - QRCode + summary: 创建QRCode支付单 + x-sort-order: 0 + parameters: + - name: partner_code + in: path + required: true + description: 商户编码,由4位大写字母或数字构成 + - name: partner_order_id + in: path + required: true + description: 商户支付订单号,要求同一商户唯一 + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderWithChannel' + responses: + 200: + description: 执行结果 + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + code_url: + type: string + description: 支付码字符串,商户可以据此自行生产二维码 + qrcode_img: + type: string + description: Base64封装的二维码图片,可直接作为img的src属性 + pay_url: + type: string + description: 收银台URL,如果商户选择跳转到royalpay的QR收银台可使用此url + get: + summary: 查询订单状态 + x-sort-order: 9 + tags: + - SDK Payment + - CB Bank + - RetailPay + - AlipayOnline + - CardPayment + - MiniProgram + - MobileH5 + - JSAPI + - QRCode + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + responses: + 200: + description: Order Status + content: + application/json: + schema: + $ref: 'components_order.yml#/orderStatus' + delete: + summary: 关闭订单 + x-sort-order: 10 + tags: + - SDK Payment + - CB Bank + - RetailPay + - AlipayOnline + - CardPayment + - MiniProgram + - MobileH5 + - JSAPI + - QRCode + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + responses: + 200: + description: Order Status + content: + application/json: + schema: + $ref: 'components_order.yml#/orderStatus' + /gateway/partners/{partner_code}/native_orders/{partner_order_id}: + put: + tags: + - QRCode + summary: 创建原生QRCode支付单 + description: | + 原生二维码支付单展示的是直接由微信、支付宝生成的收款码,扫码后直接在APP内加载,对于消费者网络环境不佳的场景具有一定帮助 + parameters: + - name: partner_code + in: path + required: true + description: 商户编码,由4位大写字母或数字构成 + - name: partner_order_id + in: path + required: true + description: 商户支付订单号,要求同一商户唯一 + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderWithChannel' + responses: + 200: + description: 执行结果 + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + code_url: + type: string + description: 支付码字符串,商户可以据此自行生产二维码 + qrcode_img: + type: string + description: Base64封装的二维码图片,可直接作为img的src属性 + pay_url: + type: string + description: 收银台URL,如果商户选择跳转到royalpay的QR收银台可使用此url + /gateway/partners/{partner_code}/orders/{partner_order_id}/pay: + get: + tags: + - QRCode + summary: QRCode支付页 + x-sort-order: 2 + description: 必须先调用创建QRCode订单接口再进行跳转。 建议在用户回调到对应页时通过后台查询订单状态接口确认订单的支付状态。 + parameters: + - name: partner_code + in: path + required: true + description: 商户编码,由4位大写字母或数字构成 + - name: partner_order_id + in: path + required: true + description: 商户支付订单号,要求同一商户唯一 + - name: redirect + required: true + in: query + description: 支付成功后跳转页面,回调时会带上签名参数用于校验 + responses: + 200: + description: 支付页面 + content: + text/html: + schema: + type: string + /jsapi_gateway/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 创建JSAPI订单 + description: 创建JSAPI订单 + x-sort-order: 0 + tags: + - JSAPI + parameters: + - name: partner_code + in: path + required: true + description: 商户编码,由4位大写字母或数字构成 + - name: partner_order_id + in: path + required: true + description: 商户支付订单号,要求同一商户唯一 + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderWithChannel' + responses: + 200: + description: 执行结果 + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: 收银台URL,加签后传递给前端并跳转至当前URL,让消费者完成支付 + /wechat_jsapi_gateway/partners/{partner_code}_order_{partner_order_id}: + get: + summary: 微信JSAPI支付跳转页 + description: 微信JSAPI支付跳转页,建议优先使用下单返回的pay_url字段 + x-sort-order: 2 + tags: + - JSAPI + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + - name: redirect + in: query + description: 支付完成回调,注意转义 + - name: directpay + in: query + description: 是否进入页面后直接发起支付 + schema: + type: boolean + responses: + 200: + description: 微信JSAPI支付跳转页 + content: + text/html: + schema: + type: string + /gateway/alipay/partners/{partner_code}/orders/{partner_order_id}/app_pay: + get: + summary: 支付宝JSAPI支付跳转页 + description: 支付宝JSAPI支付跳转页,建议优先使用下单返回的pay_url字段 + x-sort-order: 2 + tags: + - JSAPI + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + - name: redirect + in: query + description: 支付完成回调,注意转义 + - name: directpay + in: query + description: 是否进入页面后直接发起支付 + schema: + type: boolean + responses: + 200: + description: 支付宝JSAPI支付跳转页 + content: + text/html: + schema: + type: string + /h5_payment/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: MobileH5下单 + description: 仅支持支付宝接口 + x-sort-order: 0 + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + tags: + - MobileH5 + requestBody: + content: + application/json: + schema: + type: object + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + properties: + channel: + type: string + description: 支付渠道,大小写敏感 + enum: + - Alipay + responses: + 200: + description: Order + content: + application/json: + schema: + type: object + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: 收银台URL,加签后传递给前端并跳转至当前URL,让消费者完成支付 + /h5_payment/partners/{partner_code}/orders/{partner_order_id}/pay: + get: + summary: H5支付跳转页 + description: H5支付跳转页,建议优先使用下单返回的pay_url字段 + x-sort-order: 2 + tags: + - MobileH5 + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + - name: redirect + in: query + description: 支付完成回调,注意转义 + responses: + 200: + description: H5支付跳转页 + content: + text/html: + schema: + type: string + /gateway/partners/{partner_code}/microapp_orders/{partner_order_id}: + put: + summary: 小程序下单 + x-sort-order: 0 + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + tags: + - MiniProgram + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderWithChannel' + - type: object + properties: + appid: + type: string + description: 小程序appid,接入微信小程序必填,支付宝小程序不需要 + customer_id: + type: string + description: 小程序获取的用户id(微信为openid, 支付宝为userid) + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + sdk_params: + type: string + description: 序列化后的json字符串,直接提交给小程序端作为参数发起支付 + /gateway/partners/{partner_code}/pre_card_orders/{partner_order_id}: + put: + summary: 卡支付预定单 + x-sort-order: 1 + description: | + 预订单模式是先提交基础下单参数,然后跳转到royalpay网关页让消费者完成卡信息提交并完成支付。 + 卡支付预订单允许消费者多次尝试输入,因此除非主动关闭订单,订单会一直持续到有效期结束。 + tags: + - CardPayment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + properties: + domestic_only: + type: boolean + default: false + description: 是否只允许本国卡。由于境内境外卡支付手续费差异巨大,可在此限制。 + disable_credit_card: + type: boolean + default: false + description: 如果希望禁止消费者使用信用卡支付可传入true + tokenize: + type: boolean + default: false + description: 支付成功后是否返回消费者ID,此后下单可以提供customer_id免去消费者输入卡号、有效期等步骤,仅需要输入CVV2/CVC码。 + customer_id: + type: string + description: 使用tokenize得到的customer_id下单,当customer_id不为空时,tokenize参数无效,可免去消费者输入卡号、有效期等步骤,仅需要输入CVV2/CVC码。 + customer: + $ref: 'components_order.yml#/cardCustomerParam' + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: 收银台URL,加签后传递给前端并跳转至当前URL,让消费者完成支付 + /card_payment_view/partners/{partner_code}/orders/{partner_order_id}/view: + get: + summary: 卡支付收银台 + description: 建议以下单返回的pay_url为准 + x-sort-order: 2 + tags: + - CardPayment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + - name: redirect + in: query + description: 支付完成同步回调,注意转义 + responses: + 200: + description: 支付跳转页 + content: + text/html: + schema: + type: string + /gateway/partners/{partner_code}/card_orders/{partner_order_id}: + put: + summary: 卡支付下单 + x-sort-order: 0 + description: | + 商户可在页面引入https://channel.rpayplus.com/channel/v1/view/card_input_frame.js + 并通过回调取得key_id和secret信息,并将其作为卡信息提交给royalpay直接完成下单支付。 + + js引用案例: + ``` + let cardInputContainer = document.getElementById('card-input-area');//预先准备放置卡输入界面的container + let cardInput = new CardInputFrame(cardInputContainer);//创建frame对象 + //设置iframe的样式参数 + cardInput.frameStyle = { + width: '100%', + height: '400px', + border: 'none', + borderRadius: '10px' + }; + cardInput.onError = function(msg){ + //卡输入界面返回错误信息时进行展示 + }; + cardInput.onReady = function(){ + //iframe加载完毕的触发事件 + }; + cardInput.onSuccess = function(secretData){ + //成功取得加密卡信息回调 + //secretData: {'key_id':'','secret':''} + }; + cardInput.show();//开始加载iframe + + //通过外部事件触发卡输入界面提交,注意卡输入界面没有按钮,必须通过外部触发提交事件。并回调到onSuccess回调函数。 + cardInput.commit(); + ``` + tags: + - CardPayment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - key_id + - card_info + properties: + key_id: + type: string + description: 卡输入界面回调得到的key_id + card_info: + type: string + description: 卡输入界面回调得到的secret + domestic_only: + type: boolean + default: false + description: 是否只允许本国卡。由于境内境外卡支付手续费差异巨大,可在此限制。 + disable_credit_card: + type: boolean + default: false + description: 如果希望禁止消费者使用信用卡支付可传入true + customer: + $ref: 'components_order.yml#/cardCustomerParam' + responses: + 200: + description: Order + content: + application/json: + schema: + $ref: 'components_order.yml#/orderBasicResponse' + /micropay/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 付款码下单 + x-sort-order: 0 + description: | + 线下支付订单接口用于带有扫码设备的收银终端进行对接,商户输入金额后要求客户出示支付码,用扫码枪扫码后将扫码内容和金额一并提交并完成支付操作。 + 线下支付订单接口现已兼容微信、支付宝通道。可根据付款码自动识别交易渠道。 + + tags: + - RetailPay + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - auth_code + - device_id + properties: + device_id: + type: string + description: 扫码设备id + auth_code: + type: string + description: 付款码 + responses: + 200: + description: Result + content: + application/json: + schema: + $ref: 'components_order.yml#/orderStatus' + /retail_qrcode/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 线下QRCode支付单 + x-sort-order: 1 + description: | + 线下QRCode支付用于对接无扫码设备的收银终端,下单后得到二维码地址,自行生成二维码图片后展示在收银终端屏幕上,并由用户使用对应支付客户端进行扫码支付。 线下QRCode现已同时兼容支付宝、微信客户端进行支付 + + tags: + - RetailPay + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - device_id + properties: + device_id: + type: string + description: 收银设备id + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + code_url: + type: string + description: 付款码字符串,商户可自行生成二维码 # todo + /alipay/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 支付宝WEB订单下单 + x-sort-order: 0 + description: | + 创建订单后跳转到返回的pay_url(需附加签名参数和redirect参数),随后进入支付宝支付页面完成支付 + 该接口现仅支持支付宝。 + tags: + - AlipayOnline + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderBasic' + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: 收银台URL,加签后传递给前端并跳转至当前URL,让消费者完成支付 + /cb_bankpay/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 网银快捷支付下单 + x-sort-order: 0 + tags: + - CB Bank + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - product_name + - gateway_type + properties: + product_name: + type: string + description: 商品名称 + gateway_type: + type: integer + description: '网关类型,8: H5网关,9:PC网关' + enum: + - 8 + - 9 + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: 收银台URL,加签后传递给前端并跳转至当前URL,让消费者完成支付 + /gateway/partners/{partner_code}/app_orders/{partner_order_id}: + put: + summary: SDK下单 + x-sort-order: 0 + tags: + - SDK Payment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - channel + properties: + channel: + type: string + description: 支付渠道,大小写敏感 + enum: + - Wechat + - Alipay + system: + type: string + description: 客户端操作类型,支付宝选填,微信不需要 + enum: + - android + - iphone + - ipad + version: + type: string + description: 客户端版本号,支付宝选填,微信不需要 + appid: + type: string + description: 微信必填,开发者平台appid + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + sdk_params: + type: string + description: json字符串,可直接传递给SDK端发起支付 + /gateway/partners/{partner_code}/channel_exchange_rate: + get: + summary: 渠道汇率查询 + description: 获取当前各渠道AUD兑CNY汇率值(1AUD=?CNY),该汇率仅做参考,以实际成交汇率为准 + tags: + - PublicApi + parameters: + - name: partner_code + in: path + required: true + responses: + 200: + description: exchange rate + content: + application/json: + schema: + type: object + description: OK + properties: + return_code: + type: string + description: 状态码 + example: + SUCCESS + wechat_rate: + type: number + description: 微信当前汇率 + example: + 4.41111 + alipay_retail_rate: + type: number + description: 支付宝线下接口汇率 + example: + 4.411111 + alipay_online_rate: + type: number + description: 支付宝线上汇率 + example: + 4.411111 + /gateway/partners/{partner_code}/orders/{partner_order_id}/refunds/{partner_refund_id}: + put: + summary: 发起退款 + x-sort-order: 11 + description: 一笔支付订单可以分多次退款,退款总金额不得超过实际支付金额,退款币种与支付订单一致 + tags: + - QRCode + - JSAPI + - MobileH5 + - MiniProgram + - CardPayment + - AlipayOnline + - RetailPay + - CB Bank + - SDK Payment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + description: 需要退款订单的单号 + - name: partner_refund_id + in: path + required: true + description: 退款单号 + requestBody: + content: + application/json: + schema: + type: object + required: + - fee + properties: + fee: + type: integer + description: 退款金额,单位是货币最小单位,单个订单退款单金额总和不能超过用户支付金额 + device_id: + type: string + description: 操作设备id + responses: + 200: + description: Refund + content: + application/json: + schema: + $ref: 'components_order.yml#/refundStatus' + get: + summary: 查询退款 + x-sort-order: 12 + tags: + - QRCode + - JSAPI + - MobileH5 + - MiniProgram + - CardPayment + - AlipayOnline + - RetailPay + - CB Bank + - SDK Payment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + description: 需要退款订单的单号 + - name: partner_refund_id + in: path + required: true + description: 退款单号 + responses: + 200: + description: Refund Status + content: + application/json: + schema: + $ref: 'components_order.yml#/refundStatus' + /gateway/partners/{partner_code}/transactions: + get: + summary: 查询流水 + description: | + 本接口将列出商户当日所有流水,包括所有接口(含非网关接口)支付通道的付款、RoyalPay优惠补贴、退款、 退款失败补正、系统补正、营销账户转入转出等,不含清算信息 + 注意一笔付款订单或退款订单均可能对应多条流水记录 + tags: + - PublicApi + parameters: + - name: partner_code + in: path + required: true + - name: date + schema: + format: date + pattern: yyyyMMdd + type: string + in: query + required: true + description: 账单日期,'yyyyMMdd'格式,GMT+10,只能查今天以前的账单 + example: 20200315 + responses: + 200: + description: Orders + content: + application/json: + schema: + type: object + properties: + return_code: + type: string + description: 执行结果 + example: + SUCCESS + result_code: + type: string + description: 业务执行结果 + example: + SUCCESS + transaction_count: + type: integer + description: 流水条数 + order_count: + type: integer + description: 付款条数 + refund_count: + type: integer + description: 退款条数 + transactions: + type: array + items: + $ref: 'components_order.yml#/transactionItem' + /gateway/partners/{partner_code}/settlements: + get: + summary: 查看清算详情 + description: | + 本接口将列出商户查询日期清算的所有流水,包括所有接口(含非网关接口)支付通道的付款、RoyalPay优惠补贴、退款、 退款失败补正、系统补正、营销账户转入转出等 + 注意一笔付款订单或退款订单均可能对应多条流水记录 + tags: + - PublicApi + parameters: + - name: partner_code + in: path + required: true + - name: date + in: query + schema: + format: date + pattern: yyyyMMdd + type: string + description: 清算日期,'yyyyMMdd'格式,GMT+10,只能查今天以前 + required: true + responses: + 200: + description: Settlements + content: + application/json: + schema: + type: object + properties: + return_code: + type: string + description: 执行结果 + example: + SUCCESS + result_code: + type: string + description: 业务执行结果 + example: + SUCCESS + settle_from: + type: string + format: date + description: 订单起始日期:yyyyMMdd + settle_to: + type: string + format: date + description: 订单截止日期:yyyyMMdd + settle_days: + type: string + description: 清算周期 + example: + T+2 + transaction_count: + type: integer + description: 流水条数 + order_count: + type: integer + description: 付款条数 + refund_count: + type: integer + description: 退款条数 + total_credit: + type: integer + description: 入账总金额(AUD分) + total_debits: + type: integer + description: 支出总金额(AUD分) + total_surcharge: + type: integer + description: 手续费总额(AUD分) + total_transfer: + type: integer + description: 打款总额(AUD分) + transactions: + type: array + items: + $ref: 'components_order.yml#/transactionItem' + /notify: + post: + summary: 到账通知 + description: | + 若订单创建时提供了notify_url,系统会在用户支付成功后向这个地址主动发送支付成功状态推送,请求方式为POST + 与服务器API不同,推送校验参数会包含在json内,商户系统应该验证校验参数,确定来源正确后再次进行订单接口查询确认订单支付状态再进行后续操作。 + 商户系统收到请求后应按要求返回参数,若RoyalPay未收到合法参数,视为商户未接收成功,推送动作首次触发会重试3次,随后24小时内每10分钟推送一次,直到返回200状态码。 + 商户系统应当能够处理收到的重复请求。 + 商户系统收到通知后以防万一应调用主动查询接口确认订单状态。 + tags: + - SDK Payment + - CB Bank + - RetailPay + - AlipayOnline + - CardPayment + - MiniProgram + - MobileH5 + - JSAPI + - QRCode + requestBody: + content: + application/json: + schema: + type: object + properties: + time: + type: integer + format: int64 + description: UTC时间戳 + nonce_str: + type: string + description: 随机字符串 + sign: + type: string + description: 签名 + partner_order_id: + type: string + description: 商户单号 + channel_order_id: + type: string + description: 渠道方交易单号 + order_id: + type: string + description: RoyalPay订单号 + total_fee: + type: integer + description: 订单金额,单位是最小货币单位 + real_fee: + type: integer + description: 支付金额,单位是最小货币单位 + rate: + type: number + description: 交易时使用的汇率,1AUD=?CNY + currency: + type: string + description: 币种,AUD + channel: + type: string + description: 交易渠道 + create_time: + type: string + format: 'date-time' + pattern: yyyy-MM-dd HH:mm:ss + description: 订单创建时间,格式为'yyyy-MM-dd HH:mm:ss',GMT+10 + pay_time: + type: string + format: 'date-time' + pattern: yyyy-MM-dd HH:mm:ss + description: 订单支付时间,格式为'yyyy-MM-dd HH:mm:ss',GMT+10 + responses: + 200: + description: OK + /customs/partners/{partner_code}/declare/report/{client_report_id}: + put: + summary: 创建报关单 + tags: + - Custom + parameters: + - name: partner_code + in: path + required: true + - name: client_report_id + in: path + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + order_id: + type: string + description: 商户支付订单号,要求同一商户唯一 + custom: + type: string + description: 海关编号 * [渠道海关编号](https://www.royalpay.com.au/downloads/CustomsNO.xlsx) + mch_custom_id: + type: string + description: 商户在海关备案的编号 + mch_custom_name: + type: string + description: 商户海关备案名称 + sub_order: + type: array + description: 子订单(拆单) + items: + type: object + properties: + sub_order_no: + type: string + description: 商户子订单号 + fee_type: + type: string + description: 币种代码 + default: CNY + enum: + - CNY + order_fee: + type: number + description: 子订单金额,单位是元 + transport_fee: + type: number + description: 子订单物流金额,单位是元 + responses: + 200: + description: Custom + content: + application/json: + schema: + $ref: 'components_order.yml#/customInfo' + get: + summary: 查询报关单 + tags: + - Custom + parameters: + - name: partner_code + in: path + required: true + - name: client_report_id + in: path + required: true + responses: + 200: + description: Custom + content: + application/json: + schema: + $ref: 'components_order.yml#/customInfo' + /customs/partners/{partner_code}/redeclare/report/{client_report_id}: + put: + summary: 重新提交报关单 + description: 用于重新提交未报关成功的报关单 + tags: + - Custom + parameters: + - name: partner_code + in: path + required: true + - name: client_report_id + in: path + required: true + responses: + 200: + description: Custom + content: + application/json: + schema: + $ref: 'components_order.yml#/customInfo' +components: + securitySchemes: + nonce_str: + type: apiKey + in: query + name: nonce_str + description: 随机字符串 + time: + type: apiKey + in: query + name: time + description: 带毫秒的Unix时间戳,务必检查服务器时间和时区配置。计算服务器上的UTC时间是否匹配真实UTC时间即可。允许误差±5分钟 + sign: + type: apiKey + in: query + name: sign + description: | + 商户签约后会分配得到一个partner_code和credential_code用于签名,其中partner_code随请求传递,credential_code务必自行存储不得外泄,仅作为签名参数。 + + 每次请求都必须加入签名信息作为请求校验。校验参数全部以Query Param参数的方式附加在URL后面,顺序不分先后。 + + 签名过程: + + 1. 连接生成签名的原始字符串,需要4个参数,使用&连接,无需转码 + > valid_string=partner_code&time&nonce_str&credential_code + + 2. 使用SHA256对valid_string进行签名,并转换为小写字符串 + > sign=hex(sha256(valid_string)).toLowerCase() + + 3. 在请求中将签名使用的time, nonce_str和生成的sign作为query参数发送 + + > 签名测试地址:https://mpay.royalpay.com.au/sign_test.html + + diff --git a/src/document/tpl/img/JSAPI_process_cn.png b/src/document/openapi/cn/img/JSAPI_process_cn.png similarity index 100% rename from src/document/tpl/img/JSAPI_process_cn.png rename to src/document/openapi/cn/img/JSAPI_process_cn.png diff --git a/src/document/tpl/img/QRCODE_process_ch.png b/src/document/openapi/cn/img/QRCODE_process_ch.png similarity index 100% rename from src/document/tpl/img/QRCODE_process_ch.png rename to src/document/openapi/cn/img/QRCODE_process_ch.png diff --git a/src/document/tpl/img/RetailQR_cn.png b/src/document/openapi/cn/img/RetailQR_cn.png similarity index 100% rename from src/document/tpl/img/RetailQR_cn.png rename to src/document/openapi/cn/img/RetailQR_cn.png diff --git a/src/document/tpl/img/Retail_cn.png b/src/document/openapi/cn/img/Retail_cn.png similarity index 100% rename from src/document/tpl/img/Retail_cn.png rename to src/document/openapi/cn/img/Retail_cn.png diff --git a/src/document/tpl/img/RoyalPay_Gateway_choose_cn.jpg b/src/document/openapi/cn/img/RoyalPay_Gateway_choose_cn.jpg similarity index 100% rename from src/document/tpl/img/RoyalPay_Gateway_choose_cn.jpg rename to src/document/openapi/cn/img/RoyalPay_Gateway_choose_cn.jpg diff --git a/src/document/tpl/img/alipayOnline_cn.png b/src/document/openapi/cn/img/alipayOnline_cn.png similarity index 100% rename from src/document/tpl/img/alipayOnline_cn.png rename to src/document/openapi/cn/img/alipayOnline_cn.png diff --git a/src/document/tpl/img/glyphicons-halflings-white.png b/src/document/openapi/cn/img/glyphicons-halflings-white.png similarity index 100% rename from src/document/tpl/img/glyphicons-halflings-white.png rename to src/document/openapi/cn/img/glyphicons-halflings-white.png diff --git a/src/document/tpl/img/glyphicons-halflings.png b/src/document/openapi/cn/img/glyphicons-halflings.png similarity index 100% rename from src/document/tpl/img/glyphicons-halflings.png rename to src/document/openapi/cn/img/glyphicons-halflings.png diff --git a/src/document/tpl/img/h5_api_payment.jpg b/src/document/openapi/cn/img/h5_api_payment.jpg similarity index 100% rename from src/document/tpl/img/h5_api_payment.jpg rename to src/document/openapi/cn/img/h5_api_payment.jpg diff --git a/src/document/tpl/img/jd_cn.png b/src/document/openapi/cn/img/jd_cn.png similarity index 100% rename from src/document/tpl/img/jd_cn.png rename to src/document/openapi/cn/img/jd_cn.png diff --git a/src/document/tpl/img/logo.png b/src/document/openapi/cn/img/logo.png similarity index 100% rename from src/document/tpl/img/logo.png rename to src/document/openapi/cn/img/logo.png diff --git a/src/document/openapi/cn/img/logo_new.jpg b/src/document/openapi/cn/img/logo_new.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41c02602aa29c817d8f8eef48a9183dd005c982d GIT binary patch literal 40600 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 literal 0 HcmV?d00001 diff --git a/src/document/tpl/img/microapp_cn.png b/src/document/openapi/cn/img/microapp_cn.png similarity index 100% rename from src/document/tpl/img/microapp_cn.png rename to src/document/openapi/cn/img/microapp_cn.png diff --git a/src/document/openapi/cn/img/rp_logo.svg b/src/document/openapi/cn/img/rp_logo.svg new file mode 100644 index 000000000..d57a76e21 --- /dev/null +++ b/src/document/openapi/cn/img/rp_logo.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/document/tpl/img/sdk_api_payment.jpg b/src/document/openapi/cn/img/sdk_api_payment.jpg similarity index 100% rename from src/document/tpl/img/sdk_api_payment.jpg rename to src/document/openapi/cn/img/sdk_api_payment.jpg diff --git a/src/document/tpl/img/sdk_wechat_api_payment_cn.png b/src/document/openapi/cn/img/sdk_wechat_api_payment_cn.png similarity index 100% rename from src/document/tpl/img/sdk_wechat_api_payment_cn.png rename to src/document/openapi/cn/img/sdk_wechat_api_payment_cn.png diff --git a/src/document/openapi/cn/index.html b/src/document/openapi/cn/index.html new file mode 100644 index 000000000..6b6d61ff8 --- /dev/null +++ b/src/document/openapi/cn/index.html @@ -0,0 +1,23 @@ + + + + + RoyalPay Document + + + + + + + + + + + \ No newline at end of file diff --git a/src/document/openapi/en/components_order.yml b/src/document/openapi/en/components_order.yml new file mode 100644 index 000000000..26c44a097 --- /dev/null +++ b/src/document/openapi/en/components_order.yml @@ -0,0 +1,410 @@ + +orderBasic: + required: + - description + - currency + - price + properties: + description: + type: string + maxLength: 128 + description: Order title(Max 128 characters. Will cut automatically if too long.) + price: + type: integer + description: Order price. Minimal unit of currency. eg, 100 for AUD 1.00 + currency: + type: string + enum: + - AUD + - CNY + notify_url: + type: string + description: payment notification url. for details please visit notify api. will not post notifications if leave it null. Recommended to call order query api to confirm order status when received notification. + operator: + type: string + description: mark of operator +orderWithChannel: + allOf: + - $ref: '#/orderBasic' + - properties: + channel: + type: string + description: order channel. case sensitive + enum: + - Alipay + - Wechat + type: object + required: + - channel +cardCustomerParam: + properties: + name: + type: string + description: customer name. will use card holder name if leave it empty + postcode: + type: string + example: 2000 + address: + type: string + city: + type: string + example: Sydney + state: + type: string + example: VIC + country: + type: string + description: 2-character country code + example: AU + +cardCustomerInfo: + type: object + title: Card customer info + properties: + bank: + type: string + description: bank name who issued the card. may be empty + card_type: + type: string + description: card type + example: credit/debit + card_alias: + type: string + description: part of card number. for customers to recognize which card they used + example: 424242...242 + card_scheme: + description: card scheme who issued the card + type: string + example: VISA/MASTER + card_country: + description: nation code who issued the card + type: string + example: AU + customer_id: + type: string + description: customer id. if you provided customer_id param or passed tokenize=true param. it will appear +orderBasicResponse: + type: object + properties: + return_code: + type: string + description: execute result + result_code: + type: string + description: SUCCESS/EXISTS all means success. EXISTS means the order_id was not first time to commit + channel: + type: string + description: payment channel + partner_code: + type: string + description: merchant code + full_name: + type: string + description: merchant full name + partner_name: + type: string + description: merchant name + order_id: + type: string + description: RoyalPay order ID, Will be channel order ID same time. + partner_order_id: + type: string + description: order id applied by merchant +orderStatus: + type: object + properties: + return_code: + type: string + description: execute result + example: + SUCCESS + result_code: + type: string + description: | + order status code + - PAYING: waiting for payment + - CREATE_FAIL: creation failed(final status, can be actived again if submitted another create order with same order id) + - CLOSED: order closed(final status, can be actived again if submitted another create order with same order id) + - PAY_FAIL: payment failed(final status, can be actived again if submitted another create order with same order id) + - PAY_SUCCESS: payment success(final status) + - PARTIAL_REFUND: payment success and partial refunds happened(final status) + - FULL_REFUND: payment success and was full refunded(final status) + If necessary. you can use same order id to call create order api in same gateway. but when origin order is paid or paying status will be failure + enum: + - PAYING + - CREATE_FAIL + - CLOSED + - PAY_FAIL + - PAY_SUCCESS + - PARTIAL_REFUND + - FULL_REFUND + order_id: + type: string + description: RoyalPay order ID, Will be channel order ID same time. + partner_order_id: + type: string + description: order id applied by merchant + channel_order_id: + type: string + description: transaction id from payment channel + total_fee: + type: integer + description: order amount. minimal unit of the currency. + real_fee: + type: integer + description: customer actual paid amount. minimal unit of the currency.(equals to total_fee at this moment. in case there were some discounts in the future) + currency: + type: string + rate: + type: number + description: exchange rate of trading. 1AUD=?CNY + pay_time: + type: string + format: 'date-time' + pattern: yyyy-mm-dd HH:mm:ss + description: paid time(yyyy-MM-dd HH:mm:ss, GMT+10) + create_time: + type: string + format: 'date-time' + pattern: yyyy-mm-dd HH:mm:ss + description: order creation time(yyyy-MM-dd HH:mm:ss, GMT+10) + channel: + type: string + description: payment channel + customer_info: + anyOf: + - description: Alipay User Info + title: Alipay Users + type: object + properties: + alipay_user_id: + type: string + description: Alipay user id + alipay_account: + type: string + description: user account + - $ref: 'components_order.yml#/cardCustomerInfo' +refundStatus: + type: object + properties: + return_code: + type: string + description: Execute result + example: + SUCCESS + result_code: + type: string + description: | + Refund status + - WAITING: Submitting + - CREATE_FAILED: Submit failed + - SUCCESS: Submit success. waiting for bank processing(for Wechat, it's final status) + - FAILED: Refund failed + - FINISHED: Refund success (final status) + enum: + - WATING + - CREATE_FAILED + - SUCCESS + - FAILED + - FINISHED + refund_id: + type: string + description: RoyalPay Refund ID + partner_refund_id: + type: string + description: Refund id submitted by merchant + amount: + type: integer + description: refund amount. minimal unit of the currency. + currency: + type: string + example: + AUD +transactionItem: + type: object + properties: + transaction_time: + type: string + format: 'date-time' + pattern: yyyyMMddHHmmss + description: trading time, format is yyyyMMddHHmmss, GMT+10 + partner_code: + type: string + description: transaction related partner code + order_id: + type: string + description: RoyalPay order id + partner_order_id: + type: string + description: merchant order id + channel_order_id: + type: string + description: channel order id + refund_id: + type: string + description: RoyalPay refund id (only exists on refund or refund failure payback transactions) + partner_refund_id: + type: string + description: merchant submitted refund id (only exists on refund or refund failure payback transactions) + gateway: + type: integer + description: | + gateway + - 0: RoyalPay EftPOS with payment code (scanning payment code provided by customer) + - 1: RoyalPay EftPOS with collection code (customer scan qr code provided by EftPOS) + - 2: RoyalPay Merchant's static QR Code + - 3: QRCode Gateway + - 4: JSAPI Gateway + - 5: Third EftPOS payment code gateway + - 6: Third EftPOS collection code gateway + - 7: RoyalPay Merchant's static QR Code(deprecated) + - 8: H5 Gateway + - 9: WEB Gateway + - 10: SDK order Gateway + - 11: RoyalPay Bill QR Code + - 12: Mini Program Gateway + - 13: Native QR Code Gateway + - 14: RoyalPay Bill link + - 15: Native JSAPI Gateway + - 16: Card Order(Pre order mode) + - 17: Card Order + - 18: DirectDebit + channel: + type: string + description: Trading channel + type: + type: string + description: Transaction type + enum: + - Credit + - Debit + currency: + type: string + example: + AUD + total_amount: + type: integer + description: Total amount for order. minimal unit of the currency. + input_amount: + type: integer + description: Input amount for order. minimal unit of the currency. + customer_payment_amount: + type: integer + description: Customer actual paid amount. minimal unit of the currency. + settle_amount: + type: integer + description: Amount calculated to merchant. note that it did not sub surcharge and GST yet. AUD currency. minimal unit of the currency. + transfer_amount: + type: integer + description: Pay amount to merchant. settle_amount - surcharge - GST. AUD currency. minimal unit of the currency. + surcharge: + type: integer + description: surcharge for this transaction. AUD currency. minimal unit of the currency. + gst: + type: integer + description: GST. AUD currency. minimal unit of the currency. + exchange_rate: + type: number + description: used exchange rate. + remark: + type: string + description: transaction remark +customInfo: + type: object + properties: + report_id: + type: string + description: RoyalPay customs report id + client_report_id: + type: string + description: merchant submitted customs report id + report_status: + type: string + description: report status + enum: + - PROCESSING + - SUBMITED + - FAILED + - SUCCESS + channel: + type: string + description: payment channel + custom: + type: string + description: customs code + mch_custom_no: + type: string + description: merchant's customs no registered in customs system + mch_custom_name: + type: string + description: merchant's name registered in customs system + order_id: + type: string + description: RoyalPay order id + transaction_id: + type: string + description: channel transaction id + order_currency: + type: string + description: order currency + order_amount: + type: number + description: order amount + report_time: + type: string + format: 'date-time' + description: report customs time + creation_date: + format: 'date-time' + type: string + description: report create time + last_update_date: + type: string + format: 'date-time' + description: update time + error_code: + type: string + description: error code + error_msg: + type: string + description: error message + verify_department: + type: string + verify_department_trade_id: + type: string + sub_orders: + type: array + items: + type: object + properties: + sub_order_no: + type: string + description: merchant's sub order no + fee_type: + type: string + description: currency code + default: CNY + enum: + - CNY + order_fee: + type: number + description: sub order fee + transport_fee: + type: number + description: sub order transport fee + verify_department: + type: string + verify_department_trade_id: + type: string + report_status: + type: string + description: report status + enum: + - PROCESSING + - SUBMITED + - FAILED + - SUCCESS + error_code: + type: string + error_msg: + type: string \ No newline at end of file diff --git a/src/document/openapi/en/document.yml b/src/document/openapi/en/document.yml new file mode 100644 index 000000000..cbbfc515e --- /dev/null +++ b/src/document/openapi/en/document.yml @@ -0,0 +1,1356 @@ +openapi: 3.0.3 +info: + title: RoyalPay Developer Documents + version: 1.0.0 + x-logo: + url: img/rp_logo.svg + description: | + [中文](/cn/) + + # Request And Parameters + Request for payment or refund shall use PUT method. Request for querying order + shall use GET method. All requests including Request Entity are in JSON format. + + 除跳转页面外,所有的Accept均为application/json;所有的PUT/POST请求Content-Type为application/json + + Accept in the request header shall be set to application/json for all requests except redirect pages. + Content-Type in the request header shall be set to application/json for all PUT/POST requests. + + System charset is UTF-8. + + There are 3 groups of parameters: Path Variable, Query Param, JSON Entity + + Path Variable: included in the path as patterns + + Query Param: parameters after the URI '?' symbol and formatted like key=value + + JSON Entity: only used in PUT/POST requests + + Our API server will return 200 in JSON if the request has successfully reached the server, which does not indicate the success or failure of the actual operation. All responses in JSON format will include a return_code field which contains the operation result. The value SUCCESS indicates that the operation was successful while other values shows the type of error that happened. Response will also contain a return_msg field for detailed error message. + + # Multi-Language + + System error message supports Simplified Chinese and English. The system by default will automatically choose the language according to the Accept-Language value in request header. Cookie "locale" value (zh-CN or en-US) will affect the result language. + + ## Which Gateway Api is for me? + + + + # Alipay Channels + + According to different Api used, Alipay channel was distributed to Retail channel and Online channel. Two channels has different exchange rate and surcharge rate. + + Online Channel: Including H5 Mobile, Online Payment, APP SDK, JSAPI and QR Code Api + + Retail Channel: Including Retail Pay + + Difference + - JSAPI and H5 Mobile: JSAPI can only be called in the web page opened in Alipay Client. H5 Mobile can call the payment panel in any browser or webview in App in the mobile device. + - Online Payment and QR Code: Online payment will jump to Alipay Official payment page. Customers can scan QR Code displayed in the page or sign in their account directly to finish payment. QR Code can provide a QR Code. Merchants can display this QR Code in their web page or jump to RoyalPay to display the QR Code. Customers can only scan the QR Code with their Alipay Client to finish payment. + + # Currency Codes + + RoyalPay can only accept the following currencies at the moment. Please note that the settlement currency will always be Australian Dollar. + - AUD + - CNY + + Except customs api. All fee parameters should use *Minimal unit of the currency*. For example, CNY and AUD should use cent unit. so AUD 1.00 should submit the parameter as 100 + + # Business Roles + - QR Code Payment displays a QR code image in a web page. Customers will scan the code via their WeChat and complete the payment in the linked web page. It is suitable for online shopping websites. + - JSAPI Payment redirects customers to a web page in WeChat. This page can only be opened within WeChat app and it is suitable for payment from micro-shops on WeChat platform. + - Retail passive payment(Scan Payment Code in customers’ WeChat Wallet) and active payment(Generate Payment QR Code for customers to scan) are used in retail environment such as payment terminals and pos machines. + - Order ID is required when creating an order. The same order id can be sent again. The system will decide to renew an order or close the old order according to the order status. System will recognise the same order id to avoid duplicated payments from customers. + - As orders can be resubmitted, Order ID returned by our server might not represent the last Order ID paid. + - QR Code order creation will return QR Code and pay_url. Merchants may decide whether to display the QR code on their website or to redirect customer to the payment page available at pay_url. + - JSAPI order creation will return pay_url. Merchants shall redirect customer to the payment page available at pay_url, and complete the payment. + - When redirecting to pay_url, sign information is required. + - Each request shall use new timestamp, nonce_str and sign. + - Our system will notify the caller after an order is paid successfully if notify_url was provided when creating an order. Otherwise, Merchants shall call the order query method repeatedly until order is paid or closed. + - Each unpaid order will be valid for 5 minutes. Expired order can be renewed with same the order id. It is suggested to trigger the event when user open the payment page again. + - Always redirect to RoyalPay’s payment page after calling the order creation method. + - Same order id is allowed in both creating new payment order and creating refund order but order details shall refer back to the initial request details. + - Price is specified in the base unit of the given currency. Using currency AUD as an example, 105 means 105 cents or $1.05. + + # Examples + https://example.royalpay.com.au/api/payment/order + + + + # Sample Code + - PHP: https://mpay.royalpay.com.au/static/phpdemo.zip + - Java: https://mpay.royalpay.com.au/static/javademo.zip + + # Error Codes + ## Common Error Codes + - SYSTEMERROR: Internel server error + - INVALID_SHORT_ID: Invalid partner code or not found + - SIGN_TIMEOUT: Signatured timedout. submitted time param has more than 5min difference to our server. please check your server time and timezone configuration. + - SIGN_EXPIRED: Signature expired. same signature was used multiple times. + - INVALID_SIGN: Signature mismatch + - PARAM_INVALID: Parameter not valid. Please check thr return_msg param + + ## Order Creation Error Codes + - NOT_PERMITTED: Not enabled the target gateway permission. + - INVALID_CHANNEL: Invalid channel name. channel name parameter was case-sensitive. please check spelling + - ORDER_MISMATCH: Order id not belongs to your merchant + - AUTHCODEEXPIRE: QR Code provided was expired(For Payment code apis) + - NOTSUPORTCARD: Not supported card type(Wechat channel only) + - AUTH_CODE_ERROR: QR Code submitted multiple times(Wechat channel only) + - AUTH_CODE_INVALID: Invalid QR Code(Wechat channel only) + - NOTENOUGH: Not enough balance in customer's account(Wechat channel only) + - ORDER_PAID: Order already paid + +servers: + - url: https://mpay.royalpay.com.au/api/v1.0 + description: production + - url: https://sandbox.royalpay.com.au/api/v1.0 + description: sandbox +tags: + - name: PublicApi + description: Public API + - name: QRCode + description: | + QR Code Payment is used for webpage/application on PC. Customers use WeChat or Alipay app to scan QR Code generated when creating order and finish the payment. + + Return value contains QR Code string, QR Ccode image and payment page address. Partners can decide how to finish the payment. + If the currency is CNY, equivalent AUD amount shall never less than 0.01AUD, otherwise user will get Invalid Amount Error from WeChat when making the payment. + - name: JSAPI + description: | + JSAPI Payment is used to pay in webpage which was opened in WeChat or Alipay App. If customers enter this page from WeChat Official Account, this Official Account is required to be authorized. + Customers will jump to RoyalPay order page and call WeChat or Alipay Payment Board to finish payment. + + Return value contains a payment page. Partners shall guide users to redirect to the page. Sign params is required when redirect happens. + If the currency is CNY, equivalent AUD amount shall never less than 0.01AUD, + otherwise user will get Invalid Amount Error from WeChat when making the payment. + - name: MobileH5 + description: | + Create H5 order. Only Alipay supports. + H5 Payment is used for payment in Webpage or App on mobile outside WeChat or Alipay App. The browser would redirect to a webpage from WeChat or Alipay and call the App to finish the payment. + Return value contains a payment page. Partners shall guide users to redirect to this page. Sign params are required. + If the currency is CNY, equivalent AUD amount shall never less than 0.01AUD, otherwise user will get Invalid Amount Error from WeChat when making the payment. + + - name: MiniProgram + description: | + Enabling Wechat mini program have to finish oversea company authorization. And authorized merchant should be equal to the merchant information in RoyalPay. + For details please visit WeChat documents. + Used for call payment in miniprogram. Create order and pass the sdk_params to mini program. [Reference Document](https://www.royalpay.com.au/downloads/MiniProgram_WechatPay.pdf) + + - name: CardPayment + description: | + Card payment method is that customer provider their card information to finish payments. Enable card payment require addition compliance process. + - name: RetailPay + description: | + Retail payment API for merchants has their own machine. Has 2 modes: + - Merchant scanner scan customer provided payment code.(B scan C) + - Customer scan merchant provided collection code. (C scan B) + - name: AlipayOnline + description: | + Use for Alipay Payment in PC Website. After create order, jump to the pay_url returned and attach sign params and redirect param. Then enter Alipay page to finish payment. + Alipay Channel only + + - name: CB Bank + description: | + Use for CB BankPay in PC Website. After create order, jump to the pay_url returned and attach sign params and redirect param. + - name: SDK Payment + description: | + Used for mobile Apps calling Wechat payment with Wechat/Alipay SDK. + Call this api to create order and get param string for SDK calling. Call SDK api with the param to start payment and get payment result from Wechat app *It is strongly advised to request RoyalPay order query Api to confirm that the order has been paid in order to cancelling order by system at the same time.* + + More information for integration with Alipay: [Alipay SDK Document](https://global.alipay.com/doc/app/intro) + More information for integration with Alipay: [Wechat SDK Document](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1) + [Alipay SDK for Android](resources/api/alipaySdk-20160825.jar) + [Alipay SDK for iOS](resources/api/AlipaySDKForiOS.zip) + [Wechat SDK for Android](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN) + [Wechat SDK for iOS](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN) + + - name: Custom + description: Used to submit the attachment information of the order required by the merchant. WeChat and Alipay are only supported. WeChat only supports payment orders within one month for customs declaration. +security: + - sign: [] + nonce_str: [] + time: [] +paths: + /gateway/partners/{partner_code}/orders/{partner_order_id}: + put: + tags: + - QRCode + summary: Create QRCode Order + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderWithChannel' + responses: + 200: + description: Execution result + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + code_url: + type: string + description: QR Code string. Merchants can generate a QR Code by self + qrcode_img: + type: string + description: Base64 encoded qr code img. can be used as src attribute of img tag + pay_url: + type: string + description: Payment page URL. If merchants choose jump to royalpay to finish payment can use this url. remember to add signature params + get: + summary: Check Order Status + tags: + - SDK Payment + - CB Bank + - RetailPay + - AlipayOnline + - CardPayment + - MiniProgram + - MobileH5 + - JSAPI + - QRCode + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + responses: + 200: + description: Order Status + content: + application/json: + schema: + $ref: 'components_order.yml#/orderStatus' + delete: + summary: Close Order + tags: + - SDK Payment + - CB Bank + - RetailPay + - AlipayOnline + - CardPayment + - MiniProgram + - MobileH5 + - JSAPI + - QRCode + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + responses: + 200: + description: Order Status + content: + application/json: + schema: + $ref: 'components_order.yml#/orderStatus' + /gateway/partners/{partner_code}/native_orders/{partner_order_id}: + put: + tags: + - QRCode + summary: Create native QRCode payment order + description: | + Native QR Code was generated directly by wechat/alipay. When scanned by their app. The payment page will directly generated by App instead of jumping to royalpay. + Will be helpful when customers are in a bad networking condition + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderWithChannel' + responses: + 200: + description: Execute result + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + code_url: + type: string + description: QR Code string. Merchants can generate a QR Code by self + qrcode_img: + type: string + description: Base64 encoded qr code img. can be used as src attribute of img tag + pay_url: + type: string + description: Payment page URL. If merchants choose jump to royalpay to finish payment can use this url. remember to add signature params + /gateway/partners/{partner_code}/orders/{partner_order_id}/pay: + get: + tags: + - QRCode + summary: QRCode payment Page + description: Must call order creation api and then redirect to this page. It's recommended to call order check api when sync jumping back to the given redirect param + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + - name: redirect + required: true + in: query + description: Redirecting target when payment succeeded + responses: + 200: + description: payment page + content: + text/html: + schema: + type: string + /jsapi_gateway/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: Create JSAPI order + tags: + - JSAPI + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderWithChannel' + responses: + 200: + description: Execute Result + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: Payment page URL, redirect to the url with signature parameters. + /wechat_jsapi_gateway/partners/{partner_code}_order_{partner_order_id}: + get: + summary: Wechat JSAPI payment page + description: Wechat JSAPI payment page. it's recommended to use the returned pay_url param in create order response + tags: + - JSAPI + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + - name: redirect + in: query + description: sync callback url. pay attention on url encoding + - name: directpay + in: query + description: whether call payment immediately when customer entered the page. if false, customer have to click on Pay button to call payment. + schema: + type: boolean + responses: + 200: + description: Wechat JSAPI payment page + content: + text/html: + schema: + type: string + /gateway/alipay/partners/{partner_code}/orders/{partner_order_id}/app_pay: + get: + summary: Alipay JSAPI Payment page + description: Alipay JSAPI payment page. it's recommended to use the returned pay_url param in create order response + tags: + - JSAPI + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + - name: redirect + in: query + description: sync callback url. pay attention on url encoding + - name: directpay + in: query + description: whether call payment immediately when customer entered the page. if false, customer have to click on Pay button to call payment. + schema: + type: boolean + responses: + 200: + description: Alipay JSAPI payment page + content: + text/html: + schema: + type: string + /h5_payment/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: Create MobileH5 order + description: only for Alipay channel + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + tags: + - MobileH5 + requestBody: + content: + application/json: + schema: + type: object + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + properties: + channel: + type: string + description: channel. case sensitive + enum: + - Alipay + responses: + 200: + description: Order + content: + application/json: + schema: + type: object + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: Payment page URL. redirect to the url with signature parameters. + /h5_payment/partners/{partner_code}/orders/{partner_order_id}/pay: + get: + summary: H5 Payment page + description: H5 payment page. it's recommended to use the returned pay_url param in create order response + tags: + - MobileH5 + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + - name: redirect + in: query + description: sync callback url. pay attention on url encoding + responses: + 200: + description: H5 Payment page + content: + text/html: + schema: + type: string + /gateway/partners/{partner_code}/microapp_orders/{partner_order_id}: + put: + summary: Create mini program order + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + tags: + - MiniProgram + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderWithChannel' + - type: object + properties: + appid: + type: string + description: mini program appid. required when channel is Wechat. ignore on Alipay + customer_id: + type: string + description: user id recognized in mini program (openid or wechat and userid for Alipay) + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + sdk_params: + type: string + description: serialized json string. can pass to mini program to call payment method + /gateway/partners/{partner_code}/pre_card_orders/{partner_order_id}: + put: + summary: Create Card Payment Pre Order + description: | + Pre order mode is submit basic order parameters. and jump to royalpay gateway page to ask customers to input their card information and finish payment. + Pre order allows customers to try multiple times. unless merchants called order close api. order will exists enabled status until expired. + tags: + - CardPayment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + properties: + domestic_only: + type: boolean + default: false + description: whether only domestic cards can pay. due to there is huge difference on surcharge rate between domestic cards and international cards. merchants can add a limit on the order. + disable_credit_card: + type: boolean + default: false + description: pass true if merchant want to disable credit cards from paying to this order. + tokenize: + type: boolean + default: false + description: whether provide a customer id for this payment. Then merchants can pass this id in future orders for same customer and then they will only have to input cvv code then. + customer_id: + type: string + description: use customer_id provided by tokenized orders. When customer_id is not null, tokenize parameter will be ignored. Can skip steps for typing in card number/ card holder name/ expire time for customer. only required is CVV2/CVC code + customer: + $ref: 'components_order.yml#/cardCustomerParam' + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: Payment page URL. redirect to the url with signature parameters. + /card_payment_view/partners/{partner_code}/orders/{partner_order_id}/view: + get: + summary: Card Payment Page + description: Card payment page. it's recommended to use the returned pay_url param in create order response + tags: + - CardPayment + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + - name: redirect + in: query + description: sync callback url. pay attention on url encoding + responses: + 200: + description: Card payment page + content: + text/html: + schema: + type: string + /gateway/partners/{partner_code}/card_orders/{partner_order_id}: + put: + summary: Create Card Order + description: | + 商户可在页面引入https://channel.rpayplus.com/channel/v1/view/card_input_frame.js + 并通过回调取得key_id和secret信息,并将其作为卡信息提交给royalpay直接完成下单支付。 + + js引用案例: + ``` + let cardInputContainer = document.getElementById('card-input-area');//预先准备放置卡输入界面的container + let cardInput = new CardInputFrame(cardInputContainer);//创建frame对象 + //设置iframe的样式参数 + cardInput.frameStyle = { + width: '100%', + height: '400px', + border: 'none', + borderRadius: '10px' + }; + cardInput.onError = function(msg){ + //卡输入界面返回错误信息时进行展示 + }; + cardInput.onReady = function(){ + //iframe加载完毕的触发事件 + }; + cardInput.onSuccess = function(secretData){ + //成功取得加密卡信息回调 + //secretData: {'key_id':'','secret':''} + }; + cardInput.show();//开始加载iframe + + //通过外部事件触发卡输入界面提交,注意卡输入界面没有按钮,必须通过外部触发提交事件。并回调到onSuccess回调函数。 + cardInput.commit(); + ``` + tags: + - CardPayment + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - key_id + - card_info + properties: + key_id: + type: string + description: 卡输入界面回调得到的key_id + card_info: + type: string + description: 卡输入界面回调得到的secret + domestic_only: + type: boolean + default: false + description: 是否只允许本国卡。由于境内境外卡支付手续费差异巨大,可在此限制。 + disable_credit_card: + type: boolean + default: false + description: 如果希望禁止消费者使用信用卡支付可传入true + customer: + $ref: 'components_order.yml#/cardCustomerParam' + responses: + 200: + description: Order + content: + application/json: + schema: + $ref: 'components_order.yml#/orderBasicResponse' + /micropay/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 付款码下单 + description: | + 线下支付订单接口用于带有扫码设备的收银终端进行对接,商户输入金额后要求客户出示支付码,用扫码枪扫码后将扫码内容和金额一并提交并完成支付操作。 + 线下支付订单接口现已兼容微信、支付宝通道。可根据付款码自动识别交易渠道。 + + tags: + - RetailPay + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - auth_code + - device_id + properties: + device_id: + type: string + description: 扫码设备id + auth_code: + type: string + description: 付款码 + responses: + 200: + description: Result + content: + application/json: + schema: + $ref: 'components_order.yml#/orderStatus' + /retail_qrcode/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 线下QRCode支付单 + description: | + 线下QRCode支付用于对接无扫码设备的收银终端,下单后得到二维码地址,自行生成二维码图片后展示在收银终端屏幕上,并由用户使用对应支付客户端进行扫码支付。 线下QRCode现已同时兼容支付宝、微信客户端进行支付 + + tags: + - RetailPay + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - device_id + properties: + device_id: + type: string + description: 收银设备id + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + code_url: + type: string + description: 付款码字符串,商户可自行生成二维码 # todo + /alipay/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 支付宝WEB订单下单 + description: | + 创建订单后跳转到返回的pay_url(需附加签名参数和redirect参数),随后进入支付宝支付页面完成支付 + 该接口现仅支持支付宝。 + tags: + - AlipayOnline + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + $ref: 'components_order.yml#/orderBasic' + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: Payment page URL,加签后传递给前端并跳转至当前URL,让消费者完成支付 + /cb_bankpay/partners/{partner_code}/orders/{partner_order_id}: + put: + summary: 网银快捷支付下单 + tags: + - CB Bank + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - product_name + - gateway_type + properties: + product_name: + type: string + description: 商品名称 + gateway_type: + type: integer + description: '网关类型,8: H5网关,9:PC网关' + enum: + - 8 + - 9 + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + pay_url: + type: string + description: Payment page URL,加签后传递给前端并跳转至当前URL,让消费者完成支付 + /gateway/partners/{partner_code}/app_orders/{partner_order_id}: + put: + summary: SDK下单 + tags: + - SDK Payment + parameters: + - name: partner_code + in: path + required: true + description: Given partner code + - name: partner_order_id + in: path + required: true + description: Order id in merchant side. must be unique in merchant side. + requestBody: + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasic' + - type: object + required: + - channel + properties: + channel: + type: string + description: 支付渠道,大小写敏感 + enum: + - Wechat + - Alipay + system: + type: string + description: 客户端操作类型,支付宝选填,微信不需要 + enum: + - android + - iphone + - ipad + version: + type: string + description: 客户端版本号,支付宝选填,微信不需要 + appid: + type: string + description: 微信必填,开发者平台appid + responses: + 200: + description: Order + content: + application/json: + schema: + allOf: + - $ref: 'components_order.yml#/orderBasicResponse' + - type: object + properties: + sdk_params: + type: string + description: json字符串,可直接传递给SDK端发起支付 + /gateway/partners/{partner_code}/channel_exchange_rate: + get: + summary: 渠道汇率查询 + description: 获取当前各渠道AUD兑CNY汇率值(1AUD=?CNY),该汇率仅做参考,以实际成交汇率为准 + tags: + - PublicApi + parameters: + - name: partner_code + in: path + required: true + responses: + 200: + description: exchange rate + content: + application/json: + schema: + type: object + description: OK + properties: + return_code: + type: string + description: 状态码 + example: + SUCCESS + wechat_rate: + type: number + description: 微信当前汇率 + example: + 4.41111 + alipay_retail_rate: + type: number + description: 支付宝线下接口汇率 + example: + 4.411111 + alipay_online_rate: + type: number + description: 支付宝线上汇率 + example: + 4.411111 + /gateway/partners/{partner_code}/orders/{partner_order_id}/refunds/{partner_refund_id}: + put: + summary: 发起退款 + description: 一笔支付订单可以分多次退款,退款总金额不得超过实际支付金额,退款币种与支付订单一致 + tags: + - QRCode + - JSAPI + - MobileH5 + - MiniProgram + - CardPayment + - AlipayOnline + - RetailPay + - CB Bank + - SDK Payment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + description: 需要退款订单的单号 + - name: partner_refund_id + in: path + required: true + description: 退款单号 + requestBody: + content: + application/json: + schema: + type: object + required: + - fee + properties: + fee: + type: integer + description: 退款金额,单位是货币最小单位,单个订单退款单金额总和不能超过用户支付金额 + device_id: + type: string + description: 操作设备id + responses: + 200: + description: Refund + content: + application/json: + schema: + $ref: 'components_order.yml#/refundStatus' + get: + summary: 查询退款 + tags: + - QRCode + - JSAPI + - MobileH5 + - MiniProgram + - CardPayment + - AlipayOnline + - RetailPay + - CB Bank + - SDK Payment + parameters: + - name: partner_code + in: path + required: true + - name: partner_order_id + in: path + required: true + description: 订单的单号 + - name: partner_refund_id + in: path + required: true + description: 退款单号 + responses: + 200: + description: Refund Status + content: + application/json: + schema: + $ref: 'components_order.yml#/refundStatus' + /gateway/partners/{partner_code}/transactions: + get: + summary: 查询流水 + description: | + 本接口将列出商户当日所有流水,包括所有接口(含非网关接口)支付通道的付款、RoyalPay优惠补贴、退款、 退款失败补正、系统补正、营销账户转入转出等,不含清算信息 + 注意一笔付款订单或退款订单均可能对应多条流水记录 + tags: + - PublicApi + parameters: + - name: partner_code + in: path + required: true + - name: date + schema: + format: date + pattern: yyyyMMdd + type: string + in: query + required: true + description: 账单日期,'yyyyMMdd'格式,GMT+10,只能查今天以前的账单 + example: 20200315 + responses: + 200: + description: Orders + content: + application/json: + schema: + type: object + properties: + return_code: + type: string + description: Execute Result + example: + SUCCESS + result_code: + type: string + description: 业务Execute Result + example: + SUCCESS + transaction_count: + type: integer + description: 流水条数 + order_count: + type: integer + description: 付款条数 + refund_count: + type: integer + description: 退款条数 + transactions: + type: array + items: + $ref: 'components_order.yml#/transactionItem' + /gateway/partners/{partner_code}/settlements: + get: + summary: 查看清算详情 + description: | + 本接口将列出商户查询日期清算的所有流水,包括所有接口(含非网关接口)支付通道的付款、RoyalPay优惠补贴、退款、 退款失败补正、系统补正、营销账户转入转出等 + 注意一笔付款订单或退款订单均可能对应多条流水记录 + tags: + - PublicApi + parameters: + - name: partner_code + in: path + required: true + - name: date + in: query + schema: + format: date + pattern: yyyyMMdd + type: string + description: 清算日期,'yyyyMMdd'格式,GMT+10,只能查今天以前 + required: true + responses: + 200: + description: Settlements + content: + application/json: + schema: + type: object + properties: + return_code: + type: string + description: Execute Result + example: + SUCCESS + result_code: + type: string + description: 业务Execute Result + example: + SUCCESS + settle_from: + type: string + format: date + description: 订单起始日期:yyyyMMdd + settle_to: + type: string + format: date + description: 订单截止日期:yyyyMMdd + settle_days: + type: string + description: 清算周期 + example: + T+2 + transaction_count: + type: integer + description: 流水条数 + order_count: + type: integer + description: 付款条数 + refund_count: + type: integer + description: 退款条数 + total_credit: + type: integer + description: 入账总金额(AUD分) + total_debits: + type: integer + description: 支出总金额(AUD分) + total_surcharge: + type: integer + description: 手续费总额(AUD分) + total_transfer: + type: integer + description: 打款总额(AUD分) + transactions: + type: array + items: + $ref: 'components_order.yml#/transactionItem' + /notify: + post: + summary: 到账通知 + description: | + 若订单创建时提供了notify_url,系统会在用户支付成功后向这个地址主动发送支付成功状态推送,请求方式为POST + 与服务器API不同,推送校验参数会包含在json内,商户系统应该验证校验参数,确定来源正确后再次进行订单接口查询确认订单支付状态再进行后续操作。 + 商户系统收到请求后应按要求返回参数,若RoyalPay未收到合法参数,视为商户未接收成功,推送动作首次触发会重试3次,随后24小时内每10分钟推送一次,直到返回200状态码。 + 商户系统应当能够处理收到的重复请求。 + 商户系统收到通知后以防万一应调用主动查询接口确认订单状态。 + tags: + - SDK Payment + - CB Bank + - RetailPay + - AlipayOnline + - CardPayment + - MiniProgram + - MobileH5 + - JSAPI + - QRCode + requestBody: + content: + application/json: + schema: + type: object + properties: + time: + type: integer + format: int64 + description: UTC时间戳 + nonce_str: + type: string + description: 随机字符串 + sign: + type: string + description: 签名 + partner_order_id: + type: string + description: 商户单号 + channel_order_id: + type: string + description: 渠道方交易单号 + order_id: + type: string + description: RoyalPay订单号 + total_fee: + type: integer + description: 订单金额,单位是最小货币单位 + real_fee: + type: integer + description: 支付金额,单位是最小货币单位 + rate: + type: number + description: 交易时使用的汇率,1AUD=?CNY + currency: + type: string + description: 币种,AUD + channel: + type: string + description: 交易渠道 + create_time: + type: string + format: 'date-time' + pattern: yyyy-MM-dd HH:mm:ss + description: 订单创建时间,格式为'yyyy-MM-dd HH:mm:ss',GMT+10 + pay_time: + type: string + format: 'date-time' + pattern: yyyy-MM-dd HH:mm:ss + description: 订单支付时间,格式为'yyyy-MM-dd HH:mm:ss',GMT+10 + responses: + 200: + description: OK + /customs/partners/{partner_code}/declare/report/{client_report_id}: + put: + summary: 创建报关单 + tags: + - Custom + parameters: + - name: partner_code + in: path + required: true + - name: client_report_id + in: path + required: true + requestBody: + content: + application/json: + schema: + type: object + properties: + order_id: + type: string + description: 商户支付订单号,要求同一商户唯一 + custom: + type: string + description: 海关编号 * [渠道海关编号](https://www.royalpay.com.au/downloads/CustomsNO.xlsx) + mch_custom_id: + type: string + description: 商户在海关备案的编号 + mch_custom_name: + type: string + description: 商户海关备案名称 + sub_order: + type: array + description: 子订单(拆单) + items: + type: object + properties: + sub_order_no: + type: string + description: 商户子订单号 + fee_type: + type: string + description: 币种代码 + default: CNY + enum: + - CNY + order_fee: + type: number + description: 子订单金额,单位是元 + transport_fee: + type: number + description: 子订单物流金额,单位是元 + responses: + 200: + description: Custom + content: + application/json: + schema: + $ref: 'components_order.yml#/customInfo' + get: + summary: 查询报关单 + tags: + - Custom + parameters: + - name: partner_code + in: path + required: true + - name: client_report_id + in: path + required: true + responses: + 200: + description: Custom + content: + application/json: + schema: + $ref: 'components_order.yml#/customInfo' + /customs/partners/{partner_code}/redeclare/report/{client_report_id}: + put: + summary: 重新提交报关单 + description: 用于重新提交未报关成功的报关单 + tags: + - Custom + parameters: + - name: partner_code + in: path + required: true + - name: client_report_id + in: path + required: true + responses: + 200: + description: Custom + content: + application/json: + schema: + $ref: 'components_order.yml#/customInfo' +components: + securitySchemes: + nonce_str: + type: apiKey + in: query + name: nonce_str + description: 随机字符串 + time: + type: apiKey + in: query + name: time + description: 带毫秒的Unix时间戳,务必检查服务器时间和时区配置。计算服务器上的UTC时间是否匹配真实UTC时间即可。允许误差±5分钟 + sign: + type: apiKey + in: query + name: sign + description: | + 商户签约后会分配得到一个partner_code和credential_code用于签名,其中partner_code随请求传递,credential_code务必自行存储不得外泄,仅作为签名参数。 + + 每次请求都必须加入签名信息作为请求校验。校验参数全部以Query Param参数的方式附加在URL后面,顺序不分先后。 + + 签名过程: + + 1. 连接生成签名的原始字符串,需要4个参数,使用&连接,无需转码 + > valid_string=partner_code&time&nonce_str&credential_code + + 2. 使用SHA256对valid_string进行签名,并转换为小写字符串 + > sign=hex(sha256(valid_string)).toLowerCase() + + 3. 在请求中将签名使用的time, nonce_str和生成的sign作为query参数发送 + + > 签名测试地址:https://mpay.royalpay.com.au/sign_test.html + + diff --git a/src/document/tpl/img/JSAPI_process_en.png b/src/document/openapi/en/img/JSAPI_process_en.png similarity index 100% rename from src/document/tpl/img/JSAPI_process_en.png rename to src/document/openapi/en/img/JSAPI_process_en.png diff --git a/src/document/tpl/img/QRCODE_process_en.png b/src/document/openapi/en/img/QRCODE_process_en.png similarity index 100% rename from src/document/tpl/img/QRCODE_process_en.png rename to src/document/openapi/en/img/QRCODE_process_en.png diff --git a/src/document/tpl/img/RetailQR_en.png b/src/document/openapi/en/img/RetailQR_en.png similarity index 100% rename from src/document/tpl/img/RetailQR_en.png rename to src/document/openapi/en/img/RetailQR_en.png diff --git a/src/document/tpl/img/Retail_en.png b/src/document/openapi/en/img/Retail_en.png similarity index 100% rename from src/document/tpl/img/Retail_en.png rename to src/document/openapi/en/img/Retail_en.png diff --git a/src/document/tpl/img/RoyalPay_Gateway_choose_en.jpg b/src/document/openapi/en/img/RoyalPay_Gateway_choose_en.jpg similarity index 100% rename from src/document/tpl/img/RoyalPay_Gateway_choose_en.jpg rename to src/document/openapi/en/img/RoyalPay_Gateway_choose_en.jpg diff --git a/src/document/tpl/img/alipayOnline_en.png b/src/document/openapi/en/img/alipayOnline_en.png similarity index 100% rename from src/document/tpl/img/alipayOnline_en.png rename to src/document/openapi/en/img/alipayOnline_en.png diff --git a/src/document/tpl/img/jd_en.png b/src/document/openapi/en/img/jd_en.png similarity index 100% rename from src/document/tpl/img/jd_en.png rename to src/document/openapi/en/img/jd_en.png diff --git a/src/document/openapi/en/img/logo_new.jpg b/src/document/openapi/en/img/logo_new.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41c02602aa29c817d8f8eef48a9183dd005c982d GIT binary patch literal 40600 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 literal 0 HcmV?d00001 diff --git a/src/document/tpl/img/microapp_en.png b/src/document/openapi/en/img/microapp_en.png similarity index 100% rename from src/document/tpl/img/microapp_en.png rename to src/document/openapi/en/img/microapp_en.png diff --git a/src/document/openapi/en/img/rp_logo.svg b/src/document/openapi/en/img/rp_logo.svg new file mode 100644 index 000000000..d57a76e21 --- /dev/null +++ b/src/document/openapi/en/img/rp_logo.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/document/tpl/img/sdk_wechat_api_payment_en.png b/src/document/openapi/en/img/sdk_wechat_api_payment_en.png similarity index 100% rename from src/document/tpl/img/sdk_wechat_api_payment_en.png rename to src/document/openapi/en/img/sdk_wechat_api_payment_en.png diff --git a/src/document/openapi/en/index.html b/src/document/openapi/en/index.html new file mode 100644 index 000000000..6b6d61ff8 --- /dev/null +++ b/src/document/openapi/en/index.html @@ -0,0 +1,23 @@ + + + + + RoyalPay Document + + + + + + + + + + + \ No newline at end of file diff --git a/src/document/tpl/resources/api/AlipaySDKForiOS.zip b/src/document/openapi/resources/api/AlipaySDKForiOS.zip similarity index 100% rename from src/document/tpl/resources/api/AlipaySDKForiOS.zip rename to src/document/openapi/resources/api/AlipaySDKForiOS.zip diff --git a/src/document/tpl/resources/api/alipaySdk-20160825.jar b/src/document/openapi/resources/api/alipaySdk-20160825.jar similarity index 100% rename from src/document/tpl/resources/api/alipaySdk-20160825.jar rename to src/document/openapi/resources/api/alipaySdk-20160825.jar diff --git a/src/document/tpl/img/logo_new.jpg b/src/document/tpl/img/logo_new.jpg deleted file mode 100644 index 7b51acf46c7691097a4fd1a3b8125580a969caaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12058 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