5. 附录


5.1 小程序支付相关资料

5.1.1 微信相关资料

  • 在小程序管理后台申请半屏调用,路径:设置->第三方设置->半屏小程序管理,添加收银台小程序APPID(wxef277996acc166c3) ,详细调用过程参考2
  • 涉及微信小程序API如下,详细使用方法可参考微信文档:
    • wx.openEmbeddedMiniProgram 小程序跳转小程序(半屏模式):

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/openEmbeddedMiniProgram.html

    • wx.getEnterOptionsSync 获取本次小程序启动时的参数

https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getEnterOptionsSync.html

    • 场景值:

https://developers.weixin.qq.com/miniprogram/dev/reference/scene-list.html

    • 版本判断:

https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html

5.2 小程序支付指引

在小程序环境内,小程序调起单据链接(serviceOrderUrl),在改页面操作支付确认,需要接收页面返回的信息进行小程序支付的调用。

Step1:需要小程序准备一个页面路径,以serviceOrderUrl&payURL=路径 这种拼接模式拼成一个新的url。

Step2:小程序打开新拼接好的url。H5页面上做支付确认,在按下支付的按钮会触发(wx.miniProgram.redirectTo  指向新准备的页面 ,wx.miniProgram.postMessage  发送支付信息) 。此时小程序需要通过(bindmessage 该方法接收H5页面发送的支付信息)。

Step3:处理支付信息参考5.2.1

小程序收银台时(appId: 微信小程序的appId,固定为:wxef277996acc166c3,支付宝小程序的appId,固定为:2021001104615521),在message中将返回的“params”中的字段名及字段值全部原样作为入参上送。

5.2.1 微信小程序

let params = {

cusid: "平台分配的商户号",

appid: "平台分配的appid",

orgid: "平台分配的机构号",

version: "12",

trxamt: "1",

reqsn: "商户唯一订单号",

notify_url: "服务器异步通知页面路径",

body: "标题",

remark: "备注",

validtime: "订单有效时间",

limit_pay: "no_credit",

randomstr: "随机字符串",

paytype: "W06",

signtype: "签名方式",

sign: "签名"

}

  • 以下方法可以跳转到收银台小程序,其中openEmbeddedMiniProgram可以打开半屏小程序,注意调用该方法需要申请(详见5.1),且该方法仅支持小程序基础库2.26.2以上(详见5.1.1),如果调用该方法需要进行版本判断兼容,上述方法compareVersion详见5.1.1,若无半屏打开需求,建议直接调用navigateToMiniProgram打开。

调用示例:

const version = wx.getAppBaseInfo().SDKVersion

if (compareVersion(version, '2.26.2') >= 0) {

// openEmbeddedMiniProgram,需要小程序基础库版本不低于 2.26.2

wx.openEmbeddedMiniProgram({

appId: 'wxef277996acc166c3',

extraData: params

})

} else {

wx.navigateToMiniProgram({

appId: 'wxef277996acc166c3',

extraData: params

})

}

  • 在收银台中完成支付后,会回调支付结果,具体结果可以在小程序生命周期onShow中通过以下方式获取:

onShow: function () {

let options = wx.getEnterOptionsSync();

if (options.scene == '1038' && options.referrerInfo.appId=='wxef277996acc166c3') {

// 代表从收银台小程序返回

let extraData = options.referrerInfo.extraData;

if (!extraData) {

// "当前通过物理按键返回,未接收到返参,建议自行查询交易结果";

} else {

if (extraData.code == 'success') {

// "支付成功";

} else if (extraData.code == 'cancel') {

// "支付已取消";

} else {

// "支付失败:" + extraData.errmsg;

}

}

}

},

  • 一般情况下getEnterOptionsSync()中获取的extraData为收银台小程序返回的支付结果,但是当通过物理返回键或者通过半屏小程序右上角关闭退出(即未通过收银台小程序内按钮退出),extraData内容会为空,调用方小程序会无法获得支付结果,该情况为微信小程序特性,小程序代码无法处理。如遇到该情况,通过判断场景值为1038且来源小程序为收银台小程序wxef277996acc166c3(上述代码加粗部分),即可认定为收银台返回,当前若extraData为空,则需要自行查询订单支付结果

5.2.2 支付宝小程序

let params = {

cusid: "平台分配的商户号",

appid: "平台分配的appid",

orgid: "平台分配的机构号",

version: "12",

trxamt: "1",

reqsn: "商户唯一订单号",

notify_url: "服务器异步通知页面路径",

body: "标题",

remark: "备注",

validtime: "订单有效时间",

limit_pay: "no_credit",

randomstr: "随机字符串",

paytype: "A02",

signtype: "签名方式",

sign: "签名"

}

  • 支付宝小程序调起收银台小程序:

调用示例:

my.navigateToMiniProgram({

appId: '2021001104615521',

extraData: {

cusid: "平台分配的商户号",

appid: "平台分配的appid",

orgid: "平台分配的机构号",

version: "12",

trxamt: "1",

reqsn: "商户唯一订单号",

notify_url: "服务器异步通知页面路径",

body: "标题",

remark: "备注",

validtime: "订单有效时间",

limit_pay: "no_credit",

randomstr: "随机字符串",

paytype: "A02",

signtype: "签名方式"

sign: "签名"

}

})

  • 通过上述方法会调起收银台小程序,在收银台中完成支付后,会回调支付结果,具体结果可以在小程序生命周期onShow中通过以下方式获取:

onShow: function () {

let options = my.getEnterOptionsSync();

if (options.scene == '1038' &&

options.referrerInfo.appid=='2021001104615521') {

// 代表从收银台小程序返回

let extraData = options.referrerInfo.extraData;

if (extraData.code == 'success') {

// "支付成功";

} else if (extraData.code == 'cancel') {

// "支付已取消";

} else {

// "支付失败:" + extraData.errmsg;

}

}

},

  • 一般情况下getEnterOptionsSync()中获取的extraData为收银台小程序返回的支付结果,但是当通过物理返回键返回(即未通过收银台小程序内按钮返回),extraData内容会为空,调用方小程序会无法获得支付结果,该情况为支付宝小程序特性,小程序代码无法处理。如遇到该情况,需要自行添加标记位判断是否跳到收银台返回,再自行查询订单支付结果

 


2026年7月6日 15:02 收藏文档