业务说明

商户使用该接口下单后,使用接口返回的预下单订单号和小程序参数结合业务实际场景,选择不同的方式使用支付收银台完成支付。

交易请求报文

JSON:

  1. {
  2. "request_type": "miniapporder_request",
  3. "isspid": "39493002",
  4. "pos_id": "1511300001",
  5. "store_id": "1511300001",
  6. "pos_seq": "1511300000002",
  7. "user_id": "user01",
  8. "system_id": "8888",
  9. "memo": "订单备注",
  10. "miniapporder_request": {
  11. "pay_type": "515",
  12. "tx_amt": "1",
  13. "body": "商品描述",
  14. "notify_url": "http://www.baidu.com/",
  15. "extend_params": {
  16. "split_flag": "R",
  17. "plan_split_date": "20230418",
  18. "split_info": {
  19. "keep_amt": "800",
  20. "split_list": [
  21. {
  22. "merchant_id": "10000000000001",
  23. "div_amt": "150"
  24. },
  25. {
  26. "merchant_id": "10000000000002",
  27. "div_amt": "50"
  28. }
  29. ]
  30. }
  31. }
  32. },
  33. "sign": "59B62BEBCA649C24DC25C44706677423"
  34. }

XML:

  1. <?xml version="1.0" encoding="GBK"?>
  2. <business_trans>
  3. <request_type>miniapporder_request</request_type>
  4. <isspid>39493002</isspid>
  5. <pos_id>1511300001</pos_id>
  6. <store_id>1511300001</store_id>
  7. <pos_seq>1511300000002</pos_seq>
  8. <user_id>user01</user_id>
  9. <system_id>8888</system_id>
  10. <memo>订单备注</memo>
  11. <miniapporder_request>
  12. <pay_type>515</pay_type>
  13. <tx_amt>1</tx_amt>
  14. <body>商品描述</body>
  15. <notify_url><![CDATA[http://www.baidu.com/]]></notify_url>
  16. <extend_params><![CDATA[扩展参数]]></extend_params>
  17. </miniapporder_request>
  18. </business_trans>

交易请求报文说明

节点名称中文名称类型说明是否必填
sign报文签名String(32)请求报文格式为JSON时必填计算签名方式请看2.1章节可选
request_type请求类型String(32)固定值:miniapporder_request必填
isspid商户号String(8)翼码商户号,由翼码提供必填
pos_id终端号String(20)商户自定义终端号必填
store_id门店号String(20)商户自定义门店号必填
pos_seq支付请求流水号String(32)同一个翼码商户号下唯一,不可重复使用,且大于12位必填
user_id操作员标识String(20)操作员号可空
system_id系统平台号String(4)由翼码提供必填
memo订单备注String(128)可空
miniapporder_request
->pay_type
支付类型String(3)515:微信小程序必填
miniapporder_request
->tx_amt
交易金额Number(9)支付金额,单位为分,不支持小数点必填
miniapporder_request
->body
商品描述String(64)不传,则默认为“商户简称(门店名称)”可空
miniapporder_request
->notify_url
异步通知地址String(256)异步通知文档见4.20
使用XML格式报文时,建议使用CDATA标签包裹内容
可空
miniapporder_request
->extend_params
扩展参数JSON用于扩展一些特殊的支付参数字段,详细参数见下表
使用XML格式报文时,建议使用CDATA标签包裹内容
可空

自定义门店号(store_id)和自定义终端号(pos_id)需经过4.1终端绑定交易接口绑定成功过的值才可以调用,绑定一次即可不需要重复绑定。

extend_params 扩展参数 (JSON)

JSON节点类型说明是否必填范例
split_flagString分账标识
N:不分账
R:实时分账
D:延时分账
不传该节点时,将按控制台配置处理
该节点与分账功能相关具体联系业务确认开通功能
可空R
plan_split_dateString预分账日期,格式:yyyymmdd
仅延时分账类型(split_flag=D)时支持传入
可空20230418
split_infoJSON分账信息
仅支持请求实时分账split_flag=R
该节点与分账功能相关具体联系业务确认开通功能
可空 

分账业务相关的特别说明:
1. split_flag=N 不分账时,split_info不允许传入;
2. split_flag=R 实时分账时,split_info必传,其中keep_amt与div_amt叠加必须全额分完整笔订单;
3. split_flag=D 延时分账时,split_info不允许传入,在后续流程中调用延迟交易确认接口完成分账,或使用翼码分账系统界面进行分账。

split_info 分账信息

JSON节点类型说明是否必填范例
is_clean_splitStringN:不使用净值分账
Y:使用净值分账
不传默认为N,即不使用净值分账
净值分账目前仅对部分通道开放,使用此能力前请先与技术支持确认
净值分账仅在交易手续费内扣时才起作用
当使用净值分账时,分账信息和分账明细必须要传分账比例,且分账方自留比例(keep_percentage)与所有分账比例(div_percentage)之和必须要为100%
可空Y
keep_amtString分账方自留金额,单位为分,可传0表示不自留
不使用净值分账(is_clean_split=N)时,该节点必填,分账方自留比例(keep_percentage)节点无效
可空1000
keep_percentageString分账方自留比例,单位为%,最多支持小数点后两位,可传0表示不自留
使用净值分账(is_clean_split=Y)时,该节点必填,分账方自留金额(keep_amt)节点无效
可空50.26
split_listArray分账明细必填 
split_list 分账明细
JSON节点类型说明是否必填范例
merchant_idString分账接收方的分账商户号必填10000000000001
div_amtString分账金额,单位为分,必须大于0
不使用净值分账(is_clean_split=N)时,该节点必填,分账比例(div_percentage)节点无效
可空1000
div_percentageString分账比例,单位为%,最多支持小数点后两位,必须大于0
使用净值分账(is_clean_split=Y)时,该节点必填,分账金额(div_amt)节点无效
可空23.55

若业务涉及100%分账给接收方,请于业务对接人联系申请使用净值分账功能。

extend_params 样例:

  1. {
  2. "split_flag": "R",
  3. "plan_split_date": "20230418",
  4. "split_info": {
  5. "keep_amt": "800",
  6. "split_list": [
  7. {
  8. "merchant_id": "10000000000001",
  9. "div_amt": "150"
  10. },
  11. {
  12. "merchant_id": "10000000000002",
  13. "div_amt": "50"
  14. }
  15. ]
  16. }
  17. }

交易返回报文

  1. {
  2. "response_type": "miniapporder_response",
  3. "isspid": "39493002",
  4. "pos_id": "1511300001",
  5. "pos_seq": "1511300000002",
  6. "sys_seq": "0311095321465179",
  7. "trans_time": "20160311095321",
  8. "pay_type": "515",
  9. "pre_order_id": "1FN68A1A66OGS",
  10. "miniapp_data": "{\"gh_id\":\"gh_35df7973927b\",\"path\":\"pages/index/embedded\",\"scheme_code\":\"weixin://dl/business/?t=tGzuz08reKu\"}",
  11. "result": {
  12. "id": "9998",
  13. "comment": "下单成功,等待用户支付"
  14. },
  15. "sign": "D2E991C64AE4B6AD857A94904BDDB608"
  16. }
  1. <?xml version="1.0" encoding="GBK"?>
  2. <business_trans>
  3. <response_type>miniapporder_response</response_type>
  4. <isspid>39493002</isspid>
  5. <pos_id>1511300001</pos_id>
  6. <pos_seq>1511300000002</pos_seq>
  7. <sys_seq>0311095321465179</sys_seq>
  8. <trans_time>20160311095321</trans_time>
  9. <pay_type>515</pay_type>
  10. <pre_order_id>1FN68A1A66OGS</pre_order_id>
  11. <miniapp_data><![CDATA[{"gh_id":"gh_35df7973927b","path":"pages/index/embedded","scheme_code":"weixin://dl/business/?t=tGzuz08reKu"}]]></miniapp_data>
  12. <result>
  13. <id>9998</id>
  14. <comment>下单成功,等待用户支付</comment>
  15. </result>
  16. </business_trans>

交易返回报文说明

标准接口会因业务升级需要而新增节点,请在解析返回报文时避免新增未知节点产生的程序出错!

节点名称中文名称类型说明是否必填
sign报文签名String(32)请求报文格式为JSON时必填计算签名方式请看2.1章节可选
response_type返回类型String(32)固定值:miniapporder_response必填
isspid商户号String(8)翼码商户号,由翼码提供必填
pos_id终端号String(20)商户自定义终端号必填
pos_seq支付请求流水号String(32)支付请求流水号,和请求报文相同必填
sys_seq随机串号String(16)随机生成串号,仅用于日志跟踪用,不保存必填
trans_time接口返回时间String(14)接口返回时间,格式:yyyyMMddHHmmss必填
pay_type支付类型String(3)515:微信小程序必填
pre_order_id预下单订单号String(64)下单成功时必填可空
miniapp_data小程序参数StringJSON字符串
下单成功时必填
使用XML格式报文时,内容将使用CDATA标签包裹
可空
result
->id
响应码String(4)9998 - 下单成功等待用户支付,需调用查询接口确认交易
其它失败,错误信息说明见“响应码解释”字段
必填
result
->comment
响应码解释String(64)响应码对应中文注解,用于显示提示必填

标准接口会因业务升级需要而新增节点,请在解析返回报文时避免新增未知节点产生的程序出错!

miniapp_data 小程序参数

JSON节点类型说明是否必填范例
gh_idString小程序原始ID可空gh_35df7973927b
pathString小程序页面支付路径可空pages/index/embedded
scheme_codeString小程序跳转码可空weixin://dl/business/?t=tGzuz08reKu

微信小程序支付收银台使用说明

方式一:使用商户自有小程序,跳转旺财收银台小程序完成支付

步骤一:拼接小程序页面路径

取下单成功后接口返回的【预下单订单号(pre_order_id)】节点和【小程序参数(miniapp_data)】中的【小程序页面支付路径(path)】节点,拼接为形如“pages/index/embedded?pre_order_id=XXX”的小程序页面路径。
其中:

  • “pages/index/embedded” 是接口返回的小程序页面支付路径【path】
  • “XXX” 是预下单订单号【pre_order_id】;

例如下单接口返回:

  1. ...
  2. "pre_order_id": "1FN68A1A66OGS",
  3. "miniapp_data": "{\"gh_id\":\"gh_35df7973927b\",\"path\":\"pages/index/embedded\",\"scheme_code\":\"weixin://dl/business/?t=tGzuz08reKu\"}",
  4. ...

拼接完成后的小程序页面路径为:pages/index/embedded?pre_order_id=1FN68A1A66OGS

步骤二:跳转旺财收银台小程序

根据用户体验设计和小程序基础库版本,按需选择半屏打开小程序或全屏跳转小程序

1. 半屏打开小程序

可用前提:从小程序基础库 2.20.1 开始支持;

(1) 开发者需在 小程序管理后台「设置」-「第三方设置」-「半屏小程序管理」板块发起申请,申请添加小程序的APPID为wxa138a13aca591b95;

(2) 2.23.1以下版本基础库,开发者需要在全局配置 app.json 的 embeddedAppIdList 字段中声明需要半屏打开的小程序,若不配置将切换为普通的全屏跳转小程序。2.23.1及以上版本起无需配置,跳过此步

配置示例:

  1. {
  2. "embeddedAppIdList": ["wxa138a13aca591b95"]
  3. }

(3) 开发者通过调用 wx.openEmbeddedMiniProgram 半屏打开小程序。

示例代码:

  1. wx.openEmbeddedMiniProgram({
  2. appId: 'wxa138a13aca591b95', //填写旺财收银台小程序appid:wxa138a13aca591b95
  3. envVersion: 'release', //release-正式版:翼码生产环境,trial-体验版:翼码测试环境
  4. path: 'pages/index/embedded?pre_order_id=1FN68A1A66OGS' //填写步骤一中拼接出的小程序页面路径
  5. })

参数 envVersion 代表小程序版本
对接翼码测试环境时为体验版小程序:envVersion=trial
对接翼码生产环境时为正式版小程序:envVersion=release

更多方法及使用限制请参考微信官方文档:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/openEmbeddedMiniProgram.html

特别注意:半屏打开小程序必须要在点击触发后同步调用,否则会降级成普通的全屏跳转小程序,例如以下错误代码将出现全屏跳转小程序:

  1. openEmbeddedMiniProgramHandle(){
  2. // 此时会全屏跳转小程序,不是半屏打开小程序
  3. // 微信错误提示:openEmbeddedMiniProgram will fallback to navigateToMiniProgram. (reason: invalid platform)
  4. setTimeout(() => {
  5. wx.openEmbeddedMiniProgram({
  6. appId: 'wxa138a13aca591b95', //填写旺财收银台小程序appid:wxa138a13aca591b95
  7. envVersion: 'release', //release-正式版:翼码生产环境,trial-体验版:翼码测试环境
  8. path: 'pages/index/embedded?pre_order_id=1FN68A1A66OGS' //填写步骤一中拼接出的小程序页面路径
  9. })
  10. }, 100);
  11. }
2. 全屏跳转小程序

可用前提:从小程序基础库 1.3.0 开始支持;

示例代码:

  1. wx.navigateToMiniProgram({
  2. appId: 'wxa138a13aca591b95', //填写旺财收银台小程序appid:wxa138a13aca591b95
  3. envVersion: 'release', //release-正式版:翼码生产环境,trial-体验版:翼码测试环境
  4. path: 'pages/index/embedded?pre_order_id=1FN68A1A66OGS' //填写步骤一中拼接出的小程序页面路径
  5. })

参数 envVersion 代表小程序版本
对接翼码测试环境时为体验版小程序:envVersion=trial
对接翼码生产环境时为正式版小程序:envVersion=release

更多参数及使用限制请参考微信官方文档:
https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html

步骤三:支付结果数据获取

在当前页面的show生命周期函数内监听onAppShow事件,返回的支付结果数据在referrerInfo.extraData中,但是由于意外原因可能出现未返回结果,所以推荐使用重新查询支付订单的状态来作为依据。

示例代码:

  1. // 在page的onShow使用返回状态判断
  2. // uniapp
  3. onShow(e) {
  4. uni.onAppShow((e)=>{
  5. console.log('onAppShow', e)
  6. let { referrerInfo={} } = e
  7. let { extraData={} } = referrerInfo
  8. /*
  9. 返回小程序时会返回extraData字段,格式如下
  10. extraData = {
  11. ym_pay_status: "success", // success:支付成功,error:失败
  12. ym_pay_msg: "订单不存在", // 失败原因
  13. ym_pay_id: "1FN681TQTV79L", // 接口中的 pre_order_id
  14. }
  15. */
  16. // 之后根据支付状态处理后续业务逻辑
  17. })
  18. }
  19. // 微信原生
  20. show(e) {
  21. wx.onAppShow((e)=>{
  22. console.log('onAppShow', e)
  23. let { referrerInfo={} } = e
  24. let { extraData={} } = referrerInfo
  25. /*
  26. 返回小程序时会返回extraData字段,格式如下
  27. extraData = {
  28. ym_pay_status: "success", // success:支付成功,error:失败
  29. ym_pay_msg: "订单不存在", // 失败原因
  30. ym_pay_id: "1FN681TQTV79L", // 接口中的 pre_order_id
  31. }
  32. */
  33. // 之后根据支付状态处理后续业务逻辑
  34. })
  35. }

更多参数及使用限制请参考微信官方文档:
https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onAppShow.html

方式二:不使用商户自有小程序,由商户App直接跳转支付通道小程序完成支付

使用微信原生SDK,APP拉起小程序功能,需要使用下单成功后接口返回的 miniapp_data 与 pre_order_id 节点的参数。

iOS开发示例:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Launching_a_Mini_Program/iOS_Development_example.html

Android开发示例:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Launching_a_Mini_Program/Android_Development_example.html

  • 开发示例中的“小程序原始id”,即下单接口返回的 miniapp_data 中的 gh_id 节点。

  • 开发示例中的“拉起小程序页面的可带参路径”,即下单接口返回的 miniapp_data 中的 path 节点拼接上参数后的值。

具体拼接规则如下:
取接口返回 path 拼接上 “?pre_order_id=xxx”,其中 xxx 为接口返回的pre_order_id。

例如下单接口返回:

  1. ...
  2. "pre_order_id": "1FN68A1A66OGS",
  3. "miniapp_data": "{\"gh_id\":\"gh_35df7973927b\",\"path\":\"pages/index/embedded\",\"scheme_code\":\"weixin://dl/business/?t=tGzuz08reKu\"}",
  4. ...

拼接完成后的path为:pages/index/embedded?pre_order_id=1FN68A1A66OGS

方式三:不使用商户自有小程序,由短信、邮件、外部网页、微信内等场景直接跳转支付通道小程序完成支付

使用下单成功后接口返回的 miniapp_data 中的 scheme_code 节点进行跳转。

微信官方对使用此方法跳转,提示的部分注意事项:

  • 微信内的网页如需打开小程序请使用微信开放标签-小程序跳转按钮,无公众号也可以直接使用小程序身份开发网页并免鉴权跳转小程序,见云开发静态网站跳转小程序。
  • 通过 URL Scheme 跳转到微信时,可能会触发系统弹框询问,若用户选择不跳转,则无法打开小程序。请开发者妥善处理用户选择不跳转的场景
  • 部分浏览器会限制打开网页直接跳转,可参考示例网页设置跳转按钮

方式四:使用商户自有小程序,调用小程序支付插件完成支付

当微信认为商户小程序使用支付插件完成支付绕过了微信的订单管理不合规时,会进行管控,造成一些商户小程序调用支付插件时被拦截。出现此情况商户,需使用方式一完成支付。

小程序支付收银台下单 - 图1

一、准备工作

1. 小程序添加插件

请在 「小程序后台 - 设置 - 第三方设置 - 插件管理 中搜索并添加 appid 为【wx11361ccf7f47b948】的插件。联系翼码运营,告知小程序名称,翼码审核通过后即可添加成功。

在小程序配置 app.json 文件中加入如下配置

  1. {
  2. "plugins": {
  3. "dg-bill": {
  4. "version": "latest",
  5. "provider": "wx11361ccf7f47b948"
  6. }
  7. }
  8. }
2. 联系翼码运营开通功能

告知商户自己的小程序appid,翼码营运开通功能。

二、支付插件使用

1. 调用本接口进行小程序支付插件的下单

使用本接口进行预下单,获取响应的预下单订单号(pre_order_id)。

2. 接入斗拱插件

本插件支持两种接入方式

  • (1) 调用插件JS接口调用支付

在支付提交页(调用微信支付的页面),添加以下代码,使用预下单响应信息 pre_order_id 作为参数调用 DGBillPlugin.requestPay 发起插件支付,使用 paySuccess、payError 作为支付结果回调接收支付回调信息处理后续逻辑。

  1. // 支付提交页
  2. const DGBillPlugin = requirePlugin('dg-bill');
  3. Page({
  4. ...,
  5. paySuccess() {
  6. },
  7. payError() {
  8. },
  9. handlePluginPay() {
  10. const orderInfo = this.data.orderInfo;
  11. if (orderInfo.pre_order_id) {
  12. DGBillPlugin.requestPay(orderInfo.pre_order_id, this.paySuccess, this.payError);
  13. }
  14. },
  15. });
  • (2) 引用插件支付页面完成支付流程

引用斗拱收银插件组件

  1. {
  2. "usingComponents": {
  3. "pay-item": "plugin://dg-bill/pay-component"
  4. }
  5. }

定义支付回调方法

  1. onsuccess(e) {
  2. console.log('小程序成功回调', e.detail);
  3. },
  4. onfail(e) {
  5. console.log('小程序失败回调', e.detail);
  6. },

支付页面展示组件

  1. <pay-item wx:if="{{preOrderId}}" preOrderId="{{preOrderId}}" bind:onsuccess="onsuccess" bind:onfail="onfail"/>

参数说明

参数名称参数类型参数说明
amtNumber订单金额
preOrderIdString下单接口返回的预下单订单号pre_order_id
onsuccessFunction成功回调
onfailFunction失败回调